--- 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);
}