changeset 2346:7921c8d671c8

Implemented another helper function jid_get_resource_name
author franky
date Tue, 14 May 2019 22:19:33 +0200
parents 462f4359391c
children db8de1b464d3
files mcabber/mcabber/commands.c mcabber/mcabber/roster.c mcabber/mcabber/utils.c mcabber/mcabber/utils.h mcabber/mcabber/xmpp.c mcabber/mcabber/xmpp_iqrequest.c mcabber/mcabber/xmpp_muc.c
diffstat 7 files changed, 98 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/commands.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/commands.c	Tue May 14 22:19:33 2019 +0200
@@ -626,18 +626,16 @@
     if (jidres[1] == JID_RESOURCE_SEPARATOR)
       resource = jidres+2;
   } else {
-    char *tmp;
     if (!check_jid_syntax(jidres) &&
-        (tmp = strchr(jidres, JID_RESOURCE_SEPARATOR))) {
+        jid_get_resource_name(jidres)) {
       //Any other valid full jid
-      *tmp = '\0'; // for roster search by bare jid;
-      resource = tmp+1;
+      char * bare_jid = jidtodisp(jidres);
       GSList *roster_elt;
-      roster_elt = roster_find(jidres, jidsearch,
+      roster_elt = roster_find(bare_jid, jidsearch,
           ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
       if (roster_elt)
         bud = roster_elt->data;
-      *tmp = JID_RESOURCE_SEPARATOR;
+      g_free(bare_jid);
     }
     if (!bud) {
       //Resource for current buddy
@@ -1256,7 +1254,8 @@
 static int send_message_to(const char *fjid, const char *msg, const char *subj,
                            LmMessageSubType type_overwrite, bool quiet)
 {
-  char *bare_jid, *rp;
+  char *bare_jid;
+  const char *muc_nick;
   char *hmsg;
   gint crypted;
   gint retval = 0;
@@ -1282,11 +1281,7 @@
   }
 
   // We must use the bare jid in hk_message_out()
-  rp = strchr(fjid, JID_RESOURCE_SEPARATOR);
-  if (rp)
-    bare_jid = g_strndup(fjid, rp - fjid);
-  else
-    bare_jid = (char*)fjid;
+  bare_jid = jidtodisp(fjid);
 
   if (!quiet) {
     // Jump to window, create one if needed
@@ -1294,13 +1289,9 @@
   }
 
   // Check if we're sending a message to a conference room
-  // If not, we must make sure rp is NULL, for hk_message_out()
   isroom = !!roster_find(bare_jid, jidsearch, ROSTER_TYPE_ROOM);
-  if (rp) {
-    if (isroom) rp++;
-    else rp = NULL;
-  }
-  isroom = isroom && (!rp || !*rp);
+  muc_nick = jid_get_resource_name(fjid);
+  isroom = isroom && !muc_nick;
 
   // local part (UI, logging, etc.)
   if (subj)
@@ -1320,11 +1311,11 @@
 
   // Hook
   if (!isroom)
-    hk_message_out(bare_jid, rp, 0, hmsg, crypted, FALSE, xep184);
+    hk_message_out(bare_jid, muc_nick, 0, hmsg, crypted, FALSE, xep184);
 
 send_message_to_return:
   if (hmsg != msg) g_free(hmsg);
-  if (rp) g_free(bare_jid);
+  g_free(bare_jid);
   return retval;
 }
 
@@ -1705,14 +1696,14 @@
   if (!strchr(fjid, JID_DOMAIN_SEPARATOR)) {
     const gchar *append_server = settings_opt_get("default_server");
     if (append_server) {
-      gchar *res = strchr(fjid, JID_RESOURCE_SEPARATOR);
-      uncompletedfjid = fjid;
+      const char *res = jid_get_resource_name(fjid);
+      uncompletedfjid = jidtodisp(fjid);
+      g_free(fjid);
       if (res) {
-        *res++ = '\0';
-        fjid = g_strdup_printf("%s%c%s%c%s", fjid, JID_DOMAIN_SEPARATOR,
+        fjid = g_strdup_printf("%s%c%s%c%s", uncompletedfjid, JID_DOMAIN_SEPARATOR,
                                append_server, JID_RESOURCE_SEPARATOR, res);
       } else {
-        fjid = g_strdup_printf("%s%c%s", fjid, JID_DOMAIN_SEPARATOR,
+        fjid = g_strdup_printf("%s%c%s", uncompletedfjid, JID_DOMAIN_SEPARATOR,
                                append_server);
       }
     }
@@ -3593,27 +3584,20 @@
   }
 
   if (fjid) {
-    switch (numtype) {
-      case iqreq_vcard:
-          { // vCards requests are sent to the bare jid, except in MUC rooms
-            gchar *tmp = strchr(fjid, JID_RESOURCE_SEPARATOR);
-            if (tmp) {
-              gchar *bjid = jidtodisp(fjid);
-              if (!roster_find(bjid, jidsearch, ROSTER_TYPE_ROOM))
-                *tmp = '\0';
-              g_free(bjid);
-            }
-          }
-          /* FALLTHRU */
-      case iqreq_version:
-      case iqreq_time:
-      case iqreq_last:
-      case iqreq_ping:
-          xmpp_request(fjid, numtype);
-          break;
-      default:
-          break;
+    if (iqreq_vcard == numtype) {
+      // vCards requests are sent to the bare jid, except in MUC rooms
+      const char *resource_name = jid_get_resource_name(fjid);
+      if (resource_name) {
+        char *bare_jid = jidtodisp(fjid);
+        if (!roster_find(bare_jid, jidsearch, ROSTER_TYPE_ROOM)) {
+          g_free(jid_utf8);
+          fjid = jid_utf8 = bare_jid;
+        } else {
+          g_free(bare_jid);
+        }
+      }
     }
+    xmpp_request(fjid, numtype);
   }
   g_free(jid_utf8);
   free_arg_lst(paramlst);
--- a/mcabber/mcabber/roster.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/roster.c	Tue May 14 22:19:33 2019 +0200
@@ -419,11 +419,7 @@
   if (name) {
     roster_usr->name  = g_strdup(name);
   } else {
-    gchar *p, *str = g_strdup(jid);
-    p = strchr(str, JID_RESOURCE_SEPARATOR);
-    if (p)  *p = '\0';
-    roster_usr->name = g_strdup(str);
-    g_free(str);
+    roster_usr->name = jidtodisp(jid);
   }
   if (unread_jid_del(jid)) {
     roster_usr->flags |= ROSTER_FLAG_MSG;
--- a/mcabber/mcabber/utils.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/utils.c	Tue May 14 22:19:33 2019 +0200
@@ -142,6 +142,17 @@
   return (ret == 0) ? TRUE : FALSE;
 }
 
+const char *jid_get_resource_name(const char *fjid)
+{
+  const char * resource_name = NULL;
+  if (fjid) {
+    resource_name = strchr(fjid, JID_RESOURCE_SEPARATOR);
+    if (resource_name)
+      resource_name++;
+  }
+  return resource_name;
+}
+
 //  expand_filename(filename)
 // Expand "~/" with the $HOME env. variable in a file name.
 // The caller must free the string after use.
--- a/mcabber/mcabber/utils.h	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/utils.h	Tue May 14 22:19:33 2019 +0200
@@ -20,6 +20,7 @@
 char *compose_jid(const char *username, const char *servername,
                   const char *resource);
 gboolean jid_equal(const char *jid1, const char *jid2);
+const char *jid_get_resource_name(const char *fjid);
 
 #ifndef LOUDMOUTH_USES_SHA256
 void fingerprint_to_hex(const char *fpr,     char *hex, size_t fpr_len);
--- a/mcabber/mcabber/xmpp.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/xmpp.c	Tue May 14 22:19:33 2019 +0200
@@ -262,7 +262,7 @@
   vcard2user = (reqtype == iqreq_vcard &&
                 !roster_find(fjid, jidsearch, ROSTER_TYPE_ROOM));
 
-  if (strchr(fjid, JID_RESOURCE_SEPARATOR) || vcard2user) {
+  if (g_utf8_strchr(fjid, -1, JID_RESOURCE_SEPARATOR) || vcard2user) {
     // This is a full JID or a vCard request to a contact
     xmpp_iq_request(fjid, xmlns);
     scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
@@ -315,7 +315,7 @@
 #endif
   char *barejid;
 #if defined HAVE_GPGME || defined XEP0085
-  char *rname;
+  const char *rname;
   GSList *sl_buddy;
 #endif
 #ifdef XEP0085
@@ -344,14 +344,9 @@
 
   barejid = jidtodisp(fjid);
 #if defined HAVE_GPGME || defined HAVE_LIBOTR || defined XEP0085
-  rname = strchr(fjid, JID_RESOURCE_SEPARATOR);
+  rname = jid_get_resource_name(fjid);
   sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
 
-  // If we can get a resource name, we use it.  Else we use NULL,
-  // which hopefully will give us the most likely resource.
-  if (rname)
-    rname++;
-
 #ifdef HAVE_LIBOTR
   if (otr_enabled() && !otrinject) {
     if (type == ROSTER_TYPE_USER) {
@@ -584,24 +579,19 @@
 // If the XEP has been probed for this contact, set it back to unknown so
 // that we probe it again.  The parameter must be a full jid (w/ resource).
 #if defined XEP0085
-static void chatstates_reset_probed(const char *fulljid)
+static void chatstates_reset_probed(const char *bare_jid,
+                                    const char *resource_name)
 {
-  char *rname, *barejid;
   GSList *sl_buddy;
   struct xep0085 *xep85;
 
-  rname = strchr(fulljid, JID_RESOURCE_SEPARATOR);
-  if (!rname++)
+  sl_buddy = roster_find(bare_jid, jidsearch, ROSTER_TYPE_USER);
+
+  // only reset if we found the buddy and it has a resource
+  if (!sl_buddy || !resource_name)
     return;
 
-  barejid = jidtodisp(fulljid);
-  sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
-  g_free(barejid);
-
-  if (!sl_buddy)
-    return;
-
-  xep85 = buddy_resource_xep85(sl_buddy->data, rname);
+  xep85 = buddy_resource_xep85(sl_buddy->data, resource_name);
 
   if (xep85 && xep85->support == CHATSTATES_SUPPORT_PROBED)
     xep85->support = CHATSTATES_SUPPORT_UNKNOWN;
@@ -816,10 +806,7 @@
     char *username;
     username   = jid_get_username(settings_opt_get("jid"));
     password   = settings_opt_get("password");
-    resource   = strchr(lm_connection_get_jid(connection),
-                        JID_RESOURCE_SEPARATOR);
-    if (resource)
-      resource++;
+    resource   = jid_get_resource_name(lm_connection_get_jid(connection));
 
     if (!lm_connection_authenticate(lconnection, username, password, resource,
                                     connection_auth_cb, NULL, FALSE, &error)) {
@@ -941,9 +928,7 @@
   int otr_msg = 0, free_msg = 0;
 
   bjid = jidtodisp(from);
-
-  rname = strchr(from, JID_RESOURCE_SEPARATOR);
-  if (rname) rname++;
+  rname = jid_get_resource_name(from);
 
 #ifdef HAVE_GPGME
   if (gpg_enabled()) {
@@ -1083,7 +1068,8 @@
                                        LmMessage *m, gpointer user_data)
 {
   const char *from = lm_message_get_from(m);
-  char *bjid, *res;
+  char *bjid;
+  const char *res;
   LmMessageNode *x;
   const char *body = NULL;
   const char *enc = NULL;
@@ -1097,9 +1083,8 @@
     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
   }
   // Get the bare-JID/room (bjid) and the resource/nickname (res)
-  bjid = g_strdup(from);
-  res = strchr(bjid, JID_RESOURCE_SEPARATOR);
-  if (res) *res++ = 0;
+  bjid = jidtodisp(from);
+  res = jid_get_resource_name(from);
 
   mstype = lm_message_get_sub_type(m);
   // Timestamp?
@@ -1111,7 +1096,7 @@
 #ifdef XEP0085
     // If the XEP85/22 support is probed, set it back to unknown so that
     // we probe it again.
-    chatstates_reset_probed(from);
+    chatstates_reset_probed(bjid, res);
 #endif
   } else {
     handle_state_events(bjid, res, m->node);
@@ -1158,9 +1143,8 @@
         goto handle_messages_return;
       }
       g_free(bjid);
-      bjid = g_strdup(from);
-      res = strchr(bjid, JID_RESOURCE_SEPARATOR);
-      if (res) *res++ = 0;
+      bjid = jidtodisp(from);
+      res = jid_get_resource_name(from);
 
       // Try to handle forwarded chat state messages
       handle_state_events(from, res, x);
@@ -1416,8 +1400,7 @@
     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
   }
 
-  rname = strchr(from, JID_RESOURCE_SEPARATOR);
-  if (rname) rname++;
+  rname = jid_get_resource_name(from);
 
   if (settings_opt_get_int("ignore_self_presence")) {
     const char *self_fjid = lm_connection_get_jid(connection);
--- a/mcabber/mcabber/xmpp_iqrequest.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/xmpp_iqrequest.c	Tue May 14 22:19:33 2019 +0200
@@ -233,7 +233,8 @@
 {
   LmMessageNode *ansqry;
   const char *p, *bjid;
-  char *buf, *tmp;
+  char *bare_jid;
+  char *buf;
 
   // Check IQ result sender
   bjid = lm_message_get_from(m);
@@ -262,34 +263,34 @@
   scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
 
   // bjid should now really be the "bare JID", let's strip the resource
-  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
-  if (tmp) *tmp = '\0';
+  bare_jid = jidtodisp(bjid);
 
-  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
+  scr_WriteIncomingMessage(bare_jid, buf, 0, HBB_PREFIX_INFO, 0);
   g_free(buf);
 
   // Get result data...
   p = lm_message_node_get_child_value(ansqry, "name");
   if (p && *p) {
     buf = g_strdup_printf("Name:    %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
   p = lm_message_node_get_child_value(ansqry, "version");
   if (p && *p) {
     buf = g_strdup_printf("Version: %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
   p = lm_message_node_get_child_value(ansqry, "os");
   if (p && *p) {
     buf = g_strdup_printf("OS:      %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
+  g_free(bare_jid);
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
 
@@ -298,7 +299,8 @@
 {
   LmMessageNode *ansqry;
   const char *p, *bjid;
-  char *buf, *tmp;
+  char *bare_jid;
+  char *buf;
 
   // Check IQ result sender
   bjid = lm_message_get_from(m);
@@ -327,34 +329,34 @@
   scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
 
   // bjid should now really be the "bare JID", let's strip the resource
-  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
-  if (tmp) *tmp = '\0';
+  bare_jid = jidtodisp(bjid);
 
-  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
+  scr_WriteIncomingMessage(bare_jid, buf, 0, HBB_PREFIX_INFO, 0);
   g_free(buf);
 
   // Get result data...
   p = lm_message_node_get_child_value(ansqry, "utc");
   if (p && *p) {
     buf = g_strdup_printf("UTC:  %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
   p = lm_message_node_get_child_value(ansqry, "tzo");
   if (p && *p) {
     buf = g_strdup_printf("TZ:   %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
   p = lm_message_node_get_child_value(ansqry, "display");
   if (p && *p) {
     buf = g_strdup_printf("Time: %s", p);
-    scr_WriteIncomingMessage(bjid, buf,
+    scr_WriteIncomingMessage(bare_jid, buf,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_free(buf);
   }
+  g_free(bare_jid);
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
 
@@ -363,7 +365,8 @@
 {
   LmMessageNode *ansqry;
   const char *p, *bjid;
-  char *buf, *tmp;
+  char *bare_jid;
+  char *buf;
 
   // Check IQ result sender
   bjid = lm_message_get_from(m);
@@ -392,10 +395,9 @@
   scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
 
   // bjid should now really be the "bare JID", let's strip the resource
-  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
-  if (tmp) *tmp = '\0';
+  bare_jid = jidtodisp(bjid);
 
-  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
+  scr_WriteIncomingMessage(bare_jid, buf, 0, HBB_PREFIX_INFO, 0);
   g_free(buf);
 
   // Get result data...
@@ -414,19 +416,20 @@
     g_string_append_printf(sbuf, "%02ld:", s/3600L);
     s %= 3600L;
     g_string_append_printf(sbuf, "%02ld:%02ld", s/60L, s%60L);
-    scr_WriteIncomingMessage(bjid, sbuf->str,
+    scr_WriteIncomingMessage(bare_jid, sbuf->str,
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
     g_string_free(sbuf, TRUE);
   } else {
-    scr_WriteIncomingMessage(bjid, "No idle time reported.",
+    scr_WriteIncomingMessage(bare_jid, "No idle time reported.",
                              0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
   }
   p = lm_message_node_get_value(ansqry);
   if (p) {
     buf = g_strdup_printf("Status message: %s", p);
-    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
+    scr_WriteIncomingMessage(bare_jid, buf, 0, HBB_PREFIX_INFO, 0);
     g_free(buf);
   }
+  g_free(bare_jid);
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
 
@@ -546,7 +549,8 @@
 {
   LmMessageNode *ansqry;
   const char *bjid;
-  char *buf, *tmp;
+  char *bare_jid;
+  char *buf;
 
   // Check IQ result sender
   bjid = lm_message_get_from(m);
@@ -576,14 +580,14 @@
   }
 
   // bjid should really be the "bare JID", let's strip the resource
-  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
-  if (tmp) *tmp = '\0';
+  bare_jid = jidtodisp(bjid);
 
-  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
+  scr_WriteIncomingMessage(bare_jid, buf, 0, HBB_PREFIX_INFO, 0);
   g_free(buf);
 
   // Get result data...
-  handle_vcard_node(bjid, ansqry);
+  handle_vcard_node(bare_jid, ansqry);
+  g_free(bare_jid);
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
 
--- a/mcabber/mcabber/xmpp_muc.c	Sat May 11 23:06:34 2019 +0200
+++ b/mcabber/mcabber/xmpp_muc.c	Tue May 14 22:19:33 2019 +0200
@@ -375,11 +375,12 @@
 
   printjid = settings_opt_get_int("muc_print_jid");
   if (mbjid && autowhois == autowhois_off && printjid) {
-    if (printjid == 1)
-      tmp = strchr(mbjid, JID_RESOURCE_SEPARATOR);
-    if (tmp) *tmp = '\0';
-    nickjid = g_strdup_printf("%s <%s>", rname, mbjid);
-    if (tmp) *tmp = JID_RESOURCE_SEPARATOR;
+    if (printjid == 1) // print nick + barejid
+      tmp = jidtodisp(mbjid);
+    if (printjid == 2) // print nick + full jid
+      tmp = g_strdup(mbjid);
+    nickjid = g_strdup_printf("%s <%s>", rname, tmp);
+    g_free(tmp);
   } else {
     nickjid = g_strdup(rname);
   }