# HG changeset patch # User Mikael Berthe # Date 1142274003 -3600 # Node ID 6c633adaae1060098c6138678425a54fcfe759b6 # Parent 53a0004115874e37fc708477b0379fedbb10889a Use events system for subscription requests diff -r 53a000411587 -r 6c633adaae10 mcabber/src/events.h --- a/mcabber/src/events.h Mon Mar 13 19:18:20 2006 +0100 +++ b/mcabber/src/events.h Mon Mar 13 19:20:03 2006 +0100 @@ -11,6 +11,10 @@ #define EVS_CONTEXT_CANCEL 1 #define EVS_CONTEXT_USER 2 +typedef enum { + EVS_TYPE_SUBSCRIPTION = 1 +} evs_type; + /* Common structure for events (evs) and IQ requests (iqs) */ typedef struct { char *id; diff -r 53a000411587 -r 6c633adaae10 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Mon Mar 13 19:18:20 2006 +0100 +++ b/mcabber/src/jabglue.c Mon Mar 13 19:20:03 2006 +0100 @@ -1421,6 +1421,50 @@ g_free(tmp); } +static void evscallback_subcription(eviqs *evp, guint evcontext) +{ + char *barejid; + char *buf; + + if (evcontext == EVS_CONTEXT_TIMEOUT) { + scr_LogPrint(LPRINT_LOGNORM, "Event %s timed out, cancelled.", + evp->id); + return; + } + if (evcontext == EVS_CONTEXT_CANCEL) { + scr_LogPrint(LPRINT_LOGNORM, "Event %s cancelled.", evp->id); + return; + } + if (!(evcontext & EVS_CONTEXT_USER)) + return; + + // Sanity check + if (!evp->data) { + // Shouldn't happen, data should be set to the barejid. + scr_LogPrint(LPRINT_LOGNORM, "Error in evs callback."); + return; + } + + // Ok, let's work now. + // evcontext: 0, 1 == reject, accept + + barejid = evp->data; + + if (evcontext & ~EVS_CONTEXT_USER) { + // Accept subscription request + jb_subscr_send_auth(barejid); + buf = g_strdup_printf("<%s> is allowed to receive your presence updates", + barejid); + } else { + // Reject subscription request + jb_subscr_cancel_auth(barejid); + buf = g_strdup_printf("<%s> won't receive your presence updates", barejid); + } + scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO); + scr_LogPrint(LPRINT_LOGNORM, "%s", buf); + g_free(buf); +} + static void handle_packet_s10n(jconn conn, char *type, char *from, xmlnode xmldata) { @@ -1433,6 +1477,7 @@ /* The sender wishes to subscribe to our presence */ char *msg; int isagent; + eviqs *evn; isagent = (roster_gettype(r) & ROSTER_TYPE_AGENT) != 0; msg = xmlnode_get_tag_data(xmldata, "status"); @@ -1455,10 +1500,12 @@ } } - // FIXME We accept everybody... - jb_subscr_send_auth(from); - buf = g_strdup_printf("<%s> is allowed to receive your presence updates", - from); + // Create a new event item + evn = evs_new(EVS_TYPE_SUBSCRIPTION, EVS_MAX_TIMEOUT); + evn->callback = &evscallback_subcription; + evn->data = g_strdup(r); + + buf = g_strdup_printf("Please use /event %s accept|reject", evn->id); scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); scr_LogPrint(LPRINT_LOGNORM, "%s", buf); g_free(buf);