changeset 2348:87cc62145c76

Refactor carbon message handling (franky) Send MDR for forwarded messages when a bare JID is used.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 06 Sep 2020 17:33:54 +0200
parents db8de1b464d3
children b951567c78bf
files mcabber/mcabber/xmpp.c
diffstat 1 files changed, 38 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/xmpp.c	Sat May 18 20:41:52 2019 +0200
+++ b/mcabber/mcabber/xmpp.c	Sun Sep 06 17:33:54 2020 +0200
@@ -1071,6 +1071,7 @@
   char *bjid;
   const char *res;
   LmMessageNode *x;
+  LmMessageNode *message_node = m->node;
   const char *body = NULL;
   const char *enc = NULL;
   const char *subject = NULL;
@@ -1082,16 +1083,17 @@
     scr_LogPrint(LPRINT_DEBUG, "handle_messages: message with missing from attribute");
     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
   }
+
   // Get the bare-JID/room (bjid) and the resource/nickname (res)
   bjid = jidtodisp(from);
   res = jid_get_resource_name(from);
 
   mstype = lm_message_get_sub_type(m);
   // Timestamp?
-  timestamp = lm_message_node_get_timestamp(m->node);
+  timestamp = lm_message_node_get_timestamp(message_node);
 
   if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
-    x = lm_message_node_get_child(m->node, "error");
+    x = lm_message_node_get_child(message_node, "error");
     display_server_error(x, from);
 #ifdef XEP0085
     // If the XEP85/22 support is probed, set it back to unknown so that
@@ -1099,11 +1101,11 @@
     chatstates_reset_probed(bjid, res);
 #endif
   } else {
-    handle_state_events(bjid, res, m->node);
+    handle_state_events(bjid, res, message_node);
   }
 
   // Check for carbons!
-  x = lm_message_node_find_xmlns(m->node, NS_CARBONS_2);
+  x = lm_message_node_find_xmlns(message_node, NS_CARBONS_2);
   gboolean carbons = FALSE;
   if (x && (!g_strcmp0(x->name, "received") || !g_strcmp0(x->name, "sent"))) {
     LmMessageNode *xenc;
@@ -1127,27 +1129,35 @@
       goto handle_messages_return;
     }
 
-    xenc = lm_message_node_find_xmlns(x, NS_ENCRYPTED);
+    // We should now consider the forwarded node...
+    message_node = x;
+
+    xenc = lm_message_node_find_xmlns(message_node, NS_ENCRYPTED);
     if (xenc)
       enc = lm_message_node_get_value(xenc);
 
-    body = lm_message_node_get_child_value(x, "body");
-    subject = lm_message_node_get_child_value(x, "subject");
-    ns_signed = lm_message_node_find_xmlns(x, NS_SIGNED);
+    body = lm_message_node_get_child_value(message_node, "body");
+    subject = lm_message_node_get_child_value(message_node, "subject");
+    ns_signed = lm_message_node_find_xmlns(message_node, NS_SIGNED);
+    const char *to = lm_message_node_get_attribute(message_node, "to");
+    from = lm_message_node_get_attribute(message_node, "from");
+    if (!from) {
+      scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy (missing 'from' attribute).");
+      goto handle_messages_return;
+    }
+    if (!to) {
+      scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy (missing 'to' attribute).");
+      goto handle_messages_return;
+    }
 
-    // Parse a message that is send to one of our other resources
+    // Parse a message that is sent to one of our other resources
     if (!g_strcmp0(carbon_name, "received")) {
-      from = lm_message_node_get_attribute(x, "from");
-      if (!from) {
-        scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
-        goto handle_messages_return;
-      }
       g_free(bjid);
       bjid = jidtodisp(from);
       res = jid_get_resource_name(from);
 
       // Try to handle forwarded chat state messages
-      handle_state_events(from, res, x);
+      handle_state_events(from, res, message_node);
 
       scr_LogPrint(LPRINT_DEBUG, "Received incoming carbon from <%s>", from);
 
@@ -1156,11 +1166,7 @@
       char *decrypted_pgp = NULL;
 #endif
       guint encrypted = 0;
-      const char *to = lm_message_node_get_attribute(x, "to");
-      if (!to) {
-        scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
-        goto handle_messages_return;
-      }
+
       g_free(bjid);
       bjid = jidtodisp(to);
 
@@ -1193,12 +1199,12 @@
       goto handle_messages_return;
     }
   } else { // Not a Carbon
-    subject = lm_message_node_get_child_value(m->node, "subject");
-    body = lm_message_node_get_child_value(m->node, "body");
-    x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED);
+    subject = lm_message_node_get_child_value(message_node, "subject");
+    body = lm_message_node_get_child_value(message_node, "body");
+    x = lm_message_node_find_xmlns(message_node, NS_ENCRYPTED);
     if (x)
       enc = lm_message_node_get_value(x);
-    ns_signed = lm_message_node_find_xmlns(m->node, NS_SIGNED);
+    ns_signed = lm_message_node_find_xmlns(message_node, NS_SIGNED);
   }
 
   // Only process messages that have a body or a subject
@@ -1209,15 +1215,16 @@
 
   // Handle XEP 184
   {
-    LmMessageNode *xep184 = lm_message_node_find_xmlns(m->node, NS_RECEIPTS);
+    LmMessageNode *xep184 = lm_message_node_find_xmlns(message_node, NS_RECEIPTS);
     if (xep184) {
-      if(!g_strcmp0("request", xep184->name) &&
-         (roster_getsubscription(bjid) & sub_from)) {
+      if(!g_strcmp0("request", xep184->name)
+         && !jid_equal(lm_connection_get_jid(lconnection), from)
+         && (roster_getsubscription(bjid) & sub_from)) {
         // Report received message if message delivery receipt was requested
         const gchar *mid;
         LmMessageNode *y;
         LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE);
-        mid = lm_message_get_id(m);
+        mid = lm_message_node_get_attribute(message_node, "id");
         // For backward compatibility (XEP184 < v.1.1):
         lm_message_node_set_attribute(rcvd->node, "id", mid);
         y = lm_message_node_add_child(rcvd->node, "received", NULL);
@@ -1231,7 +1238,7 @@
         // This is for backward compatibility; if the remote client didn't add
         // the id as an attribute of the 'received' tag, we use the message id:
         if (!id)
-          id = lm_message_get_id(m);
+          id = lm_message_node_get_attribute(message_node, "id");
         scr_remove_receipt_flag(bjid, id);
 
 #ifdef MODULES_ENABLE
@@ -1248,13 +1255,13 @@
   }
 
   {
-    LmMessageNode *muc_message = lm_message_node_find_xmlns(m->node, NS_MUC_USER);
+    LmMessageNode *muc_message = lm_message_node_find_xmlns(message_node, NS_MUC_USER);
     if (muc_message && !strcmp(muc_message->name, "x"))
       got_muc_message(from, muc_message, timestamp);
   }
 
   {
-    LmMessageNode *muc_invite = lm_message_node_find_xmlns(m->node, NS_X_CONFERENCE);
+    LmMessageNode *muc_invite = lm_message_node_find_xmlns(message_node, NS_X_CONFERENCE);
 
     if (muc_invite && !strcmp(muc_invite->name, "x")) {
       const char *jid = lm_message_node_get_attribute(muc_invite, "jid");