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
This commit is contained in:
parent
4d4dd3341f
commit
82469713d2
2 changed files with 38 additions and 16 deletions
|
@ -318,7 +318,7 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
saveIdentity: function(identifier, publicKey) {
|
saveIdentity: function(identifier, publicKey, blockingApproval, nonblockingApproval) {
|
||||||
if (identifier === null || identifier === undefined) {
|
if (identifier === null || identifier === undefined) {
|
||||||
throw new Error("Tried to put identity key for undefined/null key");
|
throw new Error("Tried to put identity key for undefined/null key");
|
||||||
}
|
}
|
||||||
|
@ -332,17 +332,41 @@
|
||||||
var oldpublicKey = identityKey.get('publicKey');
|
var oldpublicKey = identityKey.get('publicKey');
|
||||||
if (!oldpublicKey) {
|
if (!oldpublicKey) {
|
||||||
// Lookup failed, or the current key was removed, so save this one.
|
// 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 {
|
} else {
|
||||||
// Key exists, if it matches do nothing, else throw
|
resolve(false);
|
||||||
if (equalArrayBuffers(oldpublicKey, publicKey)) {
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
reject(new Error("Attempted to overwrite a different identity key"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}.bind(this));
|
||||||
});
|
}.bind(this));
|
||||||
},
|
},
|
||||||
isBlockingApprovalRequired: function(identityKey) {
|
isBlockingApprovalRequired: function(identityKey) {
|
||||||
return (!identityKey.get('firstUse')
|
return (!identityKey.get('firstUse')
|
||||||
|
|
|
@ -43,16 +43,14 @@ describe("SignalProtocolStore", function() {
|
||||||
});
|
});
|
||||||
}).then(done,done);
|
}).then(done,done);
|
||||||
});
|
});
|
||||||
it('rejects on key change', function(done) {
|
it('returns true on key change', function(done) {
|
||||||
var newIdentity = libsignal.crypto.getRandomBytes(33);
|
var newIdentity = libsignal.crypto.getRandomBytes(33);
|
||||||
store.saveIdentity(identifier, testKey.pubKey).then(function() {
|
store.saveIdentity(identifier, testKey.pubKey).then(function() {
|
||||||
store.saveIdentity(identifier, newIdentity).then(function() {
|
store.saveIdentity(identifier, newIdentity).then(function(changed) {
|
||||||
done(new Error('Allowed to overwrite identity key'));
|
assert.isTrue(changed);
|
||||||
}).catch(function(e) {
|
|
||||||
assert(e instanceof Error);
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
}).catch(done);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('isTrustedIdentity', function() {
|
describe('isTrustedIdentity', function() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue