Author: ArcRiley
Date: 2009-03-04 22:47:40 -0500 (Wed, 04 Mar 2009)
New Revision: 1551

Modified:
   trunk/concordance/include/concordance.h
   trunk/concordance/include/concordance.sockets.h
   trunk/concordance/src/_core/step.c
   trunk/concordance/src/sockets/Client.c
Log:
SASL callback is working as before, but now from Python thread

Modified: trunk/concordance/include/concordance.h
===================================================================
--- trunk/concordance/include/concordance.h     2009-03-04 15:22:02 UTC (rev 
1550)
+++ trunk/concordance/include/concordance.h     2009-03-05 03:47:40 UTC (rev 
1551)
@@ -93,9 +93,15 @@
 } concordMsg_xmlReturn;
 
 typedef struct {
-  gint             type;                 /* type CONCORD_MT_SASLPASSWORD */
-  gpointer         data;
-} concordMsg_saslPassword;
+  gint             type;                 /* type CONCORD_MT_SASL */
+  Gsasl_session*   sctx;                 /* gsasl session */
+  gchar**          user;                 /* username when authenticated */
+  gint*            rset;                 /* 0=close, 1=reset */
+  GString*         inpt;                 /* gsasl challenge input */
+  PyObject*        self;                 /* self for callback method */
+  gpointer         data;                 /* pointer to session data */
+  GAsyncQueue*     retn;                 /* callback queue input */
+} concordMsg_sasl;
 
 
 enum concordMsgType {
@@ -105,7 +111,7 @@
   CONCORD_MT_XMLCHARDATA,           /* for _xmlCharData handler  */
   CONCORD_MT_XMLCLOSE,              /* last xml msg for a stanza */
   CONCORD_MT_XMLRETURN,             /* xml output for a session  */
-  CONCORD_MT_SASLPASSWORD,          /* for GSASL_PASSWORD handler */
+  CONCORD_MT_SASL,                  /* for gsasl challenges      */
 };
 
 #endif

Modified: trunk/concordance/include/concordance.sockets.h
===================================================================
--- trunk/concordance/include/concordance.sockets.h     2009-03-04 15:22:02 UTC 
(rev 1550)
+++ trunk/concordance/include/concordance.sockets.h     2009-03-05 03:47:40 UTC 
(rev 1551)
@@ -99,10 +99,10 @@
 
 enum socketsClient_State {
   CONCORD_E_CLOSE = 0,              /* close </stream>           */
+  CONCORD_E_RESET = 1,              /* pending stream reset      */
   CONCORD_E_OPEN,                   /* inside <stream>           */
   CONCORD_E_CLIENT,                 /* <iq> <message> <presence> */
   CONCORD_E_SASL,                   /* <auth> <response>         */
-  CONCORD_E_RESET,                  /* pending stream reset      */
 };
 
 #endif

Modified: trunk/concordance/src/_core/step.c
===================================================================
--- trunk/concordance/src/_core/step.c  2009-03-04 15:22:02 UTC (rev 1550)
+++ trunk/concordance/src/_core/step.c  2009-03-05 03:47:40 UTC (rev 1551)
@@ -203,6 +203,84 @@
       BREAKNULL
     }
     
