diff --git a/CHANGES.md b/CHANGES.md index 78eeb328a..9e24c60e6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - Don't render http (i.e. non-TLS) resources - Bugfix: Converse caused `RID out of range` errors on Prosody +- Bugfix: MUC messages sometimes appear twice after resync. - #1331 Fix missing checkmarks in old muc messages - #1333 Don't send receipt requests in MUCs diff --git a/spec/mam.js b/spec/mam.js index c049de6c5..971fe53d7 100644 --- a/spec/mam.js +++ b/spec/mam.js @@ -15,7 +15,7 @@ describe("Archived Messages", function () { - it("aren't shown as duplicates", + it("aren't shown as duplicates by comparing their stanza-id attribute", mock.initConverseWithPromises( null, ['discoInitialized'], {}, async function (done, _converse) { @@ -57,7 +57,67 @@ done(); })); + it("aren't shown as duplicates by comparing their queryid attribute", + mock.initConverseWithPromises( + null, ['discoInitialized'], {}, + async function (done, _converse) { + await test_utils.openAndEnterChatRoom(_converse, 'discuss', 'conference.conversejs.org', 'dummy'); + const view = _converse.chatboxviews.get('discuss@conference.conversejs.org'); + let stanza = Strophe.xmlHtmlNode( + ` + + looks like omemo fails completely with "bundle is undefined" when there is a device in the devicelist that has no keys published + + + + `).firstElementChild; + _converse.connection._dataRecv(test_utils.createRequest(stanza)); + await test_utils.waitUntil(() => view.content.querySelectorAll('.chat-msg').length); + + stanza = Strophe.xmlHtmlNode( + ` + + + + + looks like omemo fails completely with "bundle is undefined" when there is a device in the devicelist that has no keys published + + + + + + + `).firstElementChild; + + spyOn(view.model, 'isDuplicate').and.callThrough(); + view.model.onMessage(stanza); + await test_utils.waitUntil(() => view.model.isDuplicate.calls.count()); + expect(view.model.isDuplicate.calls.count()).toBe(1); + expect(view.content.querySelectorAll('.chat-msg').length).toBe(1); + + stanza = Strophe.xmlHtmlNode( + ` + + + + + looks like omemo fails completely with "bundle is undefined" when there is a device in the devicelist that has no keys published + + + + + + + `).firstElementChild; + view.model.onMessage(stanza); + expect(view.model.isDuplicate.calls.count()).toBe(2); + expect(view.content.querySelectorAll('.chat-msg').length).toBe(1); + done(); + })) }); describe("The archive.query API", function () { diff --git a/src/headless/converse-muc.js b/src/headless/converse-muc.js index 52171509a..deee355b3 100644 --- a/src/headless/converse-muc.js +++ b/src/headless/converse-muc.js @@ -915,7 +915,8 @@ converse.plugins.add('converse-muc', { return data; }, - isDuplicate (message) { + isDuplicate (message, original_stanza) { + // XXX: original_stanza is not used here, but in converse-mam const msgid = message.getAttribute('id'), jid = message.getAttribute('from'); @@ -958,7 +959,7 @@ converse.plugins.add('converse-muc', { if (forwarded) { stanza = forwarded.querySelector('message'); } - if (this.isDuplicate(stanza)) { + if (this.isDuplicate(stanza, original_stanza)) { return; } const jid = stanza.getAttribute('from'),