Skip to content

Commit

Permalink
Update saveIdentity
Browse files Browse the repository at this point in the history
Add support new blockingApproval and nonblockingApproval arguments
Populate the firstUse property on identity key records
Return whether an existing record was overwritten.

References
signalapp/Signal-Android@39d4a7#diff-69ede72c549da6bcbcd959935995b7e9R45

// FREEBIE
  • Loading branch information
liliakai authored and scottnonnenberg committed Aug 4, 2017
1 parent 4d4dd33 commit 8246971
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 16 deletions.
44 changes: 34 additions & 10 deletions js/signal_protocol_store.js
Expand Up @@ -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");
}
Expand All @@ -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')
Expand Down
10 changes: 4 additions & 6 deletions test/storage_test.js
Expand Up @@ -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() {
Expand Down

0 comments on commit 8246971

Please sign in to comment.