+    case CONCORD_MT_SASL : {                                              /*\
+      cdef :                                                              \*/
+        concordMsg_sasl*       msg = (concordMsg_sasl*) pmsg;
+        concordMsg_xmlReturn*  ret;
+        gchar*                 element;
+        gchar*                 output = "";
+        gint                   status;
+
+      /* process gsasl step with base64 conversion
+      
+         int              gsasl_step64             (Gsasl_session *sctx,
+                                                    const char *b64input,
+                                                    char **b64output);
+      */
+      status = gsasl_step64(msg->sctx, msg->inpt->str, &output);
+
+
+      switch (status) {
+        case GSASL_OK : {
+          element = "success";
+          *msg->user = g_strdup(gsasl_property_get(msg->sctx, GSASL_AUTHID));
+          *msg->rset = 1;
+          break;
+        }
+        case GSASL_NEEDS_MORE : {
+          element = "challenge";
+          break;
+        }
+        case GSASL_UNKNOWN_MECHANISM : {
+          element = "failure";
+          output = "<invalid-mechanism/>";
+          break;
+        }
+        case GSASL_BASE64_ERROR : {
+          element = "failure";
+          output = "<incorrect-encoding/>";
+          break;
+        }
+        case GSASL_AUTHENTICATION_ERROR : {
+          element = "failure";
+          output = "<not-authorized/>";
+          break;
+        }
+        default : {
+          element = "failure";
+          output = "<temporary-auth-failure/>";
+          break;
+        }
+      }
+
+      /* build return message */
+      ret = (concordMsg_xmlReturn*) g_malloc(sizeof(concordMsg_xmlReturn));
+      ret->type = CONCORD_MT_XMLRETURN;
+      ret->data = msg->data;
+      ret->mesg = g_string_new("");
+
+      /* switch how output is generated based on whether element is populated 
*/
+      if (output[0] == 0) {
+        g_string_printf(ret->mesg,
+                        "<%s xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>",
+                        element);
+      }
+      else {
+        g_string_printf(ret->mesg,
+                        "<%s xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>%s</%s>",
+                        element, output, element);
+      }
+
+      /* push return message onto return queue */
+      g_async_queue_push(msg->retn, ret);
+
+      /* free sasl output before returning */
+      if (status == GSASL_OK || status == GSASL_NEEDS_MORE)
+        g_free(output);
+
+      break;
+    }
+
     default :
       PyErr_SetString(PyExc_LookupError, "unknown message type");
       BREAKNULL
@@ -237,12 +315,20 @@
       g_free(msg);
       break;
     }
-    
+
+    case CONCORD_MT_SASL : {                                              /*\
+      cdef :                                                              \*/
+        concordMsg_sasl* msg = (concordMsg_sasl*) pmsg;
+      g_string_free(msg->inpt, TRUE);
+      g_free(pmsg);
+      break;
+    }
+        
     default :
       g_free(pmsg);
       break;
   }
-  
+ 
   /* return either NULL or None depending on BREAKNULL or break; */
   if (err)
     return NULL;

Modified: trunk/concordance/src/sockets/Client.c
===================================================================
--- trunk/concordance/src/sockets/Client.c      2009-03-04 15:22:02 UTC (rev 
1550)
+++ trunk/concordance/src/sockets/Client.c      2009-03-05 03:47:40 UTC (rev 
1551)
@@ -34,20 +34,6 @@
   #
   ###########################################################################
   #
-  # Python Callbacks (defaults)
-  #                                                                        */
-  static PyObject*
-  _pySASL(PyObject* s) {                                                  /*\
-    cdef :                                                                \*/
-      socketsClient_Object*      self = (socketsClient_Object*) s;
-
-    return NULL;
-  }
-  
-  /*
-  #
-  ###########################################################################
-  #
   # GIOChannel Callbacks
   #                                                                        */
 
@@ -190,6 +176,22 @@
       */
       status = g_io_channel_read_chars(channel, buff, 4096, &buff_len, NULL);
       if (status == G_IO_STATUS_NORMAL && buff_len > 0) {
+        /* before parsing, reset connection if it needs to be */
+        if (session->state == CONCORD_E_RESET) {
+          /* reset XML parser and stream state
+      
+              XML_Bool XML_ParserReset          (XML_Parser p,
+                                                const XML_Char *encoding);
+          */
+          XML_Parse(session->pars, NULL, 0, TRUE);
+          XML_ParserReset(session->pars, NULL);
+          XML_SetUserData(session->pars, session);
+          XML_SetElementHandler(session->pars, _xmlStart, _xmlEnd);
+          XML_SetCharacterDataHandler(session->pars, _xmlCharData);
+          session->depth = 0;
+          session->state = CONCORD_E_OPEN;
+        }
+
         /* parse XML data
 
            XML_Parse will execute the appropriate callback(s) found in the
@@ -199,20 +201,6 @@
         */
         if (XML_Parse(session->pars, buff, buff_len, FALSE) &&
             session->state) {
-          if (session->state == CONCORD_E_RESET) {
-            /* reset XML parser and stream state
-        
-               XML_Bool XML_ParserReset          (XML_Parser p,
-                                                  const XML_Char *encoding);
-            */
-            XML_Parse(session->pars, NULL, 0, TRUE);
-            XML_ParserReset(session->pars, NULL);
-            XML_SetUserData(session->pars, session);
-            XML_SetElementHandler(session->pars, _xmlStart, _xmlEnd);
-            XML_SetCharacterDataHandler(session->pars, _xmlCharData);
-            session->depth = 0;
-            session->state = CONCORD_E_OPEN;
-          }
           /* return true so GMainLoop will continue watching this channel */
           return TRUE;
         }
@@ -623,79 +611,6 @@
     g_string_free(buff, TRUE);
   }
 
