浏览代码

prevent message delivery receipts for carbons and own

Christoph Scholz 6 年之前
父节点
当前提交
216a684904
共有 4 个文件被更改,包括 77 次插入15 次删除
  1. 1 0
      CHANGES.md
  2. 8 7
      dist/converse.js
  3. 59 0
      spec/messages.js
  4. 9 8
      src/headless/converse-chatboxes.js

+ 1 - 0
CHANGES.md

@@ -5,6 +5,7 @@
 - Bugfix: MUC commands were being ignored
 - UI: Always show the OMEMO lock icon (grayed out if not available).
 - #1374 Can't load embedded chat when changing `view_mode` between page reloads
+- Bugfix: Message Delivery Receipts were being sent for carbons and own messages
 
 ## 4.0.6 (2018-12-07)
 

+ 8 - 7
dist/converse.js

@@ -62207,14 +62207,15 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
           return true;
         }
 
-        let from_jid = stanza.getAttribute('from');
+        let from_jid = stanza.getAttribute('from'),
+            is_carbon = false;
         const forwarded = stanza.querySelector('forwarded'),
               original_stanza = stanza;
 
         if (!_.isNull(forwarded)) {
           const forwarded_message = forwarded.querySelector('message'),
-                forwarded_from = forwarded_message.getAttribute('from'),
-                is_carbon = !_.isNull(stanza.querySelector(`received[xmlns="${Strophe.NS.CARBONS}"]`));
+                forwarded_from = forwarded_message.getAttribute('from');
+          is_carbon = !_.isNull(stanza.querySelector(`received[xmlns="${Strophe.NS.CARBONS}"]`));
 
           if (is_carbon && Strophe.getBareJidFromJid(forwarded_from) !== from_jid) {
             // Prevent message forging via carbons
@@ -62227,15 +62228,15 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
           to_jid = stanza.getAttribute('to');
         }
 
+        const from_bare_jid = Strophe.getBareJidFromJid(from_jid),
+              from_resource = Strophe.getResourceFromJid(from_jid),
+              is_me = from_bare_jid === _converse.bare_jid;
         const requests_receipt = !_.isUndefined(sizzle(`request[xmlns="${Strophe.NS.RECEIPTS}"]`, stanza).pop());
 
-        if (requests_receipt) {
+        if (requests_receipt && !is_carbon && !is_me) {
           this.sendReceiptStanza(from_jid, stanza.getAttribute('id'));
         }
 
-        const from_bare_jid = Strophe.getBareJidFromJid(from_jid),
-              from_resource = Strophe.getResourceFromJid(from_jid),
-              is_me = from_bare_jid === _converse.bare_jid;
         let contact_jid;
 
         if (is_me) {

+ 59 - 0
spec/messages.js

@@ -1224,6 +1224,65 @@
             done();
         }));
 
+        it("carbon received does not emit a message delivery receipt",
+            mock.initConverseWithPromises(
+                null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
+                async function (done, _converse) {
+            test_utils.createContacts(_converse, 'current', 1);
+            const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
+            const msg_id = u.getUniqueId();
+            const sent_stanzas = [];
+            spyOn(_converse.chatboxes, 'sendReceiptStanza').and.callThrough();
+            const msg = $msg({
+                    'from': sender_jid,
+                    'to': _converse.connection.jid,
+                    'type': 'chat',
+                    'id': u.getUniqueId(),
+                }).c('received', {'xmlns': 'urn:xmpp:carbons:2'})
+                .c('forwarded', {'xmlns': 'urn:xmpp:forward:0'})
+                .c('message', {
+                        'xmlns': 'jabber:client',
+                        'from': sender_jid,
+                        'to': _converse.bare_jid+'/another-resource',
+                        'type': 'chat',
+                        'id': msg_id
+                }).c('body').t('Message!').up()
+                .c('request', {'xmlns': Strophe.NS.RECEIPTS}).tree();
+            _converse.chatboxes.onMessage(msg);
+            await test_utils.waitUntil(() => _converse.api.chats.get().length);
+            expect(_converse.chatboxes.sendReceiptStanza).not.toHaveBeenCalled();
+            done();
+        }));
+
+        it("forwarded does not emit a message delivery receipt if it's mine",
+            mock.initConverseWithPromises(
+                null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
+                async function (done, _converse) {
+            test_utils.createContacts(_converse, 'current', 1);
+            const recipient_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
+            const msg_id = u.getUniqueId();
+            const sent_stanzas = [];
+            spyOn(_converse.chatboxes, 'sendReceiptStanza').and.callThrough();
+            const msg = $msg({
+                    'from': converse.bare_jid,
+                    'to': _converse.connection.jid,
+                    'type': 'chat',
+                    'id': u.getUniqueId(),
+                }).c('forwarded', {'xmlns': 'urn:xmpp:forward:0'})
+                .c('message', {
+                        'xmlns': 'jabber:client',
+                        'from': _converse.bare_jid+'/another-resource',
+                        'to': recipient_jid,
+                        'type': 'chat',
+                        'id': msg_id
+                }).c('body').t('Message!').up()
+                .c('request', {'xmlns': Strophe.NS.RECEIPTS}).tree();
+            _converse.chatboxes.onMessage(msg);
+            await test_utils.waitUntil(() => _converse.api.chats.get().length);
+            expect(_converse.chatboxes.sendReceiptStanza).not.toHaveBeenCalled();
+            done();
+        }));
+
         it("delivery can be acknowledged by a receipt",
             mock.initConverseWithPromises(
                 null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},

+ 9 - 8
src/headless/converse-chatboxes.js

@@ -746,14 +746,15 @@ converse.plugins.add('converse-chatboxes', {
                     return true;
                 }
 
-                let from_jid = stanza.getAttribute('from');
+                let from_jid = stanza.getAttribute('from'),
+                    is_carbon = false;
                 const forwarded = stanza.querySelector('forwarded'),
                       original_stanza = stanza;
 
                 if (!_.isNull(forwarded)) {
                     const forwarded_message = forwarded.querySelector('message'),
-                          forwarded_from = forwarded_message.getAttribute('from'),
-                          is_carbon = !_.isNull(stanza.querySelector(`received[xmlns="${Strophe.NS.CARBONS}"]`));
+                          forwarded_from = forwarded_message.getAttribute('from');
+                    is_carbon = !_.isNull(stanza.querySelector(`received[xmlns="${Strophe.NS.CARBONS}"]`));
 
                     if (is_carbon && Strophe.getBareJidFromJid(forwarded_from) !== from_jid) {
                         // Prevent message forging via carbons
@@ -765,15 +766,15 @@ converse.plugins.add('converse-chatboxes', {
                     to_jid = stanza.getAttribute('to');
                 }
 
-                const requests_receipt = !_.isUndefined(sizzle(`request[xmlns="${Strophe.NS.RECEIPTS}"]`, stanza).pop());
-                if (requests_receipt) {
-                    this.sendReceiptStanza(from_jid, stanza.getAttribute('id'));
-                }
-
                 const from_bare_jid = Strophe.getBareJidFromJid(from_jid),
                       from_resource = Strophe.getResourceFromJid(from_jid),
                       is_me = from_bare_jid === _converse.bare_jid;
 
+                const requests_receipt = !_.isUndefined(sizzle(`request[xmlns="${Strophe.NS.RECEIPTS}"]`, stanza).pop());
+                if (requests_receipt && !is_carbon && !is_me) {
+                    this.sendReceiptStanza(from_jid, stanza.getAttribute('id'));
+                }
+
                 let contact_jid;
                 if (is_me) {
                     // I am the sender, so this must be a forwarded message...