#include <ctype.h>
#include <string.h>
+#include <glib.h>
#ifdef USE_NTLM_AUTH
#include <stdlib.h>
SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (ntlm);
SoupNTLMConnection *conn;
const char *val;
+ SoupURI *uri;
conn = get_connection_for_msg (priv, msg);
if (!conn)
}
#endif
conn->state = SOUP_NTLM_RECEIVED_CHALLENGE;
- soup_auth_manager_emit_authenticate (SOUP_AUTH_MANAGER (ntlm), msg,
- conn->auth, FALSE);
+
+ uri = soup_message_get_uri (msg);
+ if (uri->password)
+ soup_auth_authenticate (conn->auth, uri->user, uri->password);
+ else {
+ soup_auth_manager_emit_authenticate (SOUP_AUTH_MANAGER (ntlm),
+ msg, conn->auth, FALSE);
+ }
done:
/* Remove the WWW-Authenticate headers so the session won't try
#define NTLM_CHALLENGE_DOMAIN_STRING_OFFSET 12
#define NTLM_RESPONSE_HEADER "NTLMSSP\x00\x03\x00\x00\x00"
-#define NTLM_RESPONSE_FLAGS 0x8202
+#define NTLM_RESPONSE_FLAGS 0x8201
typedef struct {
guchar header[12];
static char *
soup_ntlm_request (void)
{
- return g_strdup ("NTLM TlRMTVNTUAABAAAABoIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAA");
+ return g_strdup ("NTLM TlRMTVNTUAABAAAABYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAA");
}
static gboolean
return FALSE;
}
- *default_domain = g_strndup ((char *)chall + domain.offset, domain.length);
+ *default_domain = g_convert ((char *)chall + domain.offset,
+ domain.length, "UTF-8", "UCS-2LE",
+ NULL, NULL, NULL);
}
if (nonce) {
const char *host,
const char *domain)
{
- int hlen, dlen, ulen, offset;
+ int offset;
+ gsize hlen, dlen, ulen;
guchar hash[21], lm_resp[24], nt_resp[24];
+ char *user_conv, *host_conv, *domain_conv;
NTLMResponse resp;
char *out, *p;
int state, save;
offset = sizeof (resp);
- dlen = strlen (domain);
- ntlm_set_string (&resp.domain, &offset, dlen);
- ulen = strlen (user);
- ntlm_set_string (&resp.user, &offset, ulen);
if (!host)
host = "UNKNOWN";
- hlen = strlen (host);
+
+ domain_conv = g_convert (domain, -1, "UCS-2LE", "UTF-8", NULL, &dlen, NULL);
+ user_conv = g_convert (user, -1, "UCS-2LE", "UTF-8", NULL, &ulen, NULL);
+ host_conv = g_convert (host, -1, "UCS-2LE", "UTF-8", NULL, &hlen, NULL);
+
+ ntlm_set_string (&resp.domain, &offset, dlen);
+ ntlm_set_string (&resp.user, &offset, ulen);
ntlm_set_string (&resp.host, &offset, hlen);
ntlm_set_string (&resp.lm_resp, &offset, sizeof (lm_resp));
ntlm_set_string (&resp.nt_resp, &offset, sizeof (nt_resp));
p += g_base64_encode_step ((const guchar *) &resp, sizeof (resp),
FALSE, p, &state, &save);
- p += g_base64_encode_step ((const guchar *) domain, dlen,
+ p += g_base64_encode_step ((const guchar *) domain_conv, dlen,
FALSE, p, &state, &save);
- p += g_base64_encode_step ((const guchar *) user, ulen,
+ p += g_base64_encode_step ((const guchar *) user_conv, ulen,
FALSE, p, &state, &save);
- p += g_base64_encode_step ((const guchar *) host, hlen,
+ p += g_base64_encode_step ((const guchar *) host_conv, hlen,
FALSE, p, &state, &save);
p += g_base64_encode_step (lm_resp, sizeof (lm_resp),
FALSE, p, &state, &save);
p += g_base64_encode_close (FALSE, p, &state, &save);
*p = '\0';
+ g_free (domain_conv);
+ g_free (user_conv);
+ g_free (host_conv);
+
return out;
}
{
const char *cafile = NULL, *url;
SoupURI *proxy = NULL, *parsed;
- gboolean synchronous = FALSE;
+ gboolean synchronous = FALSE, ntlm = FALSE;
int opt;
g_type_init ();
method = SOUP_METHOD_GET;
- while ((opt = getopt (argc, argv, "c:dhp:qs")) != -1) {
+ while ((opt = getopt (argc, argv, "c:dhnp:qs")) != -1) {
switch (opt) {
case 'c':
cafile = optarg;
debug = TRUE;
break;
+ case 'n':
+ ntlm = TRUE;
+ break;
+
case 'p':
proxy = soup_uri_new (optarg);
if (!proxy) {
SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
SOUP_SESSION_USER_AGENT, "get ",
SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
+ SOUP_SESSION_USE_NTLM, ntlm,
NULL);
} else {
session = soup_session_async_new_with_options (
SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
SOUP_SESSION_USER_AGENT, "get ",
SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
+ SOUP_SESSION_USE_NTLM, ntlm,
NULL);
}