From 216a6849048b6e88467c34a3bc261a5663397d0b Mon Sep 17 00:00:00 2001 From: Christoph Scholz Date: Wed, 12 Dec 2018 16:42:29 +0100 Subject: [PATCH] prevent message delivery receipts for carbons and own --- CHANGES.md | 1 + dist/converse.js | 19 +++++----- spec/messages.js | 59 ++++++++++++++++++++++++++++++ src/headless/converse-chatboxes.js | 17 +++++---- 4 files changed, 79 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e18f6fb1f..a5a7745fc 100644 --- a/CHANGES.md +++ b/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) diff --git a/dist/converse.js b/dist/converse.js index 3bec0490c..e7435abe5 100644 --- a/dist/converse.js +++ b/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 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) { diff --git a/spec/messages.js b/spec/messages.js index 41f509dc7..489044383 100644 --- a/spec/messages.js +++ b/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'], {}, diff --git a/src/headless/converse-chatboxes.js b/src/headless/converse-chatboxes.js index 982d1626f..dae1149bd 100644 --- a/src/headless/converse-chatboxes.js +++ b/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...