From 258a89bc21892e676c60051bc331f9eb1c9ce4c4 Mon Sep 17 00:00:00 2001 From: sachaaaaa Date: Wed, 22 Aug 2018 13:40:16 +1000 Subject: [PATCH] create contactPreKeys and contactSignedPreKeys in database, with load/store helpers (rerun migrations required) --- ...rations_0_database_with_attachment_data.js | 2 + js/signal_protocol_store.js | 70 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/js/modules/migrations/migrations_0_database_with_attachment_data.js b/js/modules/migrations/migrations_0_database_with_attachment_data.js index 2629b887d..9114a5295 100644 --- a/js/modules/migrations/migrations_0_database_with_attachment_data.js +++ b/js/modules/migrations/migrations_0_database_with_attachment_data.js @@ -47,6 +47,8 @@ const migrations = [ transaction.db.createObjectStore('preKeys'); transaction.db.createObjectStore('signedPreKeys'); transaction.db.createObjectStore('items'); + transaction.db.createObjectStore('contactPreKeys'); + transaction.db.createObjectStore('contactSignedPreKeys'); window.log.info('creating debug log'); transaction.db.createObjectStore('debug'); diff --git a/js/signal_protocol_store.js b/js/signal_protocol_store.js index 70dd0cdca..9032f0fcc 100644 --- a/js/signal_protocol_store.js +++ b/js/signal_protocol_store.js @@ -178,6 +178,8 @@ }); const Group = Model.extend({ storeName: 'groups' }); const Item = Model.extend({ storeName: 'items' }); + const ContactPreKey = Model.extend({ storeName: 'contactPreKeys' }); + const ContactSignedPreKey = Model.extend({ storeName: 'contactSignedPreKeys' }); function SignalProtocolStore() {} @@ -219,6 +221,36 @@ ); }); }, + loadContactPreKey(pubKey) { + const prekey = new ContactPreKey({ id: pubKey }); + return new Promise(resolve => { + prekey.fetch().then( + () => { + window.log.info('Successfully fetched contact prekey:', pubKey); + resolve({ + pubKey: prekey.get('publicKey'), + privKey: prekey.get('privateKey'), + }); + }, + () => { + window.log.error('Failed to fetch contact prekey:', pubKey); + resolve(); + } + ); + }); + }, + storeContactPreKey(pubKey, keyPair) { + const prekey = new ContactPreKey({ + id: pubKey, + publicKey: keyPair.pubKey, + privateKey: keyPair.privKey, + }); + return new Promise(resolve => { + prekey.save().always(() => { + resolve(); + }); + }); + }, storePreKey(keyId, keyPair) { const prekey = new PreKey({ id: keyId, @@ -283,6 +315,30 @@ }); }); }, + loadSignedPreKey(pubKey) { + const prekey = new ContactSignedPreKey({ id: pubKey }); + return new Promise(resolve => { + prekey + .fetch() + .then(() => { + window.log.info( + 'Successfully fetched signed prekey:', + prekey.get('id') + ); + resolve({ + pubKey: prekey.get('publicKey'), + privKey: prekey.get('privateKey'), + created_at: prekey.get('created_at'), + keyId: prekey.get('id'), + confirmed: prekey.get('confirmed'), + }); + }) + .fail(() => { + window.log.error('Failed to fetch signed prekey:', pubKey); + resolve(); + }); + }); + }, loadSignedPreKeys() { if (arguments.length > 0) { return Promise.reject( @@ -318,6 +374,20 @@ }); }); }, + storeContactSignedPreKey(pubKey, keyPair, confirmed) { + const prekey = new ContactSignedPreKey({ + id: pubKey, + publicKey: keyPair.pubKey, + privateKey: keyPair.privKey, + created_at: Date.now(), + confirmed: Boolean(confirmed), + }); + return new Promise(resolve => { + prekey.save().always(() => { + resolve(); + }); + }); + }, removeSignedPreKey(keyId) { const prekey = new SignedPreKey({ id: keyId }); return new Promise((resolve, reject) => {