Use deviceIds/addresses instead of encodedNumbers

The getDeviceObjectsForNumber method returns device objects that contain
nothing but the encodedNumber property. Instead, just deal in deviceIds
until a SignalProtocolAddress is constructed to manage both the number
and deviceId.

// FREEBIE
This commit is contained in:
lilia 2016-05-03 23:02:35 -07:00
parent 95935f70ee
commit d32a352d8a
3 changed files with 30 additions and 32 deletions

View file

@ -38568,11 +38568,11 @@ OutgoingMessage.prototype = {
}, },
reloadDevicesAndSend: function(number, recurse) { reloadDevicesAndSend: function(number, recurse) {
return function() { return function() {
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) { return textsecure.storage.protocol.getDeviceIds(number).then(function(deviceIds) {
if (devicesForNumber.length == 0) { if (deviceIds.length == 0) {
return this.registerError(number, "Got empty device list when loading device keys", null); return this.registerError(number, "Got empty device list when loading device keys", null);
} }
return this.doSendMessage(number, devicesForNumber, recurse); return this.doSendMessage(number, deviceIds, recurse);
}.bind(this)); }.bind(this));
}.bind(this); }.bind(this);
}, },
@ -38623,14 +38623,14 @@ OutgoingMessage.prototype = {
}); });
}, },
doSendMessage: function(number, devicesForNumber, recurse) { doSendMessage: function(number, deviceIds, recurse) {
var ciphers = {}; var ciphers = {};
var plaintext = this.message.toArrayBuffer(); var plaintext = this.message.toArrayBuffer();
return Promise.all(devicesForNumber.map(function(device) { return Promise.all(deviceIds.map(function(deviceId) {
var address = libsignal.SignalProtocolAddress.fromString(device.encodedNumber); var address = new libsignal.SignalProtocolAddress(number, deviceId);
var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address); var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address);
ciphers[address.getDeviceId()] = sessionCipher; ciphers[address.getDeviceId()] = sessionCipher;
return this.encryptToDevice(device, plaintext, sessionCipher); return this.encryptToDevice(address, plaintext, sessionCipher);
}.bind(this))).then(function(jsonData) { }.bind(this))).then(function(jsonData) {
return this.transmitMessage(number, jsonData, this.timestamp).then(function() { return this.transmitMessage(number, jsonData, this.timestamp).then(function() {
this.successfulNumbers[this.successfulNumbers.length] = number; this.successfulNumbers[this.successfulNumbers.length] = number;
@ -38664,19 +38664,19 @@ OutgoingMessage.prototype = {
}.bind(this)); }.bind(this));
}, },
encryptToDevice: function(device, plaintext, sessionCipher) { encryptToDevice: function(address, plaintext, sessionCipher) {
return Promise.all([ return Promise.all([
sessionCipher.encrypt(plaintext), sessionCipher.encrypt(plaintext),
sessionCipher.getRemoteRegistrationId() sessionCipher.getRemoteRegistrationId()
]).then(function(result) { ]).then(function(result) {
return this.toJSON(device, result[0], result[1]); return this.toJSON(address, result[0], result[1]);
}.bind(this)); }.bind(this));
}, },
toJSON: function(device, encryptedMsg, registrationId) { toJSON: function(address, encryptedMsg, registrationId) {
var json = { var json = {
type: encryptedMsg.type, type: encryptedMsg.type,
destinationDeviceId: textsecure.utils.unencodeNumber(device.encodedNumber)[1], destinationDeviceId: address.getDeviceId(),
destinationRegistrationId: registrationId destinationRegistrationId: registrationId
}; };
@ -38998,11 +38998,10 @@ MessageSender.prototype = {
proto.body = "TERMINATE"; proto.body = "TERMINATE";
proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION; proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION;
return this.sendIndividualProto(number, proto, timestamp).then(function(res) { return this.sendIndividualProto(number, proto, timestamp).then(function(res) {
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) { return textsecure.storage.protocol.getDeviceIds(number).then(function(deviceIds) {
return Promise.all(devices.map(function(device) { return Promise.all(deviceIds.map(function(deviceId) {
console.log('closing session for', device.encodedNumber); var address = new libsignal.SignalProtocolAddress(number, deviceId);
console.log('closing session for', address.toString());
var address = libsignal.SignalProtocolAddress.fromString(device.encodedNumber);
var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address); var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address);
return sessionCipher.closeOpenSessionForDevice(); return sessionCipher.closeOpenSessionForDevice();
})).then(function() { })).then(function() {

View file

@ -34,11 +34,11 @@ OutgoingMessage.prototype = {
}, },
reloadDevicesAndSend: function(number, recurse) { reloadDevicesAndSend: function(number, recurse) {
return function() { return function() {
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) { return textsecure.storage.protocol.getDeviceIds(number).then(function(deviceIds) {
if (devicesForNumber.length == 0) { if (deviceIds.length == 0) {
return this.registerError(number, "Got empty device list when loading device keys", null); return this.registerError(number, "Got empty device list when loading device keys", null);
} }
return this.doSendMessage(number, devicesForNumber, recurse); return this.doSendMessage(number, deviceIds, recurse);
}.bind(this)); }.bind(this));
}.bind(this); }.bind(this);
}, },
@ -89,14 +89,14 @@ OutgoingMessage.prototype = {
}); });
}, },
doSendMessage: function(number, devicesForNumber, recurse) { doSendMessage: function(number, deviceIds, recurse) {
var ciphers = {}; var ciphers = {};
var plaintext = this.message.toArrayBuffer(); var plaintext = this.message.toArrayBuffer();
return Promise.all(devicesForNumber.map(function(device) { return Promise.all(deviceIds.map(function(deviceId) {
var address = libsignal.SignalProtocolAddress.fromString(device.encodedNumber); var address = new libsignal.SignalProtocolAddress(number, deviceId);
var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address); var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address);
ciphers[address.getDeviceId()] = sessionCipher; ciphers[address.getDeviceId()] = sessionCipher;
return this.encryptToDevice(device, plaintext, sessionCipher); return this.encryptToDevice(address, plaintext, sessionCipher);
}.bind(this))).then(function(jsonData) { }.bind(this))).then(function(jsonData) {
return this.transmitMessage(number, jsonData, this.timestamp).then(function() { return this.transmitMessage(number, jsonData, this.timestamp).then(function() {
this.successfulNumbers[this.successfulNumbers.length] = number; this.successfulNumbers[this.successfulNumbers.length] = number;
@ -130,19 +130,19 @@ OutgoingMessage.prototype = {
}.bind(this)); }.bind(this));
}, },
encryptToDevice: function(device, plaintext, sessionCipher) { encryptToDevice: function(address, plaintext, sessionCipher) {
return Promise.all([ return Promise.all([
sessionCipher.encrypt(plaintext), sessionCipher.encrypt(plaintext),
sessionCipher.getRemoteRegistrationId() sessionCipher.getRemoteRegistrationId()
]).then(function(result) { ]).then(function(result) {
return this.toJSON(device, result[0], result[1]); return this.toJSON(address, result[0], result[1]);
}.bind(this)); }.bind(this));
}, },
toJSON: function(device, encryptedMsg, registrationId) { toJSON: function(address, encryptedMsg, registrationId) {
var json = { var json = {
type: encryptedMsg.type, type: encryptedMsg.type,
destinationDeviceId: textsecure.utils.unencodeNumber(device.encodedNumber)[1], destinationDeviceId: address.getDeviceId(),
destinationRegistrationId: registrationId destinationRegistrationId: registrationId
}; };

View file

@ -295,11 +295,10 @@ MessageSender.prototype = {
proto.body = "TERMINATE"; proto.body = "TERMINATE";
proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION; proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION;
return this.sendIndividualProto(number, proto, timestamp).then(function(res) { return this.sendIndividualProto(number, proto, timestamp).then(function(res) {
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) { return textsecure.storage.protocol.getDeviceIds(number).then(function(deviceIds) {
return Promise.all(devices.map(function(device) { return Promise.all(deviceIds.map(function(deviceId) {
console.log('closing session for', device.encodedNumber); var address = new libsignal.SignalProtocolAddress(number, deviceId);
console.log('closing session for', address.toString());
var address = libsignal.SignalProtocolAddress.fromString(device.encodedNumber);
var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address); var sessionCipher = new libsignal.SessionCipher(textsecure.storage.protocol, address);
return sessionCipher.closeOpenSessionForDevice(); return sessionCipher.closeOpenSessionForDevice();
})).then(function() { })).then(function() {