# HG changeset patch # User Mikael Berthe # Date 1139256379 -3600 # Node ID 98de2d166a11a65ffd6e992498c8b352c417935e # Parent f033345d1315159dbaf585f3a7831817e7f74671 Use the new IQ system for authentication diff -r f033345d1315 -r 98de2d166a11 mcabber/libjabber/jabber.h --- a/mcabber/libjabber/jabber.h Mon Feb 06 20:04:58 2006 +0100 +++ b/mcabber/libjabber/jabber.h Mon Feb 06 21:06:19 2006 +0100 @@ -384,6 +384,7 @@ void jab_poll(jconn j, int timeout); char *jab_auth(jconn j); +int jab_auth_mcabber(jconn j, xmlnode x); char *jab_reg(jconn j); #ifdef __cplusplus diff -r f033345d1315 -r 98de2d166a11 mcabber/libjabber/jconn.c --- a/mcabber/libjabber/jconn.c Mon Feb 06 20:04:58 2006 +0100 +++ b/mcabber/libjabber/jconn.c Mon Feb 06 21:06:19 2006 +0100 @@ -432,6 +432,53 @@ } /* + * jab_auth_mcabber -- authorize user + * + * parameters + * j -- connection + * x -- xmlnode iq packet + * + * returns + * non-zero in case of failure + */ +int jab_auth_mcabber(jconn j, xmlnode x) +{ + xmlnode y,z; + char *hash, *user; + + if(!j) return -1; + + y = xmlnode_get_tag(x, "query"); + + user = j->user->user; + + if (user) + { + z = xmlnode_insert_tag(y, "username"); + xmlnode_insert_cdata(z, user, -1); + } + + z = xmlnode_insert_tag(y, "resource"); + xmlnode_insert_cdata(z, j->user->resource, -1); + + if (j->sid) + { + z = xmlnode_insert_tag(y, "digest"); + hash = pmalloc(x->p, strlen(j->sid)+strlen(j->pass)+1); + strcpy(hash, j->sid); + strcat(hash, j->pass); + hash = shahash(hash); + xmlnode_insert_cdata(z, hash, 40); + } + else + { + z = xmlnode_insert_tag(y, "password"); + xmlnode_insert_cdata(z, j->pass, -1); + } + return 0; +} + +/* * jab_reg -- register user * * parameters diff -r f033345d1315 -r 98de2d166a11 mcabber/src/jab_iq.c --- a/mcabber/src/jab_iq.c Mon Feb 06 20:04:58 2006 +0100 +++ b/mcabber/src/jab_iq.c Mon Feb 06 21:06:19 2006 +0100 @@ -33,8 +33,6 @@ #include "settings.h" -int s_id; // XXX - static GSList *iqs_list; @@ -230,6 +228,28 @@ scr_ShowBuddyWindow(); } +void iqscallback_auth(iqs *iqp, xmlnode xml_result) +{ + if (jstate == STATE_GETAUTH) { + iqs *iqn; + + if (xml_result) { + xmlnode x = xmlnode_get_tag(xml_result, "query"); + if (x && !xmlnode_get_tag(x, "digest")) + jc->sid = 0; + } + + iqn = iqs_new(JPACKET__SET, NS_AUTH, "auth", IQS_DEFAULT_TIMEOUT); + iqn->callback = &iqscallback_auth; + jab_auth_mcabber(jc, iqn->xmldata); + jab_send(jc, iqn->xmldata); + jstate = STATE_SENDAUTH; + } else if (jstate == STATE_SENDAUTH) { + request_roster(); + jstate = STATE_LOGGED; + } +} + static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) { xmlnode x; @@ -242,22 +262,6 @@ return; } - if (atoi(id) == s_id) { // Authentication XXX - if (jstate == STATE_GETAUTH) { - if ((x = xmlnode_get_tag(xmldata, "query")) != NULL) - if (!xmlnode_get_tag(x, "digest")) { - jc->sid = 0; - } - - s_id = atoi(jab_auth(jc)); - jstate = STATE_SENDAUTH; - } else if (jstate == STATE_SENDAUTH) { - request_roster(); - jstate = STATE_LOGGED; - } - return; - } - if (!iqs_callback(id, xmldata)) return; diff -r f033345d1315 -r 98de2d166a11 mcabber/src/jab_priv.h --- a/mcabber/src/jab_priv.h Mon Feb 06 20:04:58 2006 +0100 +++ b/mcabber/src/jab_priv.h Mon Feb 06 21:06:19 2006 +0100 @@ -35,7 +35,6 @@ extern enum enum_jstate jstate; -extern int s_id; char *jidtodisp(const char *jid); @@ -45,6 +44,7 @@ int iqs_del(const char *iqid); int iqs_callback(const char *iqid, xmlnode xml_anwser); void iqs_check_timeout(void); +void iqscallback_auth(iqs *iqp, xmlnode xml_result); #endif /* __JAB_PRIV_H__ */ diff -r f033345d1315 -r 98de2d166a11 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Mon Feb 06 20:04:58 2006 +0100 +++ b/mcabber/src/jabglue.c Mon Feb 06 21:06:19 2006 +0100 @@ -109,7 +109,6 @@ utf8_jid = to_utf8(jid); if (!utf8_jid) return jc; - s_id = 1; jc = jab_new(utf8_jid, (char*)pass, (char*)server, port, ssl); g_free(utf8_jid); @@ -171,9 +170,6 @@ void jb_main() { - xmlnode x, z; - char *cid; - if (!online) { safe_usleep(10000); return; @@ -189,15 +185,16 @@ if (jstate == STATE_CONNECTING) { if (jc) { - x = jutil_iqnew(JPACKET__GET, NS_AUTH); - cid = jab_getid(jc); - xmlnode_put_attrib(x, "id", cid); - // id = atoi(cid); + iqs *iqn; + xmlnode z; - z = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "username"); + iqn = iqs_new(JPACKET__GET, NS_AUTH, "auth", IQS_DEFAULT_TIMEOUT); + iqn->callback = &iqscallback_auth; + + z = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), + "username"); xmlnode_insert_cdata(z, jc->user->user, (unsigned) -1); - jab_send(jc, x); - xmlnode_free(x); + jab_send(jc, iqn->xmldata); jstate = STATE_GETAUTH; }