As per RFC3920 section 7, if an XMPP client does not specify a resource ID, generate...
[citadel.git] / citadel / modules / xmpp / serv_xmpp.c
index 34c6e5d2e7c767a0c3f5cc490cd842ef13609b0b..cc75f6dd190751d88f112fa6c91035277d28c2d2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * XMPP (Jabber) service for the Citadel system
- * Copyright (c) 2007-2017 by Art Cancro and citadel.org
+ * Copyright (c) 2007-2018 by Art Cancro and citadel.org
  *
  * This program is open source software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -68,8 +68,6 @@
 struct xmpp_event *xmpp_queue = NULL;
 
 
-
-
 #ifdef HAVE_XML_STOPPARSER
 /* Stop the parser if an entity declaration is hit. */
 static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,
@@ -84,7 +82,6 @@ static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,
 #endif
 
 
-
 /*
  * Given a source string and a target buffer, returns the string
  * properly escaped for insertion into an XML stream.  Returns a
@@ -109,6 +106,7 @@ static inline int Ctdl_GetUtf8SequenceLength(const char *CharS, const char *Char
        return n;
 }
 
+
 char *xmlesc(char *buf, char *str, int bufsiz)
 {
        int IsUtf8Sequence;
@@ -322,24 +320,21 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
 
        if (!strcasecmp(el, "resource")) {
                if (XMPP->chardata_len > 0) {
-                       safestrncpy(XMPP->iq_client_resource, XMPP->chardata,
-                               sizeof XMPP->iq_client_resource);
+                       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);
+                       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);
+                       safestrncpy(XMPP->iq_client_password, XMPP->chardata, sizeof XMPP->iq_client_password);
                        striplt(XMPP->iq_client_password);
                }
        }
@@ -355,8 +350,7 @@ 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_from,
-                                               XMPP->iq_to, XMPP->iq_query_xmlns);
+                               xmpp_query_namespace(XMPP->iq_id, XMPP->iq_from, XMPP->iq_to, XMPP->iq_query_xmlns);
                        }
 
                        /*
@@ -409,9 +403,14 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
                else if (
                        (XMPP->bind_requested)
                        && (!IsEmptyStr(XMPP->iq_id))
-                       && (!IsEmptyStr(XMPP->iq_client_resource))
                        && (CC->logged_in)
-                       ) {
+               ) {
+
+                       /* If the client has not specified a client resource, generate one */
+
+                       if (IsEmptyStr(XMPP->iq_client_resource)) {
+                               generate_uuid(XMPP->iq_client_resource);
+                       }
 
                        /* Generate the "full JID" of the client resource */
 
@@ -421,6 +420,10 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
                                XMPP->iq_client_resource
                        );
 
+                       /* FIXME look here ... there's nothing before the slash ... wtf?
+                       syslog(LOG_DEBUG, "\033[31m client resource = '%s' \033[0m", XMPP->client_jid);
+                       */
+
                        /* Tell the client what its JID is */
 
                        cprintf("<iq type=\"result\" id=\"%s\">", xmlesc(xmlbuf, XMPP->iq_id, sizeof xmlbuf));
@@ -575,7 +578,6 @@ void xmpp_cleanup_function(void) {
 }
 
 
-
 /*
  * Here's where our XMPP session begins its happy day.
  */