--- 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
--- 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
--- 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;
--- 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__ */
--- 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;
}