2018-05-12 19:37:44 +02:00
|
|
|
(function (root, factory) {
|
|
|
|
define(["jasmine", "mock", "converse-core", "test-utils"], factory);
|
|
|
|
} (this, function (jasmine, mock, converse, test_utils) {
|
|
|
|
var Strophe = converse.env.Strophe;
|
|
|
|
var b64_sha1 = converse.env.b64_sha1;
|
|
|
|
var $iq = converse.env.$iq;
|
|
|
|
var _ = converse.env._;
|
|
|
|
|
|
|
|
window.libsignal = {
|
|
|
|
'KeyHelper': {
|
|
|
|
'generateIdentityKeyPair': function () {
|
|
|
|
return Promise.resolve({
|
|
|
|
'pubKey': 1234,
|
|
|
|
'privKey': 4321
|
|
|
|
});
|
|
|
|
},
|
|
|
|
'generateRegistrationId': function () {
|
2018-05-12 23:26:14 +02:00
|
|
|
return '31415';
|
|
|
|
},
|
|
|
|
'generatePreKey': function (keyid) {
|
|
|
|
return Promise.resolve({
|
|
|
|
'keyId': keyid,
|
|
|
|
'keyPair': {
|
|
|
|
'pubKey': 1234,
|
|
|
|
'privKey': 4321
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
'generateSignedPreKey': function (identity_keypair, keyid) {
|
|
|
|
return Promise.resolve({
|
|
|
|
'keyId': keyid,
|
|
|
|
'keyPair': {
|
|
|
|
'pubKey': 1234,
|
|
|
|
'privKey': 4321
|
|
|
|
}
|
|
|
|
});
|
2018-05-12 19:37:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
describe("The OMEMO module", function() {
|
|
|
|
|
|
|
|
it("will add processing hints to sent out encrypted <message> stanzas",
|
|
|
|
mock.initConverseWithPromises(
|
|
|
|
null, ['rosterGroupsFetched'], {},
|
|
|
|
function (done, _converse) {
|
|
|
|
// TODO
|
|
|
|
done();
|
|
|
|
}));
|
|
|
|
|
|
|
|
it("adds a toolbar button for starting an encrypted chat session",
|
|
|
|
mock.initConverseWithPromises(
|
|
|
|
null, ['rosterGroupsFetched'], {},
|
|
|
|
function (done, _converse) {
|
|
|
|
|
2018-05-12 23:26:14 +02:00
|
|
|
let iq_stanza;
|
2018-05-12 19:37:44 +02:00
|
|
|
test_utils.createContacts(_converse, 'current');
|
|
|
|
const contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
|
|
|
|
|
|
|
|
test_utils.waitUntil(function () {
|
|
|
|
return _.filter(_converse.connection.IQ_stanzas, function (iq) {
|
|
|
|
const node = iq.nodeTree.querySelector('iq[to="dummy@localhost"] query[xmlns="http://jabber.org/protocol/disco#info"]');
|
2018-05-12 23:26:14 +02:00
|
|
|
if (node) { iq_stanza = iq.nodeTree; }
|
2018-05-12 19:37:44 +02:00
|
|
|
return node;
|
|
|
|
}).length > 0;
|
|
|
|
}, 1000).then(function () {
|
|
|
|
/* PEP support is prerequisite for OMEMO */
|
|
|
|
const stanza = $iq({
|
|
|
|
'type': 'result',
|
|
|
|
'from': 'dummy@localhost',
|
|
|
|
'to': 'dummy@localhost/resource',
|
2018-05-12 23:26:14 +02:00
|
|
|
'id': iq_stanza.getAttribute('id'),
|
2018-05-12 19:37:44 +02:00
|
|
|
}).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info'})
|
|
|
|
.c('identity', {
|
|
|
|
'category': 'pubsub',
|
|
|
|
'type': 'pep'});
|
|
|
|
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
2018-05-12 23:26:14 +02:00
|
|
|
|
|
|
|
return test_utils.waitUntil(() => {
|
|
|
|
return _.filter(_converse.connection.IQ_stanzas, function (iq) {
|
|
|
|
const node = iq.nodeTree.querySelector('publish[node="eu.siacs.conversations.axolotl.bundles:31415"]');
|
|
|
|
if (node) { iq_stanza = iq.nodeTree; }
|
|
|
|
return node;
|
|
|
|
}).length;
|
|
|
|
});
|
|
|
|
}).then(function () {
|
|
|
|
expect(iq_stanza.getAttributeNames().sort().join()).toBe(["from", "type", "xmlns", "id"].sort().join());
|
|
|
|
expect(iq_stanza.querySelector('prekeys').childNodes.length).toBe(100);
|
|
|
|
|
|
|
|
const signed_prekeys = iq_stanza.querySelectorAll('signedPreKeyPublic');
|
|
|
|
expect(signed_prekeys.length).toBe(1);
|
|
|
|
const signed_prekey = signed_prekeys[0];
|
|
|
|
expect(signed_prekey.getAttribute('signedPreKeyId')).toBe('0')
|
|
|
|
expect(iq_stanza.querySelectorAll('signedPreKeySignature').length).toBe(1);
|
|
|
|
expect(iq_stanza.querySelectorAll('identityKey').length).toBe(1);
|
|
|
|
|
|
|
|
const stanza = $iq({
|
|
|
|
'from': _converse.bare_jid,
|
|
|
|
'id': iq_stanza.getAttribute('id'),
|
|
|
|
'to': _converse.bare_jid,
|
|
|
|
'type': 'result'});
|
|
|
|
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
|
|
|
|
2018-05-12 19:37:44 +02:00
|
|
|
return test_utils.waitUntil(() => {
|
|
|
|
return _.filter(
|
|
|
|
_converse.connection.IQ_stanzas,
|
|
|
|
(iq) => {
|
|
|
|
const node = iq.nodeTree.querySelector('iq[to="'+_converse.bare_jid+'"] query[node="eu.siacs.conversations.axolotl.devicelist"]');
|
2018-05-12 23:26:14 +02:00
|
|
|
if (node) { iq_stanza = iq.nodeTree;}
|
2018-05-12 19:37:44 +02:00
|
|
|
return node;
|
|
|
|
}).length;
|
|
|
|
});
|
|
|
|
}).then(function () {
|
2018-05-12 23:26:14 +02:00
|
|
|
expect(iq_stanza.outerHTML).toBe(
|
|
|
|
'<iq type="get" from="dummy@localhost" to="dummy@localhost" xmlns="jabber:client" id="'+iq_stanza.getAttribute("id")+'">'+
|
|
|
|
'<query xmlns="http://jabber.org/protocol/disco#items" '+
|
|
|
|
'node="eu.siacs.conversations.axolotl.devicelist"/>'+
|
|
|
|
'</iq>');
|
|
|
|
|
2018-05-12 19:37:44 +02:00
|
|
|
const stanza = $iq({
|
|
|
|
'from': contact_jid,
|
2018-05-12 23:26:14 +02:00
|
|
|
'id': iq_stanza.getAttribute('id'),
|
2018-05-12 19:37:44 +02:00
|
|
|
'to': _converse.bare_jid,
|
|
|
|
'type': 'result',
|
|
|
|
}).c('query', {
|
|
|
|
'xmlns': 'http://jabber.org/protocol/disco#items',
|
|
|
|
'node': 'eu.siacs.conversations.axolotl.devicelist'
|
|
|
|
}).c('device', {'id': '482886413b977930064a5888b92134fe'}).up()
|
|
|
|
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
|
|
|
|
|
|
|
expect(_converse.devicelists.length).toBe(1);
|
|
|
|
const devicelist = _converse.devicelists.get(_converse.bare_jid);
|
|
|
|
expect(devicelist.devices.length).toBe(1);
|
|
|
|
expect(devicelist.devices.at(0).get('id')).toBe('482886413b977930064a5888b92134fe');
|
|
|
|
|
|
|
|
test_utils.openChatBoxFor(_converse, contact_jid);
|
|
|
|
return test_utils.waitUntil(() => {
|
|
|
|
return _.filter(
|
|
|
|
_converse.connection.IQ_stanzas,
|
|
|
|
(iq) => {
|
|
|
|
const node = iq.nodeTree.querySelector('iq[to="'+contact_jid+'"] query[node="eu.siacs.conversations.axolotl.devicelist"]');
|
2018-05-12 23:26:14 +02:00
|
|
|
if (node) { iq_stanza = iq.nodeTree; }
|
2018-05-12 19:37:44 +02:00
|
|
|
return node;
|
|
|
|
}).length;});
|
|
|
|
}).then(function () {
|
2018-05-12 23:26:14 +02:00
|
|
|
expect(iq_stanza.outerHTML).toBe(
|
|
|
|
'<iq type="get" from="dummy@localhost" to="'+contact_jid+'" xmlns="jabber:client" id="'+iq_stanza.getAttribute("id")+'">'+
|
|
|
|
'<query xmlns="http://jabber.org/protocol/disco#items" '+
|
|
|
|
'node="eu.siacs.conversations.axolotl.devicelist"/>'+
|
|
|
|
'</iq>');
|
2018-05-12 19:37:44 +02:00
|
|
|
const stanza = $iq({
|
|
|
|
'from': contact_jid,
|
2018-05-12 23:26:14 +02:00
|
|
|
'id': iq_stanza.getAttribute('id'),
|
2018-05-12 19:37:44 +02:00
|
|
|
'to': _converse.bare_jid,
|
|
|
|
'type': 'result',
|
|
|
|
}).c('query', {
|
|
|
|
'xmlns': 'http://jabber.org/protocol/disco#items',
|
|
|
|
'node': 'eu.siacs.conversations.axolotl.devicelist'
|
|
|
|
}).c('device', {'id': '368866411b877c30064a5f62b917cffe'}).up()
|
|
|
|
.c('device', {'id': '3300659945416e274474e469a1f0154c'}).up()
|
|
|
|
.c('device', {'id': '4e30f35051b7b8b42abe083742187228'}).up()
|
|
|
|
.c('device', {'id': 'ae890ac52d0df67ed7cfdf51b644e901'});
|
|
|
|
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
|
|
|
|
|
|
|
expect(_converse.devicelists.length).toBe(2);
|
|
|
|
const devicelist = _converse.devicelists.get(contact_jid);
|
|
|
|
expect(devicelist.devices.length).toBe(4);
|
|
|
|
expect(devicelist.devices.at(0).get('id')).toBe('368866411b877c30064a5f62b917cffe');
|
|
|
|
expect(devicelist.devices.at(1).get('id')).toBe('3300659945416e274474e469a1f0154c');
|
|
|
|
expect(devicelist.devices.at(2).get('id')).toBe('4e30f35051b7b8b42abe083742187228');
|
|
|
|
expect(devicelist.devices.at(3).get('id')).toBe('ae890ac52d0df67ed7cfdf51b644e901');
|
|
|
|
return test_utils.waitUntil(() => _converse.chatboxviews.get(contact_jid).el.querySelector('.chat-toolbar'));
|
|
|
|
}).then(function () {
|
|
|
|
const view = _converse.chatboxviews.get(contact_jid);
|
|
|
|
const toolbar = view.el.querySelector('.chat-toolbar');
|
|
|
|
expect(_.isNull(toolbar.querySelector('.toggle-omemo'))).toBe(false);
|
|
|
|
spyOn(view, 'toggleOMEMO').and.callThrough();
|
|
|
|
view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
|
|
|
toolbar.querySelector('.toggle-omemo').click();
|
|
|
|
expect(view.toggleOMEMO).toHaveBeenCalled();
|
|
|
|
done();
|
2018-05-12 23:26:14 +02:00
|
|
|
}).catch(_.partial(console.error, _));
|
2018-05-12 19:37:44 +02:00
|
|
|
}));
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("A chatbox with an active OMEMO session", function() {
|
|
|
|
|
|
|
|
it("will not show the spoiler toolbar button",
|
|
|
|
mock.initConverseWithPromises(
|
|
|
|
null, ['rosterGroupsFetched'], {},
|
|
|
|
function (done, _converse) {
|
|
|
|
// TODO
|
|
|
|
done()
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
}));
|