Author: ArcRiley
Date: 2009-03-05 13:31:19 -0500 (Thu, 05 Mar 2009)
New Revision: 1552

Modified:
   trunk/concordance/examples/register.py
   trunk/concordance/include/concordance.h
   trunk/concordance/include/concordance.sockets.h
   trunk/concordance/src/_core/__init__.c
   trunk/concordance/src/_core/step.c
   trunk/concordance/src/sockets/Client.c
   trunk/concordance/src/sockets/Socket.c
   trunk/concordance/src/sockets/__init__.c
Log:
Python SASL handlers now working, register.py updated

Modified: trunk/concordance/examples/register.py
===================================================================
--- trunk/concordance/examples/register.py      2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/examples/register.py      2009-03-05 18:31:19 UTC (rev 
1552)
@@ -31,13 +31,12 @@
 
 #All the Users are stored in a Dictionary/Hash(in-memory) in a session
 #they are NOT (de)serialized
-UserDB = {}
 
 class User(object):
   '''
     Class to store the User information
   '''
-  def __init__(self,username, email, fname, lname, pwd):
+  def __init__(self, username, email, fname, lname, pwd):
     self.username = username
     self.email = email
     self.fname = fname
@@ -45,6 +44,8 @@
     self.pwd = pwd
     #Mothers Maiden Name can also be added
 
