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">
-
-
+
+
@@ -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;
});
});