Merge branch 'master' of git+ssh://git.citadel.org/appl/gitroot/citadel
authorWilfried Goesgens <dothebart@citadel.org>
Wed, 31 Dec 2014 19:24:52 +0000 (20:24 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Wed, 31 Dec 2014 19:24:52 +0000 (20:24 +0100)
citadel/modules/xmpp/serv_xmpp.c
citadel/modules/xmpp/xmpp_presence.c
citadel/modules/xmpp/xmpp_query_namespace.c
citadel/modules/xmpp/xmpp_queue.c
citadel/modules/xmpp/xmpp_sasl_service.c

index 7986cb573fdb254de00bac8f1684f79cff2896e6..7d8fbc67d02c3349ec864d3d56e916563962fc50 100644 (file)
@@ -81,25 +81,6 @@ static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,
 }
 #endif
 
-static inline int XMPP_GetUtf8SequenceLength(const char *CharS, const char *CharE)
-{
-       /* if this is is migrated to strbuf, remove this copy. */
-       int n = 0;
-        unsigned char test = (1<<7);
-
-       if ((*CharS & 0xC0) != 0xC0) 
-               return 1;
-
-       while ((n < 8) && 
-              ((test & ((unsigned char)*CharS)) != 0)) 
-       {
-               test = test >> 1;
-               n ++;
-       }
-       if ((n > 6) || ((CharE - CharS) < n))
-               n = 0;
-       return n;
-}
 
 
 /*
@@ -112,11 +93,8 @@ static inline int XMPP_GetUtf8SequenceLength(const char *CharS, const char *Char
 char *xmlesc(char *buf, char *str, int bufsiz)
 {
        char *ptr;
-       char *eiptr;
        unsigned char ch;
-       int inlen;
        int len = 0;
-       int IsUtf8Sequence;
 
        if (!buf) return(NULL);
        buf[0] = 0;
@@ -125,9 +103,6 @@ char *xmlesc(char *buf, char *str, int bufsiz)
                return(buf);
        }
 
-       inlen = strlen(str);
-       eiptr = str + inlen;
-
        for (ptr=str; *ptr; ptr++) {
                ch = *ptr;
                if (ch == '<') {
@@ -152,25 +127,10 @@ char *xmlesc(char *buf, char *str, int bufsiz)
                        buf[len] = 0;
                }
                else {
-                       char oct[32];
-
-                       IsUtf8Sequence =  XMPP_GetUtf8SequenceLength(&buf[len], eiptr);
-                       if (IsUtf8Sequence)
-                       {
-                               while (IsUtf8Sequence > 0){
-                                       buf[len] = *ptr;
-                                       len ++;
-                                       if (--IsUtf8Sequence)
-                                               ptr++;
-                               }
-                               buf[len] = '\0';
-                       }
-                       else
-                       {
-                               sprintf(oct, "&#%o;", ch);
-                               strcpy(&buf[len], oct);
-                               len += strlen(oct);
-                       }
+                       char oct[10];
+                       sprintf(oct, "&#%o;", ch);
+                       strcpy(&buf[len], oct);
+                       len += strlen(oct);
                }
                if ((len + 6) > bufsiz) {
                        return(buf);
@@ -208,13 +168,13 @@ void xmpp_stream_start(void *data, const char *supplied_el, const char **attr)
 
        /*
         * TLS encryption (but only if it isn't already active)
-        * 
+        */ 
 #ifdef HAVE_OPENSSL
        if (!CC->redirect_ssl) {
                cprintf("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>");
        }
 #endif
-       */
+
        if (!CC->logged_in) {
                /* If we're not logged in yet, offer SASL as our feature set */
                xmpp_output_auth_mechs();
index ca8a95949d8d95b10dc7e8d679787ab072a600ac..3a06c68f79979ca2c148869c5f2a89bf85b0eb21 100644 (file)
@@ -67,6 +67,7 @@ void xmpp_indicate_presence(char *presence_jid)
 {
        char xmlbuf[256];
 
+       XMPP_syslog(LOG_DEBUG, "XMPP: indicating presence of <%s> to <%s>", presence_jid, XMPP->client_jid);
        cprintf("<presence from=\"%s\" ", xmlesc(xmlbuf, presence_jid, sizeof xmlbuf));
        cprintf("to=\"%s\"></presence>", xmlesc(xmlbuf, XMPP->client_jid, sizeof xmlbuf));
 }
@@ -171,7 +172,7 @@ void xmpp_destroy_buddy(char *presence_jid, int aggressively) {
  */
 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);
@@ -194,13 +195,11 @@ void xmpp_presence_notify(char *presence_jid, int event_type) {
                }
        }
 
-       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);
@@ -214,7 +213,7 @@ void xmpp_presence_notify(char *presence_jid, int event_type) {
        }
 
        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 */
        }
@@ -271,7 +270,7 @@ void xmpp_fetch_mortuary_backend(long msgnum, void *userdata) {
 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);
        }
 