+UserDB = {'foo': User('foo', 'f...@bar.com', 'Foo', 'Bar', 'test')}
+
 class InBandRegistration(concordance.services.Service) :
   def createNode(self, parent_node,tag_name, tag_val):
     '''
@@ -105,7 +106,7 @@
             #Checks whether the user has already registered or not 
             #this is done by a lookup for username in the UserDB dict
             if r.text in UserDB:
-              self.createNode(out_query,'username',r.text)
+              self.createNode(out_query, 'username', r.text)
               error_code = 1 #set to 1 for USER_CONFLICT
               print("User already Registered")
           else:
@@ -268,7 +269,6 @@
         self.regScreen(query, out_root)
     elif in_root.attrib['type'] == 'set':
        self.validateRegistration(in_root, out_root)        
-       print("New Client - Chck User")
     else :
       return ""
 
@@ -276,6 +276,12 @@
     print('> %s' % ElementTree.tostring(out_root))
     return ElementTree.tostring(out_root)
 
+  def sasl_password(self, authid, authzid) :
+    if authid in UserDB :
+      print("%s found, password: %s" % (authid, UserDB[authid].pwd))
+      return UserDB[authid].pwd
+    print("%s not found" % authid)
+    return ''
 
 client = concordance.sockets.Client()
 client[host] = InBandRegistration(host)

Modified: trunk/concordance/include/concordance.h
===================================================================
--- trunk/concordance/include/concordance.h     2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/include/concordance.h     2009-03-05 18:31:19 UTC (rev 
1552)
@@ -44,6 +44,7 @@
 
 typedef struct {
   GMainContext*    context;              /* Concordance's Glib context */
+  Gsasl*           saslCntx;             /* Concordance's gSASL context */
   GMainLoop*       mainloop;             /* Concordance's Glib mainloop */
   GThread*         threadid;             /* thread ID for mainloop thread */
   GAsyncQueue*     queueCall;            /* callback queue input */

Modified: trunk/concordance/include/concordance.sockets.h
===================================================================
--- trunk/concordance/include/concordance.sockets.h     2009-03-05 03:47:40 UTC 
(rev 1551)
+++ trunk/concordance/include/concordance.sockets.h     2009-03-05 18:31:19 UTC 
(rev 1552)
@@ -24,11 +24,6 @@
 
 #include "concordance.h"
 
-typedef struct {
-  PyObject*             _core;
-  Gsasl*                saslCntx;
-} sockets_State;
-
 /* concordance.sockets.Socket definition */
 typedef struct {
   PyTypeObject          base;

Modified: trunk/concordance/src/_core/__init__.c
===================================================================
--- trunk/concordance/src/_core/__init__.c      2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/src/_core/__init__.c      2009-03-05 18:31:19 UTC (rev 
1552)
@@ -21,6 +21,12 @@
 
 #include "concordance._core.h"
 
+/*
+#
+#############################################################################
+#
+# GMainLoop Thread
+#                                                                          */
 static gpointer
 _core_loop(gpointer n) {
   /* create and run the GMainLoop, terminates thread on g_main_loop_quit()
@@ -36,7 +42,112 @@
   return NULL;
 }
 
+/*
+#
+#############################################################################
+#
+# Global Callbacks
+#                                                                          */
+static int
+_saslCallback(Gsasl* ctx, Gsasl_session* sctx, Gsasl_property prop) {   /*\
+  cdef :                                                                \*/
+    concordMsg_sasl*    msg;
+    gint                boo = 0;
+    gchar*              met;
+    gchar*              val;
+    PyObject*           out;
 
+  /* get session data
+
+     void*              gsasl_session_hook_get   (Gsasl_session * sctx);
+  */
+  msg = (concordMsg_sasl*) gsasl_session_hook_get(sctx);
+
+  switch (prop) {
+    case GSASL_PASSWORD :
+      met = "sasl_password";  Py_DECREF(out);
+      if (!PyObject_HasAttrString(msg->self, met))
+        return GSASL_NO_CALLBACK;
+      out = PyEval_CallMethod(msg->self, met, "(UU)",
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHID),
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHZID));
+      break;
+    case GSASL_DIGEST_MD5_HASHED_PASSWORD :
+      met = "sasl_password_md5";
+      if (!PyObject_HasAttrString(msg->self, met))
+        return GSASL_NO_CALLBACK;
+      out = PyEval_CallMethod(msg->self, met, "(UU)",
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHID),
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHZID));
+      break;
+    case GSASL_VALIDATE_SIMPLE :
+      boo = 1;
+      met = "sasl_validate_simple";
+      if (!PyObject_HasAttrString(msg->self, met))
+        return GSASL_NO_CALLBACK;
+      out = PyEval_CallMethod(msg->self, met, "(UUU)",
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHID),
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHZID),
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_PASSWORD));
+      break;
+    case GSASL_VALIDATE_EXTERNAL :
+      boo = 1;
+      met = "sasl_validate_external";
+      if (!PyObject_HasAttrString(msg->self, met))
+        return GSASL_NO_CALLBACK;
+      out = PyEval_CallMethod(msg->self, met, "(U)",
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_AUTHID));
+      break;
+    case GSASL_VALIDATE_ANONYMOUS :
+      boo = 1;
+      met = "sasl_validate_anonymous";
+      if (!PyObject_HasAttrString(msg->self, met))
+        return GSASL_NO_CALLBACK;
+      out = PyEval_CallMethod(msg->self, met, "(U)",
+                              gsasl_property_get(msg->sctx,
+                                                 GSASL_ANONYMOUS_TOKEN));
+      break;
+    default :
+      return GSASL_NO_CALLBACK;
+  }
+
+  /* check for exception from sasl handler */
+  if (!out)
+    return GSASL_NO_SERVER_CODE;
+
+  /* for validation handlers, check for True or False */
+  if (boo) {
+    if (PyObject_IsTrue(out)) {
+      Py_DECREF(out);
+      return GSASL_OK;                 // True:  authenticated
+    }
+    Py_DECREF(out);
+    return GSASL_AUTHENTICATION_ERROR; // False: authentication failed
+  }
+
+  /* set parameter if unicode was returned */
+  if (!PyUnicode_Check(out)) {
+    Py_DECREF(out);
+    val = g_strdup_printf("expected string from %s handler", met);
+    PyErr_SetString(PyExc_TypeError, met);
+    g_free(val);
+    return GSASL_NO_SERVER_CODE;
+  }
+  val = concordPyUnicodeToUTF8(out);
+  gsasl_property_set(msg->sctx, prop, val);
+  Py_DECREF(out);
+  g_free(val);
+  return GSASL_OK;
+}
+
 static PyMethodDef concord_Methods[] = {
   { "step", concordStep, METH_VARARGS, NULL },
   { NULL, NULL }
@@ -111,6 +222,21 @@
   */
   globals->context = g_main_context_new();
 
+  /* initialize gsasl context
+
+     int                gsasl_init               (Gsasl** ctx)
+     Return value: GSASL_OK if successful, otherwise GSASL_MALLOC_ERROR.
+
+     void               gsasl_callback_set       (Gsasl * ctx,
+                                                  Gsasl_callback_function cb);
+  */
+  if (gsasl_init(&globals->saslCntx) != GSASL_OK) {
+    PyErr_SetString(PyExc_MemoryError, "out of memory on gsasl_init");
+    /* need to free stuff */
+    return NULL;
+  }
+  gsasl_callback_set(globals->saslCntx, _saslCallback);
+
   /* create global callback queue
 
      GAsyncQueue*       g_async_queue_new        (void);

Modified: trunk/concordance/src/_core/step.c
===================================================================
--- trunk/concordance/src/_core/step.c  2009-03-05 03:47:40 UTC (rev 1551)
+++ trunk/concordance/src/_core/step.c  2009-03-05 18:31:19 UTC (rev 1552)
@@ -211,6 +211,14 @@
         gchar*                 output = "";
         gint                   status;
 
+
+      /* set callback hook to current message
+      
+         void           gsasl_session_hook_set   (Gsasl_session * sctx,
+                                                  void * hook);
+      */
+      gsasl_session_hook_set(msg->sctx, (gpointer) msg);
+
       /* process gsasl step with base64 conversion
       
          int              gsasl_step64             (Gsasl_session *sctx,
@@ -219,7 +227,10 @@
       */
       status = gsasl_step64(msg->sctx, msg->inpt->str, &output);
 
-
+      /* break here if Python callback raised an exception */ 
+      if (status == GSASL_NO_SERVER_CODE)
+        BREAKNULL
+      
       switch (status) {
         case GSASL_OK : {
           element = "success";

Modified: trunk/concordance/src/sockets/Client.c
===================================================================
--- trunk/concordance/src/sockets/Client.c      2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/src/sockets/Client.c      2009-03-05 18:31:19 UTC (rev 
1552)
@@ -324,39 +324,6 @@
   #
   ###########################################################################
   #
-  # GNU SASL Callback
-  #                                                                        */
-  static int
-  _saslCallback(Gsasl* ctx, Gsasl_session* sctx, Gsasl_property prop) {   /*\
-    cdef :                                                                \*/
-      socketsClient_Data* session;
-      gint                ret;
-
-    /* get session data
-
-       void*            gsasl_session_hook_get   (Gsasl_session * sctx);
-    */
-    session = (socketsClient_Data*) gsasl_session_hook_get(sctx);
-
-    switch (prop) {
-      case GSASL_PASSWORD : {
-        gsasl_property_set(sctx, GSASL_PASSWORD, "tester");
-        ret = GSASL_OK;
-        break;
-      }
-      default : {
-        ret = GSASL_NO_CALLBACK;
-        break;
-      }
-    }
-
-    return ret;
-  }
-
-  /*
-  #
-  ###########################################################################
-  #
   # Queue Source Callbacks
   #                                                                        */
   typedef struct {
@@ -487,8 +454,7 @@
                                                   gconstpointer key);
     */
     if (to) {
-      session->srvc = (servicesService_Object*)
-                      g_hash_table_lookup(self->domains, to);
+      session->srvc = (PyObject*) g_hash_table_lookup(self->domains, to);
       if (session->srvc) {
         from = ((servicesService_Object*) session->srvc)->domain;
       }
@@ -726,18 +692,16 @@
                int      gsasl_server_start       (Gsasl* ctx,
                                                   const char* mech,
                                                   Gsasl_session** sctx);
-               void     gsasl_session_hook_set   (Gsasl_session * sctx,
-                                                  void * hook);
-               void     gsasl_callback_set       (Gsasl * ctx,
-                                                  Gsasl_callback_function cb);
                void     gsasl_property_set       (Gsasl_session *sctx,
                                                   Gsasl_property prop,
                                                   const char *data);
             */
             gsasl_server_start(self->saslCntx, mec, &session->sctx);
-            gsasl_session_hook_set(session->sctx, (gpointer) session);
-            gsasl_callback_set(self->saslCntx, _saslCallback);
-            gsasl_property_set(session->sctx, GSASL_REALM, 
"selket.apogean.org");
+            if (session->srvc) {
+              gsasl_property_set(session->sctx, GSASL_REALM, 
+                                 ((servicesService_Object*)
+                                  session->srvc)->domain);
+            }
             session->state = CONCORD_E_SASL;
           }
 

Modified: trunk/concordance/src/sockets/Socket.c
===================================================================
--- trunk/concordance/src/sockets/Socket.c      2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/src/sockets/Socket.c      2009-03-05 18:31:19 UTC (rev 
1552)
@@ -246,7 +246,7 @@
   _new(PyTypeObject* type, PyObject* args, PyObject* kwds) {              /*\
     cdef :                                                                \*/
       socketsSocket_Object*      self;
-      sockets_State*             state;
+      PyObject*                  _core;
   
     /* this is lowest level, just alloc */
     self = (socketsSocket_Object*) type->tp_alloc(type, 0);
@@ -281,12 +281,13 @@
 
        void*            PyModule_GetState        (PyObject*);
     */
-    state = (sockets_State*) PyModule_GetState(self->module);
+    _core = *(PyObject**) PyModule_GetState(self->module);
     self->context = ((concordGlobals*)
-                     PyModule_GetState(state->_core))->context;
-    self->saslCntx = state->saslCntx;
+                     PyModule_GetState(_core))->context;
+    self->saslCntx = ((concordGlobals*)
+                     PyModule_GetState(_core))->saslCntx;
     self->queueCall = ((concordGlobals*)
-                       PyModule_GetState(state->_core))->queueCall;
+                       PyModule_GetState(_core))->queueCall;
 
     /* create callback return queue
 

Modified: trunk/concordance/src/sockets/__init__.c
===================================================================
--- trunk/concordance/src/sockets/__init__.c    2009-03-05 03:47:40 UTC (rev 
1551)
+++ trunk/concordance/src/sockets/__init__.c    2009-03-05 18:31:19 UTC (rev 
1552)
@@ -33,7 +33,7 @@
   PyModuleDef_HEAD_INIT,
   "sockets",                           /*m_name*/
   "Test Help",                         /*m_doc*/
-  sizeof(sockets_State),               /*m_size*/
+  sizeof(PyObject*),                   /*m_size*/
   sockets_Methods,                     /*m_methods*/
   NULL,                                /*m_reload*/
   NULL,                                /*m_traverse*/
@@ -46,7 +46,6 @@
 PyInit_sockets(void) {                                                    /*\
   cdef :                                                                  \*/
     PyObject*           module;
-    sockets_State*      state;
     Gsasl*              saslCntx;
     PyObject*           _core;
     PyObject*           services;
@@ -77,16 +76,6 @@
   if (PyType_Ready((PyTypeObject*) &socketsClient_Type) < 0)
     return NULL;
 
-  /* initialize gsasl context
-
-     int                gsasl_init               (Gsasl** ctx)
-     Return value: GSASL_OK if successful, otherwise GSASL_MALLOC_ERROR.
-  */
-  if (gsasl_init(&saslCntx) != GSASL_OK) {
-    PyErr_SetString(PyExc_MemoryError, "out of memory on gsasl_init");
-    return NULL;
-  }
-
   /* Get a handle to linked extensions or fail
 
      PyObject*          PyImport_ImportModule    (const char *name);
@@ -108,13 +97,11 @@
   */
   module = PyModule_Create(&sockets_Module);
 
-  /* Record _core and saslCntx in module state
+  /* Record _core in module state
 
      void*              PyModule_GetState        (PyObject*);
   */
-  state = (sockets_State*) PyModule_GetState(module);
-  state->_core = _core;
-  state->saslCntx = saslCntx;  
+  *(PyObject**) PyModule_GetState(module) = _core;
 
   /* incref each extension type */
   Py_INCREF(&socketsSocket_Type);

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

Reply via email to