| 297 ret = g_strdup_printf("Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", nc=\"%s\", response=\"%s\"\r\n", sip->username, auth->realm, auth->nonce, target, noncecount, response); |
297 ret = g_strdup_printf("Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", nc=\"%s\", response=\"%s\"\r\n", sip->username, auth->realm, auth->nonce, target, noncecount, response); |
| 298 g_free(response); |
298 g_free(response); |
| 299 return ret; |
299 return ret; |
| 300 } |
300 } |
| 301 |
301 |
| |
302 static char * parse_attribute(const char *attrname, char *source) { |
| |
303 char *tmp, *tmp2, *retval = NULL; |
| |
304 int len = strlen(attrname); |
| |
305 |
| |
306 if(!strncmp(source, attrname, len)) { |
| |
307 tmp = source + len; |
| |
308 tmp2 = g_strstr_len(tmp, strlen(tmp), "\""); |
| |
309 if(tmp2) |
| |
310 retval = g_strndup(tmp, tmp2 - tmp); |
| |
311 } |
| |
312 |
| |
313 return retval; |
| |
314 } |
| |
315 |
| 302 static void fill_auth(struct simple_account_data *sip, gchar *hdr, struct sip_auth *auth) { |
316 static void fill_auth(struct simple_account_data *sip, gchar *hdr, struct sip_auth *auth) { |
| 303 int i=0; |
317 int i=0; |
| 304 char *tmp; |
318 char *tmp; |
| 305 char *tmp2; |
|
| 306 gchar **parts; |
319 gchar **parts; |
| 307 if(!hdr) { |
320 if(!hdr) { |
| 308 gaim_debug_error("simple", "fill_auth: hdr==NULL\n"); |
321 gaim_debug_error("simple", "fill_auth: hdr==NULL\n"); |
| 309 return; |
322 return; |
| 310 } |
323 } |
| 313 gaim_debug_info("simple", "found NTLM\n"); |
326 gaim_debug_info("simple", "found NTLM\n"); |
| 314 auth->type = 2; |
327 auth->type = 2; |
| 315 if(!auth->nonce && !auth->nc) { |
328 if(!auth->nonce && !auth->nc) { |
| 316 parts = g_strsplit(hdr, " ", 0); |
329 parts = g_strsplit(hdr, " ", 0); |
| 317 while(parts[i]) { |
330 while(parts[i]) { |
| 318 if(!strncmp(parts[i],"targetname",10)) { |
331 if((tmp = parse_attribute("targetname=\"", |
| 319 auth->target = g_strndup(parts[i]+12,strlen(parts[i]+12)-1); |
332 parts[i]))) { |
| |
333 auth->target = tmp; |
| 320 } |
334 } |
| 321 if(!strncmp(parts[i],"realm",5)) { |
335 else if((tmp = parse_attribute("realm=\"", |
| 322 tmp = strstr(hdr, "realm="); |
336 parts[i]))) { |
| 323 tmp += 7; |
337 auth->realm = tmp; |
| 324 tmp2 = strchr(tmp, '"'); |
|
| 325 *tmp2 = 0; |
|
| 326 auth->realm = g_strdup(tmp); |
|
| 327 *tmp2 = '"'; |
|
| 328 } |
338 } |
| 329 i++; |
339 i++; |
| 330 } |
340 } |
| 331 g_strfreev(parts); |
341 g_strfreev(parts); |
| 332 parts = NULL; |
342 parts = NULL; |
| 340 } |
350 } |
| 341 |
351 |
| 342 auth->type = 1; |
352 auth->type = 1; |
| 343 parts = g_strsplit(hdr, " ", 0); |
353 parts = g_strsplit(hdr, " ", 0); |
| 344 while(parts[i]) { |
354 while(parts[i]) { |
| 345 if(!strncmp(parts[i], "nonce", 5)) { |
355 if((tmp = parse_attribute("nonce=\"", parts[i]))) { |
| 346 tmp = g_strstr_len(parts[i] + 7, |
356 auth->nonce = tmp; |
| 347 strlen(parts[i] + 7), "\""); |
357 } |
| 348 if (tmp) { |
358 else if((tmp = parse_attribute("realm=\"", parts[i]))) { |
| 349 auth->nonce = g_strndup(parts[i] + 7, |
359 auth->realm = tmp; |
| 350 tmp - (parts[i] + 7)); |
|
| 351 } |
|
| 352 } |
|
| 353 else if(!strncmp(parts[i], "realm", 5)) { |
|
| 354 tmp = g_strstr_len(parts[i] + 7, |
|
| 355 strlen(parts[i] + 7), "\""); |
|
| 356 if (tmp) { |
|
| 357 auth->realm = g_strndup(parts[i] + 7, |
|
| 358 tmp - (parts[i] + 7)); |
|
| 359 } |
|
| 360 } |
360 } |
| 361 i++; |
361 i++; |
| 362 } |
362 } |
| 363 g_strfreev(parts); |
363 g_strfreev(parts); |
| 364 |
364 |
| 1052 } else { |
1052 } else { |
| 1053 gaim_debug(GAIM_DEBUG_MISC, "simple", "received response to unknown transaction"); |
1053 gaim_debug(GAIM_DEBUG_MISC, "simple", "received response to unknown transaction"); |
| 1054 } |
1054 } |
| 1055 } |
1055 } |
| 1056 if(!found) { |
1056 if(!found) { |
| 1057 gaim_debug(GAIM_DEBUG_MISC, "simple", "received a unknown sip message with method %sand response %d\n",msg->method, msg->response); |
1057 gaim_debug(GAIM_DEBUG_MISC, "simple", "received a unknown sip message with method %s and response %d\n",msg->method, msg->response); |
| 1058 } |
1058 } |
| 1059 } |
1059 } |
| 1060 |
1060 |
| 1061 static void process_input(struct simple_account_data *sip, struct sip_connection *conn) |
1061 static void process_input(struct simple_account_data *sip, struct sip_connection *conn) |
| 1062 { |
1062 { |