index cf6f423a56516cd392ce78ae9c79f93d486ff2f5..805b5101eaf09506ac8b4d488b85329fc5748771 100644 (file)
@@ -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"
@@ -71,6 +65,7 @@ void xmpp_roster_item(struct CitContext *cptr) {
        cprintf("</item>");
 }
 
+
 /* 
  * Return the results for a "jabber:iq:roster:query"
  *
@@ -88,7 +83,7 @@ void xmpp_iq_roster_query(void)
        if (cptr) {
                for (i=0; i<nContexts; i++) {
                        if (xmpp_is_visible(&cptr[i], CC)) {
-                               XMPP_syslog(LOG_DEBUG, "Rosterizing %s\n", cptr[i].user.fullname);
+                               syslog(LOG_DEBUG, "Rosterizing %s\n", cptr[i].user.fullname);
                                xmpp_roster_item(&cptr[i]);
                        }
                }
@@ -98,15 +93,11 @@ void xmpp_iq_roster_query(void)
 }
 
 
+
 /*
- * 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)
- *
+ * Client is doing a namespace query.  These are all handled differently.
+ * A "rumplestiltskin lookup" is the most efficient way to handle this.  Please do not refactor this code.
  */
-
 void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns)
 {
        int supported_namespace = 0;
@@ -120,11 +111,13 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x
        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;
        }
 
-       XMPP_syslog(LOG_DEBUG, "xmpp_query_namespace(%s, %s, %s, %s)\n", iq_id, iq_from, iq_to, query_xmlns);
+       XMPP_syslog(LOG_DEBUG, "xmpp_query_namespace(id=%s, from=%s, to=%s, xmlns=%s)\n", iq_id, iq_from, iq_to, query_xmlns);
 
        /*
         * Beginning of query result.
@@ -156,16 +149,23 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x
                );
        }
 
+       // 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("<query xmlns=\"%s\"/>", 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("<query xmlns=\"%s\"/>", 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 {
-               XMPP_syslog(LOG_DEBUG,
-                           "Unknown query namespace '%s' - returning <service-unavailable/>\n",
-                           query_xmlns
-               );
+               XMPP_syslog(LOG_DEBUG, "Unknown query namespace '%s' - returning <service-unavailable/>\n", query_xmlns);
                cprintf("<error code=\"503\" type=\"cancel\">"
                        "<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
                        "</error>"
index 8cb5662d89f846728c2b53140692325e18553b79..530ea5a76942131f5b69dba7adfa563377380478 100644 (file)
@@ -66,7 +66,7 @@ void xmpp_queue_event(int event_type, char *email_addr) {
        int purged_something = 0;
        struct CitContext *cptr;
 
-       XMPP_syslog(LOG_DEBUG, "xmpp_queue_event(%d, %s)\n", event_type, email_addr);
+       syslog(LOG_DEBUG, "xmpp_queue_event(%d, %s)\n", event_type, email_addr);
 
        /* Purge events more than a minute old */
        begin_critical_section(S_XMPP_QUEUE);
index e7ad1a2b19f40e035750d0d2b750a9abc8957856..393174dce18b2cf78901e61aa1955743d84f08fc 100644 (file)
  */
 int xmpp_auth_plain(char *authstring)
 {
-       StrBuf *AuthBuf;
-       const char *decoded_authstring;
-       char ident[256] = "";
-       char user[256] = "";
-       char pass[256] = "";
+       char decoded_authstring[1024];
+       char ident[256];
+       char user[256];
+       char pass[256];
        int result;
        long len;
 
@@ -77,25 +76,12 @@ int xmpp_auth_plain(char *authstring)
        /* Take apart the authentication string */
        memset(pass, 0, sizeof(pass));
 
-       AuthBuf = NewStrBufPlain(authstring, -1);
-       len = StrBufDecodeBase64(AuthBuf);
-       if (len > 0)
-       {
-               decoded_authstring = ChrPtr(AuthBuf);
-
-               len = safestrncpy(ident, decoded_authstring, sizeof ident);
-
-               decoded_authstring += len + 1;
-
-               len = safestrncpy(user, decoded_authstring, sizeof user);
-
-               decoded_authstring += len + 1;
-
-               len = safestrncpy(pass, decoded_authstring, sizeof pass);
-               if (len < 0)
-                       len = sizeof(pass) - 1;
-       }
-       FreeStrBuf(&AuthBuf);
+       CtdlDecodeBase64(decoded_authstring, authstring, strlen(authstring));
+       safestrncpy(ident, decoded_authstring, sizeof ident);
+       safestrncpy(user, &decoded_authstring[strlen(ident) + 1], sizeof user);
+       len = safestrncpy(pass, &decoded_authstring[strlen(ident) + strlen(user) + 2], sizeof pass);
+       if (len < 0)
+               len = -len;
 
        /* If there are underscores in either string, change them to spaces.  Some clients
         * do not allow spaces so we can tell the user to substitute underscores if their