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