-
-  static void
-  _reply_sasl(socketsClient_Data* session) {                              /*\
-    cdef :                                                                \*/
-      GString* buff;
-      gchar*   element;
-      gchar*   output = "";
-      gint     status;
-
-    /* process gsasl step with base64 conversion
-    
-       int              gsasl_step64             (Gsasl_session *sctx,
-                                                  const char *b64input,
-                                                  char **b64output);
-    */
-    status = gsasl_step64(session->sctx, session->ebuff->str, &output);
-
-    buff = g_string_new("");
-
-    switch (status) {
-      case GSASL_OK : {
-        element = "success";
-        session->user = g_strdup(gsasl_property_get(session->sctx,
-                                                    GSASL_AUTHID));
-        session->state = CONCORD_E_RESET;
-        break;
-      }
-      case GSASL_NEEDS_MORE : {
-        element = "challenge";
-        break;
-      }
-      case GSASL_UNKNOWN_MECHANISM : {
-        element = "failure";
-        output = "<invalid-mechanism/>";
-        break;
-      }
-      case GSASL_BASE64_ERROR : {
-        element = "failure";
-        output = "<incorrect-encoding/>";
-        break;
-      }
-      case GSASL_AUTHENTICATION_ERROR : {
-        element = "failure";
-        output = "<not-authorized/>";
-        break;
-      }
-      default : {
-        element = "failure";
-        output = "<temporary-auth-failure/>";
-        break;
-      }
-    }
-
-    /* switch how output is generated based on whether element is populated */
-    if (output[0] == 0) {
-      g_string_printf(buff,
-                      "<%s xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>",
-                      element);
-    }
-    else {
-      g_string_printf(buff,
-                      "<%s xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>%s</%s>",
-                      element, output, element);
-    }
-    _gioSend(session, buff->str, buff->len);
-
-    /* free buffer and sasl output before returning */
-    g_string_free(buff, TRUE);
-    if (status == GSASL_OK || status == GSASL_NEEDS_MORE) {
-      g_free(output);
-    }
-  }
-  
   /*
   #
   ###########################################################################
@@ -884,6 +799,7 @@
       gint                  i;
       concordMsg_xmlEnd*    pmsge;
       concordMsg_xmlClose*  pmsgc;
+      concordMsg_sasl*      pmsgs;
 
     /* decrease XML depth */
     session->depth--;
@@ -925,7 +841,22 @@
             break;
           }
           case CONCORD_E_SASL : {
-            _reply_sasl(session);
+            /* create _sasl message */
+            pmsgs = (concordMsg_sasl*) g_malloc(sizeof(concordMsg_sasl));
+            pmsgs->type = CONCORD_MT_SASL;
+            pmsgs->sctx = session->sctx;
+            pmsgs->user = &session->user;
+            pmsgs->rset = &session->state;
+            pmsgs->inpt = session->ebuff;
+            pmsgs->self = session->srvc;
+            pmsgs->data = session;
+            pmsgs->retn = self->queueRetn;
+
+            /* push message onto queue */
+            g_async_queue_push(self->queueCall, pmsgs);
+            
+            /* create a new ebuff since we just handed our last to Python */
+            session->ebuff = g_string_new("");
             break;
           }
         }
@@ -960,7 +891,7 @@
        void             g_strfreev               (gchar **str_array);
     */
     g_strfreev(element);
-  }
+  } 
 
 
   static void
@@ -985,7 +916,7 @@
       return;
     }
 
-    /* append character data to element buffer
+    /* everything else - append character data to element buffer
 
        GString*         g_string_append_len      (GString *string,
                                                   const gchar *val,

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to