From 525007f944e7087310955f253f18df567190effc Mon Sep 17 00:00:00 2001 From: Mikunj Date: Thu, 8 Nov 2018 07:48:09 +1100 Subject: [PATCH] Added fetching preKey by recipient. --- app/sql.js | 35 ++++++++++++++++++++++++++++++++++- js/signal_protocol_store.js | 34 +++++++++++++--------------------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/app/sql.js b/app/sql.js index 6699a0df5..7c56fec09 100644 --- a/app/sql.js +++ b/app/sql.js @@ -31,6 +31,7 @@ module.exports = { createOrUpdatePreKey, getPreKeyById, + getPreKeyByRecipient, bulkAddPreKeys, removePreKeyById, removeAllPreKeys, @@ -407,6 +408,7 @@ async function updateToSchemaVersion6(currentVersion, instance) { await instance.run( `CREATE TABLE preKeys( id INTEGER PRIMARY KEY ASC, + recipient STRING, json TEXT );` ); @@ -559,11 +561,42 @@ async function removeAllIdentityKeys() { const PRE_KEYS_TABLE = 'preKeys'; async function createOrUpdatePreKey(data) { - return createOrUpdate(PRE_KEYS_TABLE, data); + const { id, recipient } = data; + if (!id) { + throw new Error('createOrUpdate: Provided data did not have a truthy id'); + } + + await db.run( + `INSERT OR REPLACE INTO ${PRE_KEYS_TABLE} ( + id, + recipient, + json + ) values ( + $id, + $recipient, + $json + )`, + { + $id: id, + $recipient: recipient || '', + $json: objectToJSON(data), + } + ); } async function getPreKeyById(id) { return getById(PRE_KEYS_TABLE, id); } +async function getPreKeyByRecipient(recipient) { + const row = await db.get(`SELECT * FROM ${PRE_KEYS_TABLE} WHERE recipient = $recipient;`, { + $recipient: recipient, + }); + + if (!row) { + return null; + } + + return jsonToObject(row.json); +} async function bulkAddPreKeys(array) { return bulkAdd(PRE_KEYS_TABLE, array); } diff --git a/js/signal_protocol_store.js b/js/signal_protocol_store.js index 564080f09..518ca0392 100644 --- a/js/signal_protocol_store.js +++ b/js/signal_protocol_store.js @@ -207,26 +207,18 @@ window.log.error('Failed to fetch prekey:', keyId); return undefined; }, - loadPreKeyForContactIdentityKeyString(contactIdentityKeyString) { - const prekey = new PreKey({ recipient: contactIdentityKeyString }); - return new Promise(resolve => { - prekey.fetch().then( - () => { - window.log.info( - 'Successfully fetched prekey for recipient :', - contactIdentityKeyString - ); - resolve({ - pubKey: prekey.get('publicKey'), - privKey: prekey.get('privateKey'), - keyId: prekey.get('id'), - }); - }, - () => { - resolve(); - } - ); - }); + async loadPreKeyForContactIdentityKeyString(contactIdentityKeyString) { + const key = await window.Signal.Data.getPreKeyByRecipient(contactIdentityKeyString); + + if (key) { + window.log.info('Successfully fetched prekey for recipient:', contactIdentityKeyString); + return { + pubKey: key.publicKey, + privKey: key.privateKey, + keyId: key.id, + recipient: key.recipient, + }; + } }, loadContactPreKey(pubKey) { const prekey = new ContactPreKey({ identityKeyString: pubKey }); @@ -394,7 +386,7 @@ created_at: prekey.created_at, keyId: prekey.id, confirmed: prekey.confirmed, - signature: prekey.get('signature'), + signature: prekey.signature, })); }, async storeSignedPreKey(keyId, keyPair, confirmed, signature) {