# HG changeset patch # User Eric Warmenhoven # Date 1007030532 0 # Node ID f4f9e5a018900d96aa5946c6eecb459835f112ff # Parent bda5b89ba2f9aabd52e02efb4203e4dedd2e93fc [gaim-migrate @ 2827] jabber can do digest authentication now. isn't that spectacular. committer: Tailor Script diff -r bda5b89ba2f9 -r f4f9e5a01890 ChangeLog --- a/ChangeLog Thu Nov 29 08:39:55 2001 +0000 +++ b/ChangeLog Thu Nov 29 10:42:12 2001 +0000 @@ -7,6 +7,8 @@ * Updated Korean translation (thanks Ho-seok Lee, also for resized ICQ icons) * Updated Dutch translation (thanks Floris Eshuis) + * Yahoo updates (thanks Brian Macke) + * Jabber updates * Zephyr updates (thanks Arun A Tharuvai) * Gadu-Gadu updates (thanks Arkadiusz Miskiewicz) * Option to show aliases in conversation tabs diff -r bda5b89ba2f9 -r f4f9e5a01890 src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Thu Nov 29 08:39:55 2001 +0000 +++ b/src/protocols/jabber/jabber.c Thu Nov 29 10:42:12 2001 +0000 @@ -284,6 +284,29 @@ xmlnode_free(x); } +static void gjab_reqauth(gjconn j) +{ + xmlnode x, y, z; + char *user; + + if (!j) + return; + + x = jutil_iqnew(JPACKET__GET, NS_AUTH); + xmlnode_put_attrib(x, "id", IQID_AUTH); + y = xmlnode_get_tag(x, "query"); + + user = j->user->user; + + if (user) { + z = xmlnode_insert_tag(y, "username"); + xmlnode_insert_cdata(z, user, -1); + } + + gjab_send(j, x); + xmlnode_free(x); +} + static void gjab_auth(gjconn j) { xmlnode x, y, z; @@ -307,6 +330,7 @@ xmlnode_insert_cdata(z, j->user->resource, -1); if (j->sid) { + debug_printf("digest authentication (sid %s)\n", j->sid); z = xmlnode_insert_tag(y, "digest"); hash = pmalloc(x->p, strlen(j->sid) + strlen(j->pass) + 1); strcpy(hash, j->sid); @@ -361,7 +385,7 @@ if (strcmp(name, "stream:stream") == 0) { /* special case: name == stream:stream */ /* id attrib of stream is stored for digest auth */ - j->sid = xmlnode_get_attrib(x, "id"); + j->sid = g_strdup(xmlnode_get_attrib(x, "id")); /* STATE_EVT(JCONN_STATE_AUTH) */ xmlnode_free(x); } else { @@ -929,7 +953,8 @@ xmlnode_free(x); } -static void jabber_handlevcard(gjconn j, xmlnode querynode, char *from) { +static void jabber_handlevcard(gjconn j, xmlnode querynode, char *from) +{ struct gaim_connection *gc = GJ_GC(j); char buf[1024]; char *fn, *url, *email, *nickname, *status, *desc; @@ -972,17 +997,27 @@ static void jabber_handleauthresp(gjconn j, jpacket p) { if (jpacket_subtype(p) == JPACKET__RESULT) { - debug_printf("auth success\n"); - - account_online(GJ_GC(j)); - serv_finish_login(GJ_GC(j)); + if (xmlnode_has_children(p->x)) { + xmlnode query = xmlnode_get_tag(p->x, "query"); + set_login_progress(GJ_GC(j), 4, "Authenticating"); + if (!xmlnode_get_tag(query, "digest")) { + g_free(j->sid); + j->sid = NULL; + } + gjab_auth(j); + } else { + debug_printf("auth success\n"); - if (bud_list_cache_exists(GJ_GC(j))) - do_import(GJ_GC(j), NULL); + account_online(GJ_GC(j)); + serv_finish_login(GJ_GC(j)); - ((struct jabber_data *)GJ_GC(j)->proto_data)->did_import = TRUE; + if (bud_list_cache_exists(GJ_GC(j))) + do_import(GJ_GC(j), NULL); - gjab_reqroster(j); + ((struct jabber_data *)GJ_GC(j)->proto_data)->did_import = TRUE; + + gjab_reqroster(j); + } } else { xmlnode xerr; char *errmsg = NULL; @@ -1088,6 +1123,7 @@ static void jabber_handlepacket(gjconn j, jpacket p) { + char *id; switch (p->type) { case JPACKET_MESSAGE: jabber_handlemessage(j, p); @@ -1098,16 +1134,16 @@ case JPACKET_IQ: debug_printf("jpacket_subtype: %d\n", jpacket_subtype(p)); - if (xmlnode_get_attrib(p->x, "id") && (strcmp(xmlnode_get_attrib(p->x, "id"), IQID_AUTH) == 0)) { + if (((id = xmlnode_get_attrib(p->x, "id")) != NULL) && !strcmp(id, IQID_AUTH)) { jabber_handleauthresp(j, p); - break; /* I'm not sure if you like this style, Eric. */ + break; } if (jpacket_subtype(p) == JPACKET__SET) { } else if (jpacket_subtype(p) == JPACKET__GET) { xmlnode querynode; querynode = xmlnode_get_tag(p->x, "query"); - if(NSCHECK(querynode, NS_VERSION)) { + if (NSCHECK(querynode, NS_VERSION)) { jabber_handleversion(j, p->x); } else if (NSCHECK(querynode, NS_TIME)) { jabber_handletime(j, p->x); @@ -1176,11 +1212,11 @@ signoff(GJ_GC(j)); break; case JCONN_STATE_CONNECTED: - set_login_progress(GJ_GC(j), 3, "Connected"); + set_login_progress(GJ_GC(j), 2, "Connected"); break; case JCONN_STATE_ON: - set_login_progress(GJ_GC(j), 5, "Logging in..."); - gjab_auth(j); + set_login_progress(GJ_GC(j), 3, "Requesting Authentication Method"); + gjab_reqauth(j); break; default: debug_printf("state change: %d\n", state); @@ -1234,6 +1270,7 @@ close(jd->jc->fd); g_timeout_add(50, jabber_free, jd->jc); xmlnode_free(jd->jc->current); + g_free(jd->jc->sid); jd->jc = NULL; g_free(jd); gc->proto_data = NULL;