changeset 686:98de2d166a11

Use the new IQ system for authentication
author Mikael Berthe <mikael@lilotux.net>
date Mon, 06 Feb 2006 21:06:19 +0100
parents f033345d1315
children 426145046b93
files mcabber/libjabber/jabber.h mcabber/libjabber/jconn.c mcabber/src/jab_iq.c mcabber/src/jab_priv.h mcabber/src/jabglue.c
diffstat 5 files changed, 79 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }