# HG changeset patch # User franky # Date 1557865173 -7200 # Node ID 7921c8d671c834180e7f1f30ba6a085fbae6a3d8 # Parent 462f4359391cb366092491461d7b92d2771f4215 Implemented another helper function jid_get_resource_name diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/commands.c --- 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); diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/roster.c --- 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; diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/utils.c --- 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. diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/utils.h --- 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); diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/xmpp.c --- 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); diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/xmpp_iqrequest.c --- 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; } diff -r 462f4359391c -r 7921c8d671c8 mcabber/mcabber/xmpp_muc.c --- 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); }