From: Art Cancro Date: Wed, 31 Dec 2014 15:26:45 +0000 (-0500) Subject: Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel X-Git-Tag: v9.01~57^2~1 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=73bcf6081a14008eb1020126273f133a324bb910;hp=-c Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel Conflicts: citadel/modules/xmpp/serv_xmpp.c citadel/modules/xmpp/xmpp_presence.c citadel/modules/xmpp/xmpp_query_namespace.c --- 73bcf6081a14008eb1020126273f133a324bb910 diff --combined citadel/modules/xmpp/serv_xmpp.c index ea4adc48b,7986cb573..126385129 --- a/citadel/modules/xmpp/serv_xmpp.c +++ b/citadel/modules/xmpp/serv_xmpp.c @@@ -17,9 -17,6 +17,9 @@@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +// uncomment for more verbosity +#define XMPP_DEBUG 1 + #include "sysdep.h" #include #include @@@ -79,7 -76,7 +79,11 @@@ static void xmpp_entity_declaration(voi const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName ) { ++<<<<<<< HEAD + syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser."); ++======= + XMPPM_syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser."); ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 XML_StopParser(XMPP->xp, XML_FALSE); } #endif @@@ -211,13 -208,13 +215,21 @@@ void xmpp_stream_start(void *data, cons /* * TLS encryption (but only if it isn't already active) ++<<<<<<< HEAD + */ ++======= + * / ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 #ifdef HAVE_OPENSSL if (!CC->redirect_ssl) { cprintf(""); } #endif ++<<<<<<< HEAD + ++======= + */ ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 if (!CC->logged_in) { /* If we're not logged in yet, offer SASL as our feature set */ xmpp_output_auth_mechs(); @@@ -229,13 -226,13 +241,22 @@@ /* Offer binding and sessions as part of our feature set */ cprintf(""); cprintf(""); ++<<<<<<< HEAD + + cprintf(""); ++======= ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 + cprintf(""); + ++<<<<<<< HEAD ++ ++======= CC->is_async = 1; /* XMPP sessions are inherently async-capable */ } ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) { char el[256]; char *sep = NULL; @@@ -247,12 -244,12 +268,21 @@@ strcpy(el, ++sep); } ++<<<<<<< HEAD +#ifdef XMPP_DEBUG + syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el); + for (i=0; attr[i] != NULL; i+=2) { + syslog(LOG_DEBUG, " Attribute '%s' = '%s'\n", attr[i], attr[i+1]); + } +#endif /* XMPP_DEBUG */ ++======= + /* + XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el); + for (i=0; attr[i] != NULL; i+=2) { + XMPP_syslog(LOG_DEBUG, " Attribute '%s' = '%s'\n", attr[i], attr[i+1]); + } + uncomment for more verbosity */ ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 if (!strcasecmp(el, "stream")) { xmpp_stream_start(data, supplied_el, attr); @@@ -261,6 -258,6 +291,46 @@@ else if (!strcasecmp(el, "query")) { XMPP->iq_query_xmlns[0] = 0; safestrncpy(XMPP->iq_query_xmlns, supplied_el, sizeof XMPP->iq_query_xmlns); ++<<<<<<< HEAD ++ } ++ ++ else if (!strcasecmp(el, "bind")) { ++ XMPP->bind_requested = 1; ++ } ++ ++ else if (!strcasecmp(el, "iq")) { ++ for (i=0; attr[i] != NULL; i+=2) { ++ if (!strcasecmp(attr[i], "type")) { ++ safestrncpy(XMPP->iq_type, attr[i+1], sizeof XMPP->iq_type); ++ } ++ 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); ++ } ++ } ++ } ++ ++ else if (!strcasecmp(el, "auth")) { ++ XMPP->sasl_auth_mech[0] = 0; ++ for (i=0; attr[i] != NULL; i+=2) { ++ if (!strcasecmp(attr[i], "mechanism")) { ++ safestrncpy(XMPP->sasl_auth_mech, attr[i+1], sizeof XMPP->sasl_auth_mech); ++ } ++ } ++ } ++ ++ else if (!strcasecmp(el, "message")) { ++ for (i=0; attr[i] != NULL; i+=2) { ++ if (!strcasecmp(attr[i], "to")) { ++ safestrncpy(XMPP->message_to, attr[i+1], sizeof XMPP->message_to); ++ } ++ } ++======= } else if (!strcasecmp(el, "bind")) { @@@ -308,50 -305,50 +378,104 @@@ + void xmpp_xml_end(void *data, const char *supplied_el) { + char el[256]; + char *sep = NULL; + char xmlbuf[256]; + + /* Axe the namespace, we don't care about it */ + safestrncpy(el, supplied_el, sizeof el); + while (sep = strchr(el, ':'), sep) { + strcpy(el, ++sep); + } + + /* + XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT END : <%s>\n", el); + if (XMPP->chardata_len > 0) { + XMPP_syslog(LOG_DEBUG, " chardata: %s\n", XMPP->chardata); ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 + } - uncomment for more verbosity */ + ++<<<<<<< HEAD ++ else if (!strcasecmp(el, "html")) { ++ ++XMPP->html_tag_level; ++ } ++} ++ ++ ++ +void xmpp_xml_end(void *data, const char *supplied_el) { + char el[256]; + char *sep = NULL; + char xmlbuf[256]; + + /* Axe the namespace, we don't care about it */ + safestrncpy(el, supplied_el, sizeof el); + while (sep = strchr(el, ':'), sep) { + strcpy(el, ++sep); + } + +#ifdef XMPP_DEBUG + syslog(LOG_DEBUG, "XMPP ELEMENT END : <%s>\n", el); + if (XMPP->chardata_len > 0) { + syslog(LOG_DEBUG, " chardata: %s\n", XMPP->chardata); + } +#endif /* XMPP_DEBUG */ + + if (!strcasecmp(el, "resource")) { + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_resource, XMPP->chardata, + sizeof XMPP->iq_client_resource); + striplt(XMPP->iq_client_resource); + } + } + + else if (!strcasecmp(el, "username")) { /* NON SASL ONLY */ + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_username, XMPP->chardata, + sizeof XMPP->iq_client_username); + striplt(XMPP->iq_client_username); + } + } + + else if (!strcasecmp(el, "password")) { /* NON SASL ONLY */ + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_password, XMPP->chardata, + sizeof XMPP->iq_client_password); + striplt(XMPP->iq_client_password); + } + } + + else if (!strcasecmp(el, "iq")) { + ++======= + if (!strcasecmp(el, "resource")) { + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_resource, XMPP->chardata, + sizeof XMPP->iq_client_resource); + striplt(XMPP->iq_client_resource); + } + } + + else if (!strcasecmp(el, "username")) { /* NON SASL ONLY */ + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_username, XMPP->chardata, + sizeof XMPP->iq_client_username); + striplt(XMPP->iq_client_username); + } + } + + else if (!strcasecmp(el, "password")) { /* NON SASL ONLY */ + if (XMPP->chardata_len > 0) { + safestrncpy(XMPP->iq_client_password, XMPP->chardata, + sizeof XMPP->iq_client_password); + striplt(XMPP->iq_client_password); + } + } + + else if (!strcasecmp(el, "iq")) { + ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 /* * iq type="get" (handle queries) */ @@@ -383,7 -380,7 +507,11 @@@ * Unknown query ... return the XML equivalent of a blank stare */ else { ++<<<<<<< HEAD + syslog(LOG_DEBUG, ++======= + XMPP_syslog(LOG_DEBUG, ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 "Unknown query <%s> - returning \n", el ); @@@ -515,21 -512,17 +643,35 @@@ else if (!strcasecmp(el, "ping")) { XMPP->ping_requested = 1; ++<<<<<<< HEAD + } + + else if (!strcasecmp(el, "stream")) { + syslog(LOG_DEBUG, "XMPP client shut down their stream\n"); + xmpp_massacre_roster(); + cprintf("\n"); + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; + } + + else if (!strcasecmp(el, "query")) { + // no action required here, we picked up the xmlns= parameter during xmpp_xml_start() + } + + else { + syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el); ++======= + } + + else if (!strcasecmp(el, "stream")) { + XMPPM_syslog(LOG_DEBUG, "XMPP client shut down their stream\n"); + xmpp_massacre_roster(); + cprintf("\n"); + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; + } + + else { + XMPP_syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el); ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 } XMPP->chardata_len = 0; @@@ -594,7 -587,7 +736,7 @@@ void xmpp_greeting(void) XMPP->xp = XML_ParserCreateNS("UTF-8", ':'); if (XMPP->xp == NULL) { - XMPPM_syslog(LOG_ALERT, "Cannot create XML parser!\n"); + syslog(LOG_ALERT, "Cannot create XML parser!\n"); CC->kill_me = KILLME_XML_PARSER; return; } @@@ -628,11 -621,10 +770,11 @@@ void xmpp_command_loop(void) time(&CC->lastcmd); rc = client_read_random_blob(stream_input, 30); if (rc > 0) { + syslog(LOG_DEBUG, "\033[32m%s\033[0m", ChrPtr(stream_input)); XML_Parse(XMPP->xp, ChrPtr(stream_input), rc, 0); } else { - XMPPM_syslog(LOG_ERR, "client disconnected: ending session.\n"); + syslog(LOG_ERR, "client disconnected: ending session.\n"); CC->kill_me = KILLME_CLIENT_DISCONNECTED; } FreeStrBuf(&stream_input); diff --combined citadel/modules/xmpp/xmpp_presence.c index ebdfd152a,ca8a95949..4c2d50ade --- a/citadel/modules/xmpp/xmpp_presence.c +++ b/citadel/modules/xmpp/xmpp_presence.c @@@ -67,7 -67,6 +67,10 @@@ void xmpp_indicate_presence(char *prese { char xmlbuf[256]; ++<<<<<<< HEAD + syslog(LOG_DEBUG, "XMPP: indicating presence of <%s> to <%s>", presence_jid, XMPP->client_jid); ++======= ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("", xmlesc(xmlbuf, XMPP->client_jid, sizeof xmlbuf)); } @@@ -172,7 -171,7 +175,7 @@@ void xmpp_destroy_buddy(char *presence_ */ void xmpp_presence_notify(char *presence_jid, int event_type) { struct CitContext *cptr; - static int unsolicited_id; + static int unsolicited_id = 12345; int visible_sessions = 0; int nContexts, i; int which_cptr_is_relevant = (-1); @@@ -195,11 -194,13 +198,11 @@@ } } - XMPP_syslog(LOG_DEBUG, "%d sessions for <%s> are now visible to session %d\n", - visible_sessions, presence_jid, CC->cs_pid); + syslog(LOG_DEBUG, "%d sessions for <%s> are now visible to session %d\n", visible_sessions, presence_jid, CC->cs_pid); if ( (event_type == XMPP_EVT_LOGIN) && (visible_sessions == 1) ) { - XMPP_syslog(LOG_DEBUG, "Telling session %d that <%s> logged in\n", - CC->cs_pid, presence_jid); + syslog(LOG_DEBUG, "Telling session %d that <%s> logged in\n", CC->cs_pid, presence_jid); /* Do an unsolicited roster update that adds a new contact. */ assert(which_cptr_is_relevant >= 0); @@@ -213,7 -214,7 +216,7 @@@ } if (visible_sessions == 0) { - XMPP_syslog(LOG_DEBUG, "Telling session %d that <%s> logged out\n", + syslog(LOG_DEBUG, "Telling session %d that <%s> logged out\n", CC->cs_pid, presence_jid); xmpp_destroy_buddy(presence_jid, 0); /* non aggressive presence update */ } @@@ -270,7 -271,7 +273,7 @@@ void xmpp_fetch_mortuary_backend(long m HashList *xmpp_fetch_mortuary(void) { HashList *mortuary = NewHash(1, NULL); if (!mortuary) { - XMPPM_syslog(LOG_ALERT, "NewHash() failed!\n"); + syslog(LOG_ALERT, "NewHash() failed!\n"); return(NULL); } diff --combined citadel/modules/xmpp/xmpp_query_namespace.c index 39b3979ac,cf6f423a5..fb3374e9e --- a/citadel/modules/xmpp/xmpp_query_namespace.c +++ b/citadel/modules/xmpp/xmpp_query_namespace.c @@@ -3,13 -3,19 +3,13 @@@ * * Copyright (c) 2007-2009 by Art Cancro * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. - * - * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #include "sysdep.h" @@@ -65,7 -71,6 +65,7 @@@ void xmpp_roster_item(struct CitContex cprintf(""); } + /* * Return the results for a "jabber:iq:roster:query" * @@@ -83,7 -88,7 +83,7 @@@ void xmpp_iq_roster_query(void if (cptr) { for (i=0; i>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns) { int supported_namespace = 0; @@@ -111,13 -120,11 +115,17 @@@ if ( (!strcasecmp(query_xmlns, "jabber:iq:roster:query")) || (!strcasecmp(query_xmlns, "jabber:iq:auth:query")) + || (!strcasecmp(query_xmlns, "http://jabber.org/protocol/disco#items:query")) + || (!strcasecmp(query_xmlns, "http://jabber.org/protocol/disco#info:query")) ) { supported_namespace = 1; } ++<<<<<<< HEAD + syslog(LOG_DEBUG, "xmpp_query_namespace(id=%s, from=%s, to=%s, xmlns=%s)\n", iq_id, iq_from, iq_to, query_xmlns); ++======= + XMPP_syslog(LOG_DEBUG, "xmpp_query_namespace(%s, %s, %s, %s)\n", iq_id, iq_from, iq_to, query_xmlns); ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 /* * Beginning of query result. @@@ -127,10 -134,10 +135,17 @@@ } else { cprintf(">>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("id=\"%s\">", xmlesc(xmlbuf, iq_id, sizeof xmlbuf)); /* @@@ -149,23 -156,16 +164,30 @@@ ); } + // Extension "xep-0030" (http://xmpp.org/extensions/xep-0030.html) (return an empty set of results) + else if (!strcasecmp(query_xmlns, "http://jabber.org/protocol/disco#items:query")) { + cprintf("", xmlesc(xmlbuf, query_xmlns, sizeof xmlbuf)); + } + + // Extension "xep-0030" (http://xmpp.org/extensions/xep-0030.html) (return an empty set of results) + else if (!strcasecmp(query_xmlns, "http://jabber.org/protocol/disco#info:query")) { + cprintf("", xmlesc(xmlbuf, query_xmlns, sizeof xmlbuf)); + } + /* * If we didn't hit any known query namespaces then we should deliver a * "service unavailable" error (see RFC3921 section 2.4 and 11.1.5.4) */ else { ++<<<<<<< HEAD + syslog(LOG_DEBUG, "Unknown query namespace '%s' - returning \n", query_xmlns); ++======= + XMPP_syslog(LOG_DEBUG, + "Unknown query namespace '%s' - returning \n", + query_xmlns + ); ++>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("" "" ""