diff --git a/src/headless/core.js b/src/headless/core.js index f9db7e128..56917ffab 100644 --- a/src/headless/core.js +++ b/src/headless/core.js @@ -48,6 +48,7 @@ Strophe.addNamespace('CARBONS', 'urn:xmpp:carbons:2'); Strophe.addNamespace('CHATSTATES', 'http://jabber.org/protocol/chatstates'); Strophe.addNamespace('CSI', 'urn:xmpp:csi:0'); Strophe.addNamespace('DELAY', 'urn:xmpp:delay'); +Strophe.addNamespace('EME', 'urn:xmpp:eme:0'); Strophe.addNamespace('FASTEN', 'urn:xmpp:fasten:0'); Strophe.addNamespace('FORWARD', 'urn:xmpp:forward:0'); Strophe.addNamespace('HINTS', 'urn:xmpp:hints'); diff --git a/src/headless/shared/parsers.js b/src/headless/shared/parsers.js index 6768938b2..c1975a330 100644 --- a/src/headless/shared/parsers.js +++ b/src/headless/shared/parsers.js @@ -48,13 +48,29 @@ export function getStanzaIDs (stanza, original_stanza) { } export function getEncryptionAttributes (stanza, _converse) { + const eme_tag = sizzle(`encryption[xmlns="${Strophe.NS.EME}"]`, stanza).pop(); + const namespace = eme_tag?.getAttribute('namespace'); + const attrs = {}; + + if (namespace) { + attrs.is_encrypted = true; + attrs.encryption_namespace = namespace; + if (namespace !== Strophe.NS.OMEMO) { + // Found an encrypted message, but it's not OMEMO + return attrs; + } + } + const encrypted = sizzle(`encrypted[xmlns="${Strophe.NS.OMEMO}"]`, stanza).pop(); - const attrs = { 'is_encrypted': !!encrypted }; + if (!eme_tag) { + attrs.is_encrypted = !!encrypted; + } + if (!encrypted || api.settings.get('clear_cache_on_logout')) { return attrs; } const header = encrypted.querySelector('header'); - attrs['encrypted'] = { 'device_id': header.getAttribute('sid') }; + attrs.encrypted = { 'device_id': header.getAttribute('sid') }; const device_id = _converse.omemo_store?.get('device_id'); const key = device_id && sizzle(`key[rid="${device_id}"]`, encrypted).pop(); diff --git a/src/plugins/omemo/tests/media-sharing.js b/src/plugins/omemo/tests/media-sharing.js index bda46f70c..aaff5f113 100644 --- a/src/plugins/omemo/tests/media-sharing.js +++ b/src/plugins/omemo/tests/media-sharing.js @@ -57,8 +57,8 @@ describe("The OMEMO module", function() { type="result"> -
Basic Base64String==
-
foo=bar; user=romeo
+
Basic Base64String==
+
foo=bar; user=romeo
@@ -139,6 +139,7 @@ describe("The OMEMO module", function() { `${sent_stanza.querySelector('payload').textContent}`+ ``+ ``+ + ``+ ``); const link_el = await u.waitUntil(() => view.querySelector('.chat-msg__media')); diff --git a/src/plugins/omemo/tests/omemo.js b/src/plugins/omemo/tests/omemo.js index 80d978cf7..7ab8d3998 100644 --- a/src/plugins/omemo/tests/omemo.js +++ b/src/plugins/omemo/tests/omemo.js @@ -106,6 +106,7 @@ describe("The OMEMO module", function() { `${sent_stanza.querySelector("payload").textContent}`+ ``+ ``+ + ``+ ``); // Test reception of an encrypted message @@ -293,6 +294,7 @@ describe("The OMEMO module", function() { `${sent_stanza.querySelector("payload").textContent}`+ ``+ ``+ + ``+ ``); })); diff --git a/src/plugins/omemo/utils.js b/src/plugins/omemo/utils.js index 2d71104ba..f110b1319 100644 --- a/src/plugins/omemo/utils.js +++ b/src/plugins/omemo/utils.js @@ -762,7 +762,8 @@ export function createOMEMOMessageStanza (chatbox, message, devices) { .then(dicts => addKeysToMessageStanza(stanza, dicts, obj.iv)) .then(stanza => { stanza.c('payload').t(obj.payload).up().up(); - stanza.c('store', { 'xmlns': Strophe.NS.HINTS }); + stanza.c('store', { 'xmlns': Strophe.NS.HINTS }).up(); + stanza.c('encryption', { 'xmlns': Strophe.NS.EME, namespace: Strophe.NS.OMEMO }); return stanza; }); });