Convert all storage.devices methods to be asynchronous
This commit is contained in:
parent
71715c95bc
commit
9de1572ba6
4 changed files with 366 additions and 322 deletions
|
@ -89,12 +89,12 @@
|
||||||
getIdentityKey: function(identifier) {
|
getIdentityKey: function(identifier) {
|
||||||
if (identifier === null || identifier === undefined)
|
if (identifier === null || identifier === undefined)
|
||||||
throw new Error("Tried to get identity key for undefined/null key");
|
throw new Error("Tried to get identity key for undefined/null key");
|
||||||
return Promise.resolve(convertToArrayBuffer(textsecure.storage.devices.getIdentityKeyForNumber(textsecure.utils.unencodeNumber(identifier)[0])));
|
return convertToArrayBuffer(textsecure.storage.devices.getIdentityKeyForNumber(textsecure.utils.unencodeNumber(identifier)[0]));
|
||||||
},
|
},
|
||||||
putIdentityKey: function(identifier, identityKey) {
|
putIdentityKey: function(identifier, identityKey) {
|
||||||
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");
|
||||||
return Promise.resolve(textsecure.storage.devices.checkSaveIdentityKeyForNumber(textsecure.utils.unencodeNumber(identifier)[0], identityKey));
|
return textsecure.storage.devices.checkSaveIdentityKeyForNumber(textsecure.utils.unencodeNumber(identifier)[0], identityKey);
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Returns a prekeypair object or undefined */
|
/* Returns a prekeypair object or undefined */
|
||||||
|
|
|
@ -38111,7 +38111,6 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
},
|
},
|
||||||
|
|
||||||
putSessionsForDevice: function(encodedNumber, record) {
|
putSessionsForDevice: function(encodedNumber, record) {
|
||||||
return Promise.resolve((function() {
|
|
||||||
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
||||||
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
|
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
|
||||||
|
|
||||||
|
@ -38121,16 +38120,17 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
sessions[deviceId] = record;
|
sessions[deviceId] = record;
|
||||||
textsecure.storage.put("sessions" + number, sessions);
|
textsecure.storage.put("sessions" + number, sessions);
|
||||||
|
|
||||||
var device = textsecure.storage.devices.getDeviceObject(encodedNumber);
|
return textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(device) {
|
||||||
if (device === undefined) {
|
if (device === undefined) {
|
||||||
var identityKey = textsecure.storage.devices.getIdentityKeyForNumber(number);
|
return textsecure.storage.devices.getIdentityKeyForNumber(number).then(function(identityKey) {
|
||||||
device = { encodedNumber: encodedNumber,
|
device = { encodedNumber: encodedNumber,
|
||||||
//TODO: Remove this duplication
|
//TODO: Remove this duplication
|
||||||
identityKey: identityKey
|
identityKey: identityKey
|
||||||
};
|
};
|
||||||
}
|
|
||||||
return textsecure.storage.devices.saveDeviceObject(device);
|
return textsecure.storage.devices.saveDeviceObject(device);
|
||||||
})());
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Use textsecure.storage.devices.removeIdentityKeyForNumber (which calls this) instead
|
// Use textsecure.storage.devices.removeIdentityKeyForNumber (which calls this) instead
|
||||||
|
@ -38150,7 +38150,7 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
},
|
},
|
||||||
|
|
||||||
removeTempKeysFromDevice: function(encodedNumber) {
|
removeTempKeysFromDevice: function(encodedNumber) {
|
||||||
var deviceObject = textsecure.storage.devices.getDeviceObject(encodedNumber);
|
return textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(deviceObject) {
|
||||||
try {
|
try {
|
||||||
delete deviceObject['signedKey'];
|
delete deviceObject['signedKey'];
|
||||||
delete deviceObject['signedKeyId'];
|
delete deviceObject['signedKeyId'];
|
||||||
|
@ -38160,48 +38160,58 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
delete deviceObject['registrationId'];
|
delete deviceObject['registrationId'];
|
||||||
} catch(_) {}
|
} catch(_) {}
|
||||||
return internalSaveDeviceObject(deviceObject, false);
|
return internalSaveDeviceObject(deviceObject, false);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getDeviceObjectsForNumber: function(number) {
|
getDeviceObjectsForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
return [];
|
return [];
|
||||||
return map.devices;
|
return map.devices;
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
getIdentityKeyForNumber: function(number) {
|
getIdentityKeyForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
return map === undefined ? undefined : map.identityKey;
|
return map === undefined ? undefined : map.identityKey;
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
checkSaveIdentityKeyForNumber: function(number, identityKey) {
|
checkSaveIdentityKeyForNumber: function(number, identityKey) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
textsecure.storage.put("devices" + number, { devices: [], identityKey: identityKey});
|
textsecure.storage.put("devices" + number, { devices: [], identityKey: identityKey});
|
||||||
else if (getString(map.identityKey) !== getString(identityKey))
|
else if (getString(map.identityKey) !== getString(identityKey))
|
||||||
throw new Error("Attempted to overwrite a different identity key");
|
throw new Error("Attempted to overwrite a different identity key");
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
removeIdentityKeyForNumber: function(number) {
|
removeIdentityKeyForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
throw new Error("Tried to remove identity for unknown number");
|
throw new Error("Tried to remove identity for unknown number");
|
||||||
textsecure.storage.remove("devices" + number);
|
textsecure.storage.remove("devices" + number);
|
||||||
return textsecure.storage.sessions._removeIdentityKeyForNumber(number);
|
return textsecure.storage.sessions._removeIdentityKeyForNumber(number);
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
getDeviceObject: function(encodedNumber) {
|
getDeviceObject: function(encodedNumber) {
|
||||||
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
||||||
var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) {
|
||||||
|
|
||||||
for (var i in devices)
|
for (var i in devices)
|
||||||
if (devices[i].encodedNumber == encodedNumber)
|
if (devices[i].encodedNumber == encodedNumber)
|
||||||
return devices[i];
|
return devices[i];
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
removeDeviceIdsForNumber: function(number, deviceIdsToRemove) {
|
removeDeviceIdsForNumber: function(number, deviceIdsToRemove) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
throw new Error("Tried to remove device for unknown number");
|
throw new Error("Tried to remove device for unknown number");
|
||||||
|
@ -38229,10 +38239,12 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
map.devices = newDevices;
|
map.devices = newDevices;
|
||||||
textsecure.storage.put("devices" + number, map);
|
textsecure.storage.put("devices" + number, map);
|
||||||
}
|
}
|
||||||
|
})());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var internalSaveDeviceObject = function(deviceObject, onlyKeys) {
|
var internalSaveDeviceObject = function(deviceObject, onlyKeys) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
if (deviceObject.identityKey === undefined || deviceObject.encodedNumber === undefined)
|
if (deviceObject.identityKey === undefined || deviceObject.encodedNumber === undefined)
|
||||||
throw new Error("Tried to store invalid deviceObject");
|
throw new Error("Tried to store invalid deviceObject");
|
||||||
|
|
||||||
|
@ -38266,6 +38278,7 @@ axolotlInternal.RecipientRecord = function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
textsecure.storage.put("devices" + number, map);
|
textsecure.storage.put("devices" + number, map);
|
||||||
|
})());
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -39623,19 +39636,19 @@ window.textsecure.messaging = function() {
|
||||||
//TODO: Dont hit disk for any of the key-fetching!
|
//TODO: Dont hit disk for any of the key-fetching!
|
||||||
function getKeysForNumber(number, updateDevices) {
|
function getKeysForNumber(number, updateDevices) {
|
||||||
var handleResult = function(response) {
|
var handleResult = function(response) {
|
||||||
for (var i in response.devices) {
|
return Promise.all(response.devices.map(function(device) {
|
||||||
if (updateDevices === undefined || updateDevices.indexOf(response.devices[i].deviceId) > -1)
|
if (updateDevices === undefined || updateDevices.indexOf(device.deviceId) > -1)
|
||||||
textsecure.storage.devices.saveKeysToDeviceObject({
|
return textsecure.storage.devices.saveKeysToDeviceObject({
|
||||||
encodedNumber: number + "." + response.devices[i].deviceId,
|
encodedNumber: number + "." + device.deviceId,
|
||||||
identityKey: response.identityKey,
|
identityKey: response.identityKey,
|
||||||
preKey: response.devices[i].preKey.publicKey,
|
preKey: device.preKey.publicKey,
|
||||||
preKeyId: response.devices[i].preKey.keyId,
|
preKeyId: device.preKey.keyId,
|
||||||
signedKey: response.devices[i].signedPreKey.publicKey,
|
signedKey: device.signedPreKey.publicKey,
|
||||||
signedKeyId: response.devices[i].signedPreKey.keyId,
|
signedKeyId: device.signedPreKey.keyId,
|
||||||
signedKeySignature: response.devices[i].signedPreKey.signature,
|
signedKeySignature: device.signedPreKey.signature,
|
||||||
registrationId: response.devices[i].registrationId
|
registrationId: device.registrationId
|
||||||
});
|
});
|
||||||
}
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
var promises = [];
|
var promises = [];
|
||||||
|
@ -39670,8 +39683,7 @@ window.textsecure.messaging = function() {
|
||||||
|
|
||||||
return textsecure.protocol_wrapper.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) {
|
return textsecure.protocol_wrapper.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) {
|
||||||
return textsecure.protocol_wrapper.getRegistrationId(deviceObjectList[i].encodedNumber).then(function(registrationId) {
|
return textsecure.protocol_wrapper.getRegistrationId(deviceObjectList[i].encodedNumber).then(function(registrationId) {
|
||||||
textsecure.storage.devices.removeTempKeysFromDevice(deviceObjectList[i].encodedNumber);
|
return textsecure.storage.devices.removeTempKeysFromDevice(deviceObjectList[i].encodedNumber).then(function() {
|
||||||
|
|
||||||
jsonData[i] = {
|
jsonData[i] = {
|
||||||
type: encryptedMsg.type,
|
type: encryptedMsg.type,
|
||||||
destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1],
|
destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1],
|
||||||
|
@ -39684,6 +39696,7 @@ window.textsecure.messaging = function() {
|
||||||
jsonData[i].relay = deviceObjectList[i].relay;
|
jsonData[i].relay = deviceObjectList[i].relay;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < deviceObjectList.length; i++)
|
for (var i = 0; i < deviceObjectList.length; i++)
|
||||||
|
@ -39768,10 +39781,11 @@ window.textsecure.messaging = function() {
|
||||||
var doSendMessage;
|
var doSendMessage;
|
||||||
var reloadDevicesAndSend = function(number, recurse) {
|
var reloadDevicesAndSend = function(number, recurse) {
|
||||||
return function() {
|
return function() {
|
||||||
var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
if (devicesForNumber.length == 0)
|
if (devicesForNumber.length == 0)
|
||||||
return registerError(number, "Got empty device list when loading device keys", null);
|
return registerError(number, "Got empty device list when loading device keys", null);
|
||||||
doSendMessage(number, devicesForNumber, recurse);
|
doSendMessage(number, devicesForNumber, recurse);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39789,9 +39803,14 @@ window.textsecure.messaging = function() {
|
||||||
if (!recurse)
|
if (!recurse)
|
||||||
return registerError(number, "Hit retry limit attempting to reload device list", error);
|
return registerError(number, "Hit retry limit attempting to reload device list", error);
|
||||||
|
|
||||||
if (error.message == 409)
|
var p;
|
||||||
textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices);
|
if (error.message == 409) {
|
||||||
|
p = textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices);
|
||||||
|
} else {
|
||||||
|
p = Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
p.then(function() {
|
||||||
var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices);
|
var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices);
|
||||||
getKeysForNumber(number, resetDevices)
|
getKeysForNumber(number, resetDevices)
|
||||||
.then(reloadDevicesAndSend(number, false))
|
.then(reloadDevicesAndSend(number, false))
|
||||||
|
@ -39803,22 +39822,21 @@ window.textsecure.messaging = function() {
|
||||||
registerError(number, "Identity key changed", error);
|
registerError(number, "Identity key changed", error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
} else
|
} else
|
||||||
registerError(number, "Failed to create or send message", error);
|
registerError(number, "Failed to create or send message", error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var getDevicesAndSendToNumber = function(number) {
|
var getDevicesAndSendToNumber = function(number) {
|
||||||
var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
|
|
||||||
return Promise.all(devicesForNumber.map(function(device) {
|
return Promise.all(devicesForNumber.map(function(device) {
|
||||||
return textsecure.protocol_wrapper.hasOpenSession(device.encodedNumber).then(function(result) {
|
return textsecure.protocol_wrapper.hasOpenSession(device.encodedNumber).then(function(result) {
|
||||||
if (!result)
|
if (!result)
|
||||||
return getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(device.encodedNumber)[1])]);
|
return getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(device.encodedNumber)[1])]);
|
||||||
});
|
});
|
||||||
})).then(function() {
|
})).then(function() {
|
||||||
devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
|
|
||||||
if (devicesForNumber.length == 0) {
|
if (devicesForNumber.length == 0) {
|
||||||
getKeysForNumber(number)
|
getKeysForNumber(number)
|
||||||
.then(reloadDevicesAndSend(number, true))
|
.then(reloadDevicesAndSend(number, true))
|
||||||
|
@ -39828,7 +39846,9 @@ window.textsecure.messaging = function() {
|
||||||
} else
|
} else
|
||||||
doSendMessage(number, devicesForNumber, true);
|
doSendMessage(number, devicesForNumber, true);
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
for (var i in numbers)
|
for (var i in numbers)
|
||||||
getDevicesAndSendToNumber(numbers[i]);
|
getDevicesAndSendToNumber(numbers[i]);
|
||||||
|
@ -39908,12 +39928,14 @@ window.textsecure.messaging = function() {
|
||||||
proto.body = "TERMINATE";
|
proto.body = "TERMINATE";
|
||||||
proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION;
|
proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION;
|
||||||
return sendIndividualProto(number, proto, Date.now()).then(function(res) {
|
return sendIndividualProto(number, proto, Date.now()).then(function(res) {
|
||||||
var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) {
|
||||||
for (var i in devices)
|
return Promise.all(devices.map(function(device) {
|
||||||
textsecure.protocol_wrapper.closeOpenSessionForDevice(devices[i].encodedNumber);
|
return textsecure.protocol_wrapper.closeOpenSessionForDevice(devices.encodedNumber);
|
||||||
|
})).then(function() {
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) {
|
self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) {
|
||||||
|
|
|
@ -22,19 +22,19 @@ window.textsecure.messaging = function() {
|
||||||
//TODO: Dont hit disk for any of the key-fetching!
|
//TODO: Dont hit disk for any of the key-fetching!
|
||||||
function getKeysForNumber(number, updateDevices) {
|
function getKeysForNumber(number, updateDevices) {
|
||||||
var handleResult = function(response) {
|
var handleResult = function(response) {
|
||||||
for (var i in response.devices) {
|
return Promise.all(response.devices.map(function(device) {
|
||||||
if (updateDevices === undefined || updateDevices.indexOf(response.devices[i].deviceId) > -1)
|
if (updateDevices === undefined || updateDevices.indexOf(device.deviceId) > -1)
|
||||||
textsecure.storage.devices.saveKeysToDeviceObject({
|
return textsecure.storage.devices.saveKeysToDeviceObject({
|
||||||
encodedNumber: number + "." + response.devices[i].deviceId,
|
encodedNumber: number + "." + device.deviceId,
|
||||||
identityKey: response.identityKey,
|
identityKey: response.identityKey,
|
||||||
preKey: response.devices[i].preKey.publicKey,
|
preKey: device.preKey.publicKey,
|
||||||
preKeyId: response.devices[i].preKey.keyId,
|
preKeyId: device.preKey.keyId,
|
||||||
signedKey: response.devices[i].signedPreKey.publicKey,
|
signedKey: device.signedPreKey.publicKey,
|
||||||
signedKeyId: response.devices[i].signedPreKey.keyId,
|
signedKeyId: device.signedPreKey.keyId,
|
||||||
signedKeySignature: response.devices[i].signedPreKey.signature,
|
signedKeySignature: device.signedPreKey.signature,
|
||||||
registrationId: response.devices[i].registrationId
|
registrationId: device.registrationId
|
||||||
});
|
});
|
||||||
}
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
var promises = [];
|
var promises = [];
|
||||||
|
@ -69,8 +69,7 @@ window.textsecure.messaging = function() {
|
||||||
|
|
||||||
return textsecure.protocol_wrapper.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) {
|
return textsecure.protocol_wrapper.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) {
|
||||||
return textsecure.protocol_wrapper.getRegistrationId(deviceObjectList[i].encodedNumber).then(function(registrationId) {
|
return textsecure.protocol_wrapper.getRegistrationId(deviceObjectList[i].encodedNumber).then(function(registrationId) {
|
||||||
textsecure.storage.devices.removeTempKeysFromDevice(deviceObjectList[i].encodedNumber);
|
return textsecure.storage.devices.removeTempKeysFromDevice(deviceObjectList[i].encodedNumber).then(function() {
|
||||||
|
|
||||||
jsonData[i] = {
|
jsonData[i] = {
|
||||||
type: encryptedMsg.type,
|
type: encryptedMsg.type,
|
||||||
destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1],
|
destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1],
|
||||||
|
@ -83,6 +82,7 @@ window.textsecure.messaging = function() {
|
||||||
jsonData[i].relay = deviceObjectList[i].relay;
|
jsonData[i].relay = deviceObjectList[i].relay;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < deviceObjectList.length; i++)
|
for (var i = 0; i < deviceObjectList.length; i++)
|
||||||
|
@ -167,10 +167,11 @@ window.textsecure.messaging = function() {
|
||||||
var doSendMessage;
|
var doSendMessage;
|
||||||
var reloadDevicesAndSend = function(number, recurse) {
|
var reloadDevicesAndSend = function(number, recurse) {
|
||||||
return function() {
|
return function() {
|
||||||
var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
if (devicesForNumber.length == 0)
|
if (devicesForNumber.length == 0)
|
||||||
return registerError(number, "Got empty device list when loading device keys", null);
|
return registerError(number, "Got empty device list when loading device keys", null);
|
||||||
doSendMessage(number, devicesForNumber, recurse);
|
doSendMessage(number, devicesForNumber, recurse);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,9 +189,14 @@ window.textsecure.messaging = function() {
|
||||||
if (!recurse)
|
if (!recurse)
|
||||||
return registerError(number, "Hit retry limit attempting to reload device list", error);
|
return registerError(number, "Hit retry limit attempting to reload device list", error);
|
||||||
|
|
||||||
if (error.message == 409)
|
var p;
|
||||||
textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices);
|
if (error.message == 409) {
|
||||||
|
p = textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices);
|
||||||
|
} else {
|
||||||
|
p = Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
p.then(function() {
|
||||||
var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices);
|
var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices);
|
||||||
getKeysForNumber(number, resetDevices)
|
getKeysForNumber(number, resetDevices)
|
||||||
.then(reloadDevicesAndSend(number, false))
|
.then(reloadDevicesAndSend(number, false))
|
||||||
|
@ -202,22 +208,21 @@ window.textsecure.messaging = function() {
|
||||||
registerError(number, "Identity key changed", error);
|
registerError(number, "Identity key changed", error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
} else
|
} else
|
||||||
registerError(number, "Failed to create or send message", error);
|
registerError(number, "Failed to create or send message", error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var getDevicesAndSendToNumber = function(number) {
|
var getDevicesAndSendToNumber = function(number) {
|
||||||
var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
|
|
||||||
return Promise.all(devicesForNumber.map(function(device) {
|
return Promise.all(devicesForNumber.map(function(device) {
|
||||||
return textsecure.protocol_wrapper.hasOpenSession(device.encodedNumber).then(function(result) {
|
return textsecure.protocol_wrapper.hasOpenSession(device.encodedNumber).then(function(result) {
|
||||||
if (!result)
|
if (!result)
|
||||||
return getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(device.encodedNumber)[1])]);
|
return getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(device.encodedNumber)[1])]);
|
||||||
});
|
});
|
||||||
})).then(function() {
|
})).then(function() {
|
||||||
devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devicesForNumber) {
|
||||||
|
|
||||||
if (devicesForNumber.length == 0) {
|
if (devicesForNumber.length == 0) {
|
||||||
getKeysForNumber(number)
|
getKeysForNumber(number)
|
||||||
.then(reloadDevicesAndSend(number, true))
|
.then(reloadDevicesAndSend(number, true))
|
||||||
|
@ -227,7 +232,9 @@ window.textsecure.messaging = function() {
|
||||||
} else
|
} else
|
||||||
doSendMessage(number, devicesForNumber, true);
|
doSendMessage(number, devicesForNumber, true);
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
for (var i in numbers)
|
for (var i in numbers)
|
||||||
getDevicesAndSendToNumber(numbers[i]);
|
getDevicesAndSendToNumber(numbers[i]);
|
||||||
|
@ -307,12 +314,14 @@ window.textsecure.messaging = function() {
|
||||||
proto.body = "TERMINATE";
|
proto.body = "TERMINATE";
|
||||||
proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION;
|
proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION;
|
||||||
return sendIndividualProto(number, proto, Date.now()).then(function(res) {
|
return sendIndividualProto(number, proto, Date.now()).then(function(res) {
|
||||||
var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) {
|
||||||
for (var i in devices)
|
return Promise.all(devices.map(function(device) {
|
||||||
textsecure.protocol_wrapper.closeOpenSessionForDevice(devices[i].encodedNumber);
|
return textsecure.protocol_wrapper.closeOpenSessionForDevice(devices.encodedNumber);
|
||||||
|
})).then(function() {
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) {
|
self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) {
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
putSessionsForDevice: function(encodedNumber, record) {
|
putSessionsForDevice: function(encodedNumber, record) {
|
||||||
return Promise.resolve((function() {
|
|
||||||
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
||||||
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
|
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
|
||||||
|
|
||||||
|
@ -50,16 +49,17 @@
|
||||||
sessions[deviceId] = record;
|
sessions[deviceId] = record;
|
||||||
textsecure.storage.put("sessions" + number, sessions);
|
textsecure.storage.put("sessions" + number, sessions);
|
||||||
|
|
||||||
var device = textsecure.storage.devices.getDeviceObject(encodedNumber);
|
return textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(device) {
|
||||||
if (device === undefined) {
|
if (device === undefined) {
|
||||||
var identityKey = textsecure.storage.devices.getIdentityKeyForNumber(number);
|
return textsecure.storage.devices.getIdentityKeyForNumber(number).then(function(identityKey) {
|
||||||
device = { encodedNumber: encodedNumber,
|
device = { encodedNumber: encodedNumber,
|
||||||
//TODO: Remove this duplication
|
//TODO: Remove this duplication
|
||||||
identityKey: identityKey
|
identityKey: identityKey
|
||||||
};
|
};
|
||||||
}
|
|
||||||
return textsecure.storage.devices.saveDeviceObject(device);
|
return textsecure.storage.devices.saveDeviceObject(device);
|
||||||
})());
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Use textsecure.storage.devices.removeIdentityKeyForNumber (which calls this) instead
|
// Use textsecure.storage.devices.removeIdentityKeyForNumber (which calls this) instead
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
removeTempKeysFromDevice: function(encodedNumber) {
|
removeTempKeysFromDevice: function(encodedNumber) {
|
||||||
var deviceObject = textsecure.storage.devices.getDeviceObject(encodedNumber);
|
return textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(deviceObject) {
|
||||||
try {
|
try {
|
||||||
delete deviceObject['signedKey'];
|
delete deviceObject['signedKey'];
|
||||||
delete deviceObject['signedKeyId'];
|
delete deviceObject['signedKeyId'];
|
||||||
|
@ -89,48 +89,58 @@
|
||||||
delete deviceObject['registrationId'];
|
delete deviceObject['registrationId'];
|
||||||
} catch(_) {}
|
} catch(_) {}
|
||||||
return internalSaveDeviceObject(deviceObject, false);
|
return internalSaveDeviceObject(deviceObject, false);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getDeviceObjectsForNumber: function(number) {
|
getDeviceObjectsForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
return [];
|
return [];
|
||||||
return map.devices;
|
return map.devices;
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
getIdentityKeyForNumber: function(number) {
|
getIdentityKeyForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
return map === undefined ? undefined : map.identityKey;
|
return map === undefined ? undefined : map.identityKey;
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
checkSaveIdentityKeyForNumber: function(number, identityKey) {
|
checkSaveIdentityKeyForNumber: function(number, identityKey) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
textsecure.storage.put("devices" + number, { devices: [], identityKey: identityKey});
|
textsecure.storage.put("devices" + number, { devices: [], identityKey: identityKey});
|
||||||
else if (getString(map.identityKey) !== getString(identityKey))
|
else if (getString(map.identityKey) !== getString(identityKey))
|
||||||
throw new Error("Attempted to overwrite a different identity key");
|
throw new Error("Attempted to overwrite a different identity key");
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
removeIdentityKeyForNumber: function(number) {
|
removeIdentityKeyForNumber: function(number) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
throw new Error("Tried to remove identity for unknown number");
|
throw new Error("Tried to remove identity for unknown number");
|
||||||
textsecure.storage.remove("devices" + number);
|
textsecure.storage.remove("devices" + number);
|
||||||
return textsecure.storage.sessions._removeIdentityKeyForNumber(number);
|
return textsecure.storage.sessions._removeIdentityKeyForNumber(number);
|
||||||
|
})());
|
||||||
},
|
},
|
||||||
|
|
||||||
getDeviceObject: function(encodedNumber) {
|
getDeviceObject: function(encodedNumber) {
|
||||||
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
|
||||||
var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number);
|
return textsecure.storage.devices.getDeviceObjectsForNumber(number).then(function(devices) {
|
||||||
|
|
||||||
for (var i in devices)
|
for (var i in devices)
|
||||||
if (devices[i].encodedNumber == encodedNumber)
|
if (devices[i].encodedNumber == encodedNumber)
|
||||||
return devices[i];
|
return devices[i];
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
removeDeviceIdsForNumber: function(number, deviceIdsToRemove) {
|
removeDeviceIdsForNumber: function(number, deviceIdsToRemove) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
var map = textsecure.storage.get("devices" + number);
|
var map = textsecure.storage.get("devices" + number);
|
||||||
if (map === undefined)
|
if (map === undefined)
|
||||||
throw new Error("Tried to remove device for unknown number");
|
throw new Error("Tried to remove device for unknown number");
|
||||||
|
@ -158,10 +168,12 @@
|
||||||
map.devices = newDevices;
|
map.devices = newDevices;
|
||||||
textsecure.storage.put("devices" + number, map);
|
textsecure.storage.put("devices" + number, map);
|
||||||
}
|
}
|
||||||
|
})());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var internalSaveDeviceObject = function(deviceObject, onlyKeys) {
|
var internalSaveDeviceObject = function(deviceObject, onlyKeys) {
|
||||||
|
return Promise.resolve((function() {
|
||||||
if (deviceObject.identityKey === undefined || deviceObject.encodedNumber === undefined)
|
if (deviceObject.identityKey === undefined || deviceObject.encodedNumber === undefined)
|
||||||
throw new Error("Tried to store invalid deviceObject");
|
throw new Error("Tried to store invalid deviceObject");
|
||||||
|
|
||||||
|
@ -195,5 +207,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
textsecure.storage.put("devices" + number, map);
|
textsecure.storage.put("devices" + number, map);
|
||||||
|
})());
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue