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