|
@@ -48,14 +48,12 @@ function parseBundle (bundle_el) {
|
|
signed_prekey_signature_el = bundle_el.querySelector('signedPreKeySignature'),
|
|
signed_prekey_signature_el = bundle_el.querySelector('signedPreKeySignature'),
|
|
identity_key_el = bundle_el.querySelector('identityKey');
|
|
identity_key_el = bundle_el.querySelector('identityKey');
|
|
|
|
|
|
- const prekeys = _.map(
|
|
|
|
- sizzle(`prekeys > preKeyPublic`, bundle_el),
|
|
|
|
- (el) => {
|
|
|
|
- return {
|
|
|
|
- 'id': parseInt(el.getAttribute('preKeyId'), 10),
|
|
|
|
- 'key': el.textContent
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
|
|
+ const prekeys = sizzle(`prekeys > preKeyPublic`, bundle_el)
|
|
|
|
+ .map(el => ({
|
|
|
|
+ 'id': parseInt(el.getAttribute('preKeyId'), 10),
|
|
|
|
+ 'key': el.textContent
|
|
|
|
+ }));
|
|
|
|
+
|
|
return {
|
|
return {
|
|
'identity_key': bundle_el.querySelector('identityKey').textContent.trim(),
|
|
'identity_key': bundle_el.querySelector('identityKey').textContent.trim(),
|
|
'signed_prekey': {
|
|
'signed_prekey': {
|
|
@@ -122,8 +120,7 @@ converse.plugins.add('converse-omemo', {
|
|
ev.preventDefault();
|
|
ev.preventDefault();
|
|
ev.stopPropagation();
|
|
ev.stopPropagation();
|
|
ev.target.querySelector('.select-all').checked = false
|
|
ev.target.querySelector('.select-all').checked = false
|
|
- const checkboxes = ev.target.querySelectorAll('.fingerprint-removal-item input[type="checkbox"]:checked'),
|
|
|
|
- device_ids = _.map(checkboxes, 'value');
|
|
|
|
|
|
+ const device_ids = sizzle('.fingerprint-removal-item input[type="checkbox"]:checked', ev.target).map(c => c.value);
|
|
this.devicelist.removeOwnDevices(device_ids)
|
|
this.devicelist.removeOwnDevices(device_ids)
|
|
.then(this.modal.hide)
|
|
.then(this.modal.hide)
|
|
.catch(err => {
|
|
.catch(err => {
|
|
@@ -848,19 +845,19 @@ converse.plugins.add('converse-omemo', {
|
|
},
|
|
},
|
|
|
|
|
|
async generateMissingPreKeys () {
|
|
async generateMissingPreKeys () {
|
|
- const current_keys = this.getPreKeys(),
|
|
|
|
- missing_keys = _.difference(_.invokeMap(_.range(0, _converse.NUM_PREKEYS), Number.prototype.toString), Object.keys(current_keys));
|
|
|
|
-
|
|
|
|
|
|
+ const missing_keys = _.difference(
|
|
|
|
+ _.invokeMap(_.range(0, _converse.NUM_PREKEYS), Number.prototype.toString),
|
|
|
|
+ Object.keys(this.getPreKeys())
|
|
|
|
+ );
|
|
if (missing_keys.length < 1) {
|
|
if (missing_keys.length < 1) {
|
|
_converse.log("No missing prekeys to generate for our own device", Strophe.LogLevel.WARN);
|
|
_converse.log("No missing prekeys to generate for our own device", Strophe.LogLevel.WARN);
|
|
return Promise.resolve();
|
|
return Promise.resolve();
|
|
}
|
|
}
|
|
- const keys = await Promise.all(_.map(missing_keys, id => libsignal.KeyHelper.generatePreKey(parseInt(id, 10))));
|
|
|
|
- _.forEach(keys, k => this.storePreKey(k.keyId, k.keyPair));
|
|
|
|
- const marshalled_keys = _.map(this.getPreKeys(), k => ({'id': k.keyId, 'key': u.arrayBufferToBase64(k.pubKey)})),
|
|
|
|
- devicelist = _converse.devicelists.get(_converse.bare_jid),
|
|
|
|
- device = devicelist.devices.get(this.get('device_id'));
|
|
|
|
-
|
|
|
|
|
|
+ const keys = await Promise.all(missing_keys.map(id => libsignal.KeyHelper.generatePreKey(parseInt(id, 10))));
|
|
|
|
+ keys.forEach(k => this.storePreKey(k.keyId, k.keyPair));
|
|
|
|
+ const marshalled_keys = Object.keys(this.getPreKeys()).map(k => ({'id': k.keyId, 'key': u.arrayBufferToBase64(k.pubKey)}));
|
|
|
|
+ const devicelist = _converse.devicelists.get(_converse.bare_jid);
|
|
|
|
+ const device = devicelist.devices.get(this.get('device_id'));
|
|
const bundle = await device.getBundle();
|
|
const bundle = await device.getBundle();
|
|
device.save('bundle', Object.assign(bundle, {'prekeys': marshalled_keys}));
|
|
device.save('bundle', Object.assign(bundle, {'prekeys': marshalled_keys}));
|
|
},
|
|
},
|
|
@@ -895,11 +892,11 @@ converse.plugins.add('converse-omemo', {
|
|
'public_key': u.arrayBufferToBase64(signed_prekey.keyPair.privKey),
|
|
'public_key': u.arrayBufferToBase64(signed_prekey.keyPair.privKey),
|
|
'signature': u.arrayBufferToBase64(signed_prekey.signature)
|
|
'signature': u.arrayBufferToBase64(signed_prekey.signature)
|
|
}
|
|
}
|
|
- const keys = await Promise.all(_.map(_.range(0, _converse.NUM_PREKEYS), id => libsignal.KeyHelper.generatePreKey(id)));
|
|
|
|
- _.forEach(keys, k => _converse.omemo_store.storePreKey(k.keyId, k.keyPair));
|
|
|
|
- const devicelist = _converse.devicelists.get(_converse.bare_jid),
|
|
|
|
- device = devicelist.devices.create({'id': bundle.device_id, 'jid': _converse.bare_jid}),
|
|
|
|
- marshalled_keys = _.map(keys, k => ({'id': k.keyId, 'key': u.arrayBufferToBase64(k.keyPair.pubKey)}));
|
|
|
|
|
|
+ const keys = await Promise.all(_.range(0, _converse.NUM_PREKEYS).map(id => libsignal.KeyHelper.generatePreKey(id)));
|
|
|
|
+ keys.forEach(k => _converse.omemo_store.storePreKey(k.keyId, k.keyPair));
|
|
|
|
+ const devicelist = _converse.devicelists.get(_converse.bare_jid);
|
|
|
|
+ const device = devicelist.devices.create({'id': bundle.device_id, 'jid': _converse.bare_jid});
|
|
|
|
+ const marshalled_keys = keys.map(k => ({'id': k.keyId, 'key': u.arrayBufferToBase64(k.keyPair.pubKey)}));
|
|
bundle['prekeys'] = marshalled_keys;
|
|
bundle['prekeys'] = marshalled_keys;
|
|
device.save('bundle', bundle);
|
|
device.save('bundle', bundle);
|
|
},
|
|
},
|
|
@@ -1061,7 +1058,7 @@ converse.plugins.add('converse-omemo', {
|
|
_converse.log(e, Strophe.LogLevel.ERROR);
|
|
_converse.log(e, Strophe.LogLevel.ERROR);
|
|
return [];
|
|
return [];
|
|
}
|
|
}
|
|
- const device_ids = _.map(sizzle(`list[xmlns="${Strophe.NS.OMEMO}"] device`, iq), dev => dev.getAttribute('id'));
|
|
|
|
|
|
+ const device_ids = sizzle(`list[xmlns="${Strophe.NS.OMEMO}"] device`, iq).map(dev => dev.getAttribute('id'));
|
|
_.forEach(device_ids, id => this.devices.create({'id': id, 'jid': this.get('jid')}));
|
|
_.forEach(device_ids, id => this.devices.create({'id': id, 'jid': this.get('jid')}));
|
|
return device_ids;
|
|
return device_ids;
|
|
},
|
|
},
|
|
@@ -1133,22 +1130,20 @@ converse.plugins.add('converse-omemo', {
|
|
if (!items_el) {
|
|
if (!items_el) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- const device_ids = _.map(
|
|
|
|
- sizzle(`item list[xmlns="${Strophe.NS.OMEMO}"] device`, items_el),
|
|
|
|
- (device) => device.getAttribute('id')
|
|
|
|
- );
|
|
|
|
- const jid = stanza.getAttribute('from'),
|
|
|
|
- devicelist = _converse.devicelists.getDeviceList(jid),
|
|
|
|
- devices = devicelist.devices,
|
|
|
|
- removed_ids = _.difference(devices.pluck('id'), device_ids);
|
|
|
|
-
|
|
|
|
- _.forEach(removed_ids, (id) => {
|
|
|
|
|
|
+ const device_selector = `item list[xmlns="${Strophe.NS.OMEMO}"] device`;
|
|
|
|
+ const device_ids = sizzle(device_selector, items_el).map(d => d.getAttribute('id'));
|
|
|
|
+ const jid = stanza.getAttribute('from');
|
|
|
|
+ const devicelist = _converse.devicelists.getDeviceList(jid);
|
|
|
|
+ const devices = devicelist.devices;
|
|
|
|
+ const removed_ids = _.difference(devices.pluck('id'), device_ids);
|
|
|
|
+
|
|
|
|
+ removed_ids.forEach(id => {
|
|
if (jid === _converse.bare_jid && id === _converse.omemo_store.get('device_id')) {
|
|
if (jid === _converse.bare_jid && id === _converse.omemo_store.get('device_id')) {
|
|
return // We don't set the current device as inactive
|
|
return // We don't set the current device as inactive
|
|
}
|
|
}
|
|
devices.get(id).save('active', false);
|
|
devices.get(id).save('active', false);
|
|
});
|
|
});
|
|
- _.forEach(device_ids, (device_id) => {
|
|
|
|
|
|
+ device_ids.forEach(device_id => {
|
|
const device = devices.get(device_id);
|
|
const device = devices.get(device_id);
|
|
if (device) {
|
|
if (device) {
|
|
device.save('active', true);
|
|
device.save('active', true);
|