From: Art Cancro Date: Fri, 30 Nov 2007 22:49:38 +0000 (+0000) Subject: Login and logout queue events are processed X-Git-Tag: v7.86~2706 X-Git-Url: https://code.citadel.org/?a=commitdiff_plain;h=abea530f3028d5726ce605ca0e822ae1a0d4efe4;p=citadel.git Login and logout queue events are processed --- diff --git a/citadel/modules/jabber/serv_xmpp.c b/citadel/modules/jabber/serv_xmpp.c index 66a32097c..4e758c8b1 100644 --- a/citadel/modules/jabber/serv_xmpp.c +++ b/citadel/modules/jabber/serv_xmpp.c @@ -362,6 +362,7 @@ void xmpp_command_loop(void) { * Async loop for XMPP sessions (handles the transmission of unsolicited stanzas) */ void xmpp_async_loop(void) { + xmpp_process_events(); jabber_output_incoming_messages(); } @@ -370,12 +371,15 @@ void xmpp_async_loop(void) { * Login hook for XMPP sessions */ void xmpp_login_hook(void) { + xmpp_queue_event(XMPP_EVT_LOGIN, CC->cs_inet_email); +} - // we need to somehow alert all xmpp sessions that we are here - // and do a roster push followed by a presence push - - lprintf(CTDL_DEBUG, "LOGIN HOOOOOOOOOOOOOKK!!!\n"); +/* + * Logout hook for XMPP sessions + */ +void xmpp_logout_hook(void) { + xmpp_queue_event(XMPP_EVT_LOGOUT, CC->cs_inet_email); } @@ -395,6 +399,7 @@ CTDL_MODULE_INIT(jabber) CitadelServiceXMPP); CtdlRegisterSessionHook(xmpp_cleanup_function, EVT_STOP); CtdlRegisterSessionHook(xmpp_login_hook, EVT_LOGIN); + CtdlRegisterSessionHook(xmpp_login_hook, EVT_LOGOUT); #else lprintf(CTDL_INFO, "This server is missing the Expat XML parser. Jabber service will be disabled.\n"); diff --git a/citadel/modules/jabber/serv_xmpp.h b/citadel/modules/jabber/serv_xmpp.h index ec488308c..50e6c6096 100644 --- a/citadel/modules/jabber/serv_xmpp.h +++ b/citadel/modules/jabber/serv_xmpp.h @@ -10,6 +10,7 @@ struct citxmpp { /* Information about the current session */ int chardata_len; int chardata_alloc; char client_jid[256]; /* "full JID" of the client */ + int last_event_processed; char iq_type[256]; /* for stanzas */ char iq_id[256]; @@ -26,17 +27,27 @@ struct citxmpp { /* Information about the current session */ struct xmpp_event { struct xmpp_event *next; + int event_seq; + time_t event_time; int event_type; char event_jid[256]; }; extern struct xmpp_event *xmpp_queue; +enum { + XMPP_EVT_LOGIN, + XMPP_EVT_LOGOUT +}; + void xmpp_cleanup_function(void); void xmpp_greeting(void); void xmpp_command_loop(void); +void xmpp_async_loop(void); void xmpp_sasl_auth(char *, char *); void xmpp_output_auth_mechs(void); void xmpp_query_namespace(char *, char *, char *, char *); void jabber_wholist_presence_dump(void); void jabber_output_incoming_messages(void); +void xmpp_queue_event(int, char *); +void xmpp_process_events(void); diff --git a/citadel/modules/jabber/xmpp_queue.c b/citadel/modules/jabber/xmpp_queue.c new file mode 100644 index 000000000..744c4ce3f --- /dev/null +++ b/citadel/modules/jabber/xmpp_queue.c @@ -0,0 +1,132 @@ +/* + * $Id$ + * + * XMPP event queue + * + * Copyright (c) 2007 by Art Cancro + * This code is released under the terms of the GNU General Public License. + * + */ + +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include +#include +#include +#include +#include "citadel.h" +#include "server.h" +#include "citserver.h" +#include "support.h" +#include "config.h" +#include "internet_addressing.h" +#include "md5.h" +#include "ctdl_module.h" + +#ifdef HAVE_EXPAT +#include +#include "serv_xmpp.h" + + + +void xmpp_queue_event(int event_type, char *email_addr) { + + static int seq = 0; + struct xmpp_event *xptr = NULL; + struct xmpp_event *new_event = NULL; + struct xmpp_event *last = NULL; + int purged_something = 0; + struct CitContext *cptr; + + lprintf(CTDL_DEBUG, "xmpp_queue_event(%d, %s)\n", event_type, email_addr); + + /* Purge events more than a minute old */ + begin_critical_section(S_XMPP_QUEUE); + do { + purged_something = 0; + if (xmpp_queue != NULL) { + if ((time(NULL) - xmpp_queue->event_time) > 60) { + xptr = xmpp_queue->next; + free(xmpp_queue); + xmpp_queue = xptr; + purged_something = 1; + } + } + } while(purged_something); + end_critical_section(S_XMPP_QUEUE); + + /* Create a new event */ + new_event = (struct xmpp_event *) malloc(sizeof(struct xmpp_event)); + new_event->next = NULL; + new_event->event_time = time(NULL); + new_event->event_seq = ++seq; + new_event->event_type = event_type; + safestrncpy(new_event->event_jid, email_addr, sizeof new_event->event_jid); + + /* Add it to the list */ + begin_critical_section(S_XMPP_QUEUE); + if (xmpp_queue == NULL) { + xmpp_queue = new_event; + } + else { + for (xptr = xmpp_queue; xptr != NULL; xptr = xptr->next) { + if (xptr->next == NULL) { + last = xptr; + } + } + last->next = new_event; + } + end_critical_section(S_XMPP_QUEUE); + + /* Tell the sessions that something is happening */ + for (cptr = ContextList; cptr != NULL; cptr = cptr->next) { + if (cptr->h_async_function == xmpp_async_loop) { + cptr->async_waiting = 1; + } + } +} + + +/* + * Are we interested in anything from the queue? (Called in async loop) + */ +void xmpp_process_events(void) { + struct xmpp_event *xptr = NULL; + int highest_event = 0; + + for (xptr=xmpp_queue; xptr!=NULL; xptr=xptr->next) { + if (xptr->event_seq > XMPP->last_event_processed) { + + /* FIXME do something */ + + if (xptr->event_seq > highest_event) { + highest_event = xptr->event_seq; + } + } + } + + XMPP->last_event_processed = highest_event; +} + + +#endif /* HAVE_EXPAT */ diff --git a/citadel/modules/jabber/xmpp_sasl_service.c b/citadel/modules/jabber/xmpp_sasl_service.c index 4803fca02..2595423d8 100644 --- a/citadel/modules/jabber/xmpp_sasl_service.c +++ b/citadel/modules/jabber/xmpp_sasl_service.c @@ -1,5 +1,5 @@ /* - * $Id: $ + * $Id$ * * Barebones SASL authentication service for XMPP (Jabber) clients. *