Mercurial > pidgin
changeset 19781:6dcab2412c22
This is parts 1 and 2 of patch #2910 from Vladimir (thecrux) to improve NTLM proxy handling. Specifically, it specifies that we're using Unicode strings and uses the hostname of the local machine instead of incorrectly using the proxy server's hostname for authentication. References #2910.
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 13 Sep 2007 01:25:22 +0000 |
parents | 3023e0ba2fa6 |
children | f1bcba415a4b |
files | libpurple/ntlm.c libpurple/proxy.c |
diffstat | 2 files changed, 24 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/ntlm.c Wed Sep 12 20:32:09 2007 +0000 +++ b/libpurple/ntlm.c Thu Sep 13 01:25:22 2007 +0000 @@ -131,7 +131,7 @@ tmsg->protocol[6] = 'P'; tmsg->protocol[7] = '\0'; tmsg->type = 0x00000001; - tmsg->flags = 0x0000b202; + tmsg->flags = 0x0000b203; tmsg->dom_len1 = tmsg->dom_len2 = domainlen; tmsg->dom_off = sizeof(struct type1_message) + hostnamelen; tmsg->host_len1 = tmsg->host_len2 = hostnamelen; @@ -286,7 +286,7 @@ tmsg->sess_len1 = tmsg->sess_len2 = 0x0010; } - tmsg->flags = 0x00008200; + tmsg->flags = 0x00008201; tmp = (char *)tmsg + sizeof(struct type3_message);
--- a/libpurple/proxy.c Wed Sep 12 20:32:09 2007 +0000 +++ b/libpurple/proxy.c Thu Sep 13 01:25:22 2007 +0000 @@ -668,6 +668,16 @@ if (status == 407 /* Proxy Auth */) { gchar *ntlm; + char hostname[256]; + int ret; + + ret = gethostname(hostname, sizeof(hostname)); + hostname[sizeof(hostname) - 1] = '\0'; + if (ret < 0 || hostname[0] == '\0') { + purple_debug_warning("proxy", "gethostname() failed -- is your hostname set?"); + strcpy(hostname, "localhost"); + } + ntlm = g_strrstr((const gchar *)connect_data->read_buffer, "Proxy-Authenticate: NTLM "); if (ntlm != NULL) @@ -679,6 +689,7 @@ gchar *username; gchar *request; gchar *response; + username = strchr(domain, '\\'); if (username == NULL) { @@ -694,7 +705,7 @@ nonce = purple_ntlm_parse_type2(ntlm, NULL); response = purple_ntlm_gen_type3(username, (gchar*) purple_proxy_info_get_password(connect_data->gpi), - (gchar*) purple_proxy_info_get_host(connect_data->gpi), + hostname, domain, nonce, NULL); username--; *username = '\\'; @@ -745,9 +756,7 @@ sizeof(request) - request_len, "Proxy-Authorization: NTLM %s\r\n" "Proxy-Connection: Keep-Alive\r\n\r\n", - purple_ntlm_gen_type1( - (gchar*) purple_proxy_info_get_host(connect_data->gpi), - domain)); + purple_ntlm_gen_type1(hostname, domain)); *username = '\\'; purple_input_remove(connect_data->inpa); @@ -832,6 +841,14 @@ if (purple_proxy_info_get_username(connect_data->gpi) != NULL) { char *t1, *t2; + char hostname[256]; + + ret = gethostname(hostname, sizeof(hostname)); + hostname[sizeof(hostname) - 1] = '\0'; + if (ret < 0 || hostname[0] == '\0') { + purple_debug_warning("proxy", "gethostname() failed -- is your hostname set?"); + strcpy(hostname, "localhost"); + } t1 = g_strdup_printf("%s:%s", purple_proxy_info_get_username(connect_data->gpi), @@ -844,8 +861,7 @@ "Proxy-Authorization: Basic %s\r\n" "Proxy-Authorization: NTLM %s\r\n" "Proxy-Connection: Keep-Alive\r\n", - t2, purple_ntlm_gen_type1( - purple_proxy_info_get_host(connect_data->gpi), "")); + t2, purple_ntlm_gen_type1(hostname, "")); g_free(t2); }