From 82469713d2967358f8565ea16562dc4579a482c8 Mon Sep 17 00:00:00 2001 From: lilia Date: Wed, 24 May 2017 13:54:14 -0700 Subject: [PATCH] Update saveIdentity Add support new blockingApproval and nonblockingApproval arguments Populate the firstUse property on identity key records Return whether an existing record was overwritten. References https://github.com/WhisperSystems/Signal-Android/commit/39d4a7#diff-69ede72c549da6bcbcd959935995b7e9R45 // FREEBIE --- js/signal_protocol_store.js | 44 ++++++++++++++++++++++++++++--------- test/storage_test.js | 10 ++++----- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/js/signal_protocol_store.js b/js/signal_protocol_store.js index 2d1a2b5ba..a17e38177 100644 --- a/js/signal_protocol_store.js +++ b/js/signal_protocol_store.js @@ -318,7 +318,7 @@ }); }); }, - saveIdentity: function(identifier, publicKey) { + saveIdentity: function(identifier, publicKey, blockingApproval, nonblockingApproval) { if (identifier === null || identifier === undefined) { throw new Error("Tried to put identity key for undefined/null key"); } @@ -332,17 +332,41 @@ var oldpublicKey = identityKey.get('publicKey'); if (!oldpublicKey) { // Lookup failed, or the current key was removed, so save this one. - identityKey.save({publicKey: publicKey}).then(resolve); + console.log("Saving new identity..."); + identityKey.save({ + publicKey : publicKey, + firstUse : true, + timestamp : Date.now(), + blockingApproval : blockingApproval, + nonblockingApproval : nonblockingApproval, + }).then(function() { + resolve(false); + }); + } else if (!equalArrayBuffers(oldpublicKey, publicKey)) { + console.log("Replacing existing identity..."); + identityKey.save({ + publicKey : publicKey, + firstUse : false, + timestamp : Date.now(), + blockingApproval : blockingApproval, + nonblockingApproval : nonblockingApproval, + }).then(function() { + this.trigger('keychange', identifier); + resolve(true); + }.bind(this)); + } else if (this.isBlockingApprovalRequired(identityKey) || this.isNonBlockingApprovalRequired(identityKey)) { + console.log("Setting approval status..."); + identityKey.save({ + blockingApproval : blockingApproval, + nonblockingApproval : nonblockingApproval, + }).then(function() { + resolve(false); + }); } else { - // Key exists, if it matches do nothing, else throw - if (equalArrayBuffers(oldpublicKey, publicKey)) { - resolve(); - } else { - reject(new Error("Attempted to overwrite a different identity key")); - } + resolve(false); } - }); - }); + }.bind(this)); + }.bind(this)); }, isBlockingApprovalRequired: function(identityKey) { return (!identityKey.get('firstUse') diff --git a/test/storage_test.js b/test/storage_test.js index 18ea91301..bd255a490 100644 --- a/test/storage_test.js +++ b/test/storage_test.js @@ -43,16 +43,14 @@ describe("SignalProtocolStore", function() { }); }).then(done,done); }); - it('rejects on key change', function(done) { + it('returns true on key change', function(done) { var newIdentity = libsignal.crypto.getRandomBytes(33); store.saveIdentity(identifier, testKey.pubKey).then(function() { - store.saveIdentity(identifier, newIdentity).then(function() { - done(new Error('Allowed to overwrite identity key')); - }).catch(function(e) { - assert(e instanceof Error); + store.saveIdentity(identifier, newIdentity).then(function(changed) { + assert.isTrue(changed); done(); }); - }); + }).catch(done); }); }); describe('isTrustedIdentity', function() {