浏览代码

Don't filter out own device when sending OMEMO message

JC Brand 6 年之前
父节点
当前提交
1dfdb36d20
共有 4 个文件被更改,包括 11 次插入14 次删除
  1. 1 0
      CHANGES.md
  2. 2 5
      dist/converse.js
  3. 5 0
      spec/omemo.js
  4. 3 9
      src/converse-omemo.js

+ 1 - 0
CHANGES.md

@@ -18,6 +18,7 @@
 - New config setting [locked_muc_nickname](https://conversejs.org/docs/html/configuration.html#locked-muc-nickname)
 - New config setting [show_client_info](https://conversejs.org/docs/html/configuration.html#show-client-info)
 - Document new API method [sendMessage](https://conversejs.org/docs/html/api/-_converse.ChatBox.html#sendMessage)
+- Don't filter out own device when sending an OMEMO message
 - #1149: With `xhr_user_search_url`, contact requests are not being sent out
 - #1213: Switch roster filter input and icons
 - #1327: fix False mentions positives in URLs and Email addresses

+ 2 - 5
dist/converse.js

@@ -56624,17 +56624,14 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins
     _converse.getBundlesAndBuildSessions = async function (chatbox) {
       let devices;
 
-      const id = _converse.omemo_store.get('device_id');
-
       if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
         const collections = await Promise.all(chatbox.occupants.map(o => getDevicesForContact(o.get('jid'))));
         devices = collections.reduce((a, b) => _.concat(a, b.models), []);
       } else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) {
         const their_devices = await getDevicesForContact(chatbox.get('jid')),
-              devicelist = _converse.devicelists.get(_converse.bare_jid),
-              own_devices = devicelist.devices;
+              own_devices = _converse.devicelists.get(_converse.bare_jid).devices;
 
-        devices = _.concat(own_devices, their_devices.models);
+        devices = _.concat(own_devices.models, their_devices.models);
       }
 
       await Promise.all(devices.map(d => d.getBundle()));

+ 5 - 0
spec/omemo.js

@@ -179,6 +179,7 @@
                     `<encrypted xmlns="eu.siacs.conversations.axolotl">`+
                         `<header sid="123456789">`+
                             `<key rid="482886413b977930064a5888b92134fe">YzFwaDNSNzNYNw==</key>`+
+                            `<key rid="123456789">YzFwaDNSNzNYNw==</key>`+
                             `<key rid="555">YzFwaDNSNzNYNw==</key>`+
                             `<iv>${sent_stanza.nodeTree.querySelector("iv").textContent}</iv>`+
                         `</header>`+
@@ -258,6 +259,7 @@
             toggle.click();
             expect(view.model.get('omemo_active')).toBe(true);
 
+            // newguy enters the room
             const contact_jid = 'newguy@localhost';
             let stanza = $pres({
                     'to': 'dummy@localhost/resource',
@@ -271,6 +273,7 @@
                 }).tree();
             _converse.connection._dataRecv(test_utils.createRequest(stanza));
 
+            // Wait for Converse to fetch newguy's device list
             let iq_stanza = await test_utils.waitUntil(() => deviceListFetched(_converse, contact_jid));
             expect(iq_stanza.toLocaleString()).toBe(
                 `<iq from="dummy@localhost" id="${iq_stanza.nodeTree.getAttribute("id")}" to="${contact_jid}" type="get" xmlns="jabber:client">`+
@@ -279,6 +282,7 @@
                     `</pubsub>`+
                 `</iq>`);
 
+            // The server returns his device list
             stanza = $iq({
                 'from': contact_jid,
                 'id': iq_stanza.nodeTree.getAttribute('id'),
@@ -366,6 +370,7 @@
                     `<encrypted xmlns="eu.siacs.conversations.axolotl">`+
                         `<header sid="123456789">`+
                             `<key rid="482886413b977930064a5888b92134fe">YzFwaDNSNzNYNw==</key>`+
+                            `<key rid="123456789">YzFwaDNSNzNYNw==</key>`+
                             `<key rid="4e30f35051b7b8b42abe083742187228">YzFwaDNSNzNYNw==</key>`+
                             `<iv>${sent_stanza.nodeTree.querySelector("iv").textContent}</iv>`+
                         `</header>`+

+ 3 - 9
src/converse-omemo.js

@@ -549,20 +549,14 @@ converse.plugins.add('converse-omemo', {
 
         _converse.getBundlesAndBuildSessions = async function (chatbox) {
             let devices;
-            const id = _converse.omemo_store.get('device_id');
             if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
                 const collections = await Promise.all(chatbox.occupants.map(o => getDevicesForContact(o.get('jid'))));
                 devices = collections.reduce((a, b) => _.concat(a, b.models), []);
-
             } else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) {
                 const their_devices = await getDevicesForContact(chatbox.get('jid')),
-                      devicelist = _converse.devicelists.get(_converse.bare_jid),
-                      own_devices = devicelist.devices.filter(d => d.get('id') !== id);
-                devices = _.concat(own_devices, their_devices.models);
+                      own_devices = _converse.devicelists.get(_converse.bare_jid).devices;
+                devices = _.concat(own_devices.models, their_devices.models);
             }
-            // Filter out our own device
-            devices = devices.filter(d => d.get('id') !== id);
-
             await Promise.all(devices.map(d => d.getBundle()));
             await Promise.all(devices.map(d => getSession(d)));
             return devices;
@@ -613,7 +607,7 @@ converse.plugins.add('converse-omemo', {
             // and they are separately encrypted using the
             // session corresponding to the counterpart device.
             stanza.c('encrypted', {'xmlns': Strophe.NS.OMEMO})
-                .c('header', {'sid':  _converse.omemo_store.get('device_id')});
+                  .c('header', {'sid':  _converse.omemo_store.get('device_id')});
 
             return chatbox.encryptMessage(message.get('message')).then(obj => {
                 // The 16 bytes key and the GCM authentication tag (The tag