From 5740644b6d62658e36a1c554e06b875713a9c621 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 28 Nov 2007 16:26:21 +0000 Subject: [PATCH] Deliver a reply to a Jabber 'roster' query. --- citadel/modules/jabber/serv_xmpp.c | 7 +- citadel/modules/jabber/serv_xmpp.h | 9 ++- citadel/modules/jabber/xmpp_query_namespace.c | 75 +++++++++++++++++-- 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/citadel/modules/jabber/serv_xmpp.c b/citadel/modules/jabber/serv_xmpp.c index b22b551cc..27c4f6a60 100644 --- a/citadel/modules/jabber/serv_xmpp.c +++ b/citadel/modules/jabber/serv_xmpp.c @@ -128,6 +128,9 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) { else if (!strcasecmp(attr[i], "id")) { safestrncpy(XMPP->iq_id, attr[i+1], sizeof XMPP->iq_id); } + else if (!strcasecmp(attr[i], "from")) { + safestrncpy(XMPP->iq_from, attr[i+1], sizeof XMPP->iq_from); + } else if (!strcasecmp(attr[i], "to")) { safestrncpy(XMPP->iq_to, attr[i+1], sizeof XMPP->iq_to); } @@ -179,7 +182,8 @@ void xmpp_xml_end(void *data, const char *supplied_el) { * Query on a namespace */ if (!IsEmptyStr(XMPP->iq_query_xmlns)) { - xmpp_query_namespace(XMPP->iq_id, XMPP->iq_to, XMPP->iq_query_xmlns); + xmpp_query_namespace(XMPP->iq_id, XMPP->iq_from, + XMPP->iq_to, XMPP->iq_query_xmlns); } /* @@ -227,6 +231,7 @@ void xmpp_xml_end(void *data, const char *supplied_el) { /* Now clear these fields out so they don't get used by a future stanza */ XMPP->iq_id[0] = 0; + XMPP->iq_from[0] = 0; XMPP->iq_to[0] = 0; XMPP->iq_type[0] = 0; XMPP->iq_client_resource[0] = 0; diff --git a/citadel/modules/jabber/serv_xmpp.h b/citadel/modules/jabber/serv_xmpp.h index 33b1a74b6..0c97c0fbc 100644 --- a/citadel/modules/jabber/serv_xmpp.h +++ b/citadel/modules/jabber/serv_xmpp.h @@ -11,9 +11,10 @@ struct citxmpp { /* Information about the current session */ int chardata_alloc; char client_jid[256]; /* "full JID" of the client */ - char iq_type[256]; - char iq_id[256]; /* for stanzas */ - char iq_to[256]; /* for stanzas */ + char iq_type[256]; /* for stanzas */ + char iq_id[256]; + char iq_from[256]; + char iq_to[256]; char iq_client_resource[256]; /* resource name requested by the client */ int iq_session; /* nonzero == client is requesting a session */ char iq_query_xmlns[256]; /* Namespace of */ @@ -28,4 +29,4 @@ void xmpp_greeting(void); void xmpp_command_loop(void); void xmpp_sasl_auth(char *, char *); void xmpp_output_auth_mechs(void); -void xmpp_query_namespace(char *, char *, char *); +void xmpp_query_namespace(char *, char *, char *, char *); diff --git a/citadel/modules/jabber/xmpp_query_namespace.c b/citadel/modules/jabber/xmpp_query_namespace.c index bb5a5ab41..5fd3e223e 100644 --- a/citadel/modules/jabber/xmpp_query_namespace.c +++ b/citadel/modules/jabber/xmpp_query_namespace.c @@ -47,24 +47,87 @@ #include #include "serv_xmpp.h" + +/* + * Return the results for a "jabber:iq:roster:query" + * + * Since we are not yet managing a roster, we simply return the entire wholist. + * + */ +void jabber_iq_roster_query(void) +{ + struct CitContext *cptr; + int aide = (CC->user.axlevel >= 6); + + cprintf(""); + + for (cptr = ContextList; cptr != NULL; cptr = cptr->next) { + + if (((cptr->cs_flags&CS_STEALTH)==0) || (aide)) { + cprintf("", + cptr->cs_inet_email, + cptr->user.fullname + ); + cprintf("%s", config.c_humannode); + cprintf(""); + } + } + +/**** these remain here for documentation example only + + cprintf(""); + cprintf("Friends"); + cprintf(""); + + cprintf(""); + cprintf("Friends"); + cprintf(""); + + cprintf(""); + cprintf("Friends"); + cprintf(""); + + ****/ + + cprintf(""); +} + + /* * TODO: handle queries on some or all of these namespaces - + * xmpp_query_namespace(purple5b5c1e58, splorph.xand.com, http://jabber.org/protocol/disco#items:query) xmpp_query_namespace(purple5b5c1e59, splorph.xand.com, http://jabber.org/protocol/disco#info:query) xmpp_query_namespace(purple5b5c1e5a, , vcard-temp:query) xmpp_query_namespace(purple5b5c1e5b, , jabber:iq:roster:query) - + * */ -void xmpp_query_namespace(char *iq_id, char *iq_to, char *query_xmlns) { +void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns) { - lprintf(CTDL_DEBUG, "xmpp_query_namespace(%s, %s, %s)\n", iq_id, iq_to, query_xmlns); + lprintf(CTDL_DEBUG, "xmpp_query_namespace(%s, %s, %s, %s)\n", + iq_id, iq_from, iq_to, query_xmlns); + + /* + * Beginning of query result. + */ + cprintf("", iq_id); + + /* + * Is this a query we know how to handle? + */ + if (!strcasecmp(query_xmlns, "jabber:iq:roster:query")) { + jabber_iq_roster_query(); + } /* - * Unknown query. Return the XML equivalent of a blank stare (empty result) + * End of query result. If we didn't hit any known namespaces then we will + * have simply delivered an empty result stanza, which should be ok. */ - cprintf("", iq_id); cprintf(""); } -- 2.39.2