promises, type conversion errors

This commit is contained in:
Matt Corallo 2014-05-13 15:15:45 -04:00
parent caa363b929
commit 5752a772d1
4 changed files with 48 additions and 59 deletions

View file

@ -146,25 +146,22 @@ var API = new function() {
}); });
}; };
this.getKeysForNumber = function(number, success_callback, error_callback) { this.getKeysForNumber = function(number) {
doAjax({ return doAjax({
call : 'keys', call : 'keys',
httpType : 'GET', httpType : 'GET',
do_auth : true, do_auth : true,
urlParameters : "/" + getNumberFromString(number) + "/*", urlParameters : "/" + getNumberFromString(number) + "/*",
}).then(function(response) { }).then(function(response) {
//TODO: Do this conversion somewhere else? //TODO: Do this conversion somewhere else?
var res = response.keys; var res = response.keys;
for (var i = 0; i < res.length; i++) { for (var i = 0; i < res.length; i++) {
res[i].identityKey = base64DecToArr(res[i].identityKey); res[i].identityKey = base64DecToArr(res[i].identityKey);
res[i].publicKey = base64DecToArr(res[i].publicKey); res[i].publicKey = base64DecToArr(res[i].publicKey);
if (res[i].keyId === undefined) if (res[i].keyId === undefined)
res[i].keyId = 0; res[i].keyId = 0;
} }
success_callback(res); return res;
}).catch(function(code) {
if (error_callback !== undefined)
error_callback(code);
}); });
}; };

View file

@ -362,17 +362,17 @@ window.crypto = (function() {
// Decrypts message into a raw string // Decrypts message into a raw string
crypto.decryptWebsocketMessage = function(message) { crypto.decryptWebsocketMessage = function(message) {
var signaling_key = storage.getEncrypted("signaling_key"); //TODO: in crypto_storage var signaling_key = storage.getEncrypted("signaling_key"); //TODO: in crypto_storage
var aes_key = signaling_key.substring(0, 32); var aes_key = toArrayBuffer(signaling_key.substring(0, 32));
var mac_key = signaling_key.substring(32, 32 + 20); var mac_key = toArrayBuffer(signaling_key.substring(32, 32 + 20));
var decodedMessage = new Uint8Array(base64DecToArr(getString(message))); var decodedMessage = base64DecToArr(getString(message));
if (decodedMessage[0] != 1) if (new Uint8Array(decodedMessage)[0] != 1)
throw new Error("Got bad version number: " + decodedMessage[0]); throw new Error("Got bad version number: " + decodedMessage[0]);
var iv = decodedMessage.subarray(1, 1 + 16); var iv = decodedMessage.slice(1, 1 + 16);
var ciphertext = decodedMessage.subarray(1 + 16, decodedMessage.length - 10); var ciphertext = decodedMessage.slice(1 + 16, decodedMessage.byteLength - 10);
var ivAndCipherText = decodedMessage.subarray(1, decodedMessage.length - 10); var ivAndCipherText = decodedMessage.slice(1, decodedMessage.byteLength - 10);
var mac = decodedMessage.subarray(decodedMessage.length - 10, decodedMessage.length); var mac = decodedMessage.slice(decodedMessage.byteLength - 10, decodedMessage.byteLength);
return verifyMACWithVersionByte(ivAndCipherText, mac_key, mac).then(function() { return verifyMACWithVersionByte(ivAndCipherText, mac_key, mac).then(function() {
return window.crypto.subtle.decrypt({name: "AES-CBC", iv: iv}, aes_key, ciphertext); return window.crypto.subtle.decrypt({name: "AES-CBC", iv: iv}, aes_key, ciphertext);

View file

@ -456,7 +456,7 @@ function subscribeToPush(message_callback) {
console.log("Got pong message"); console.log("Got pong message");
} else if (message.type === undefined && message.id !== undefined) { } else if (message.type === undefined && message.id !== undefined) {
crypto.decryptWebsocketMessage(message.message).then(function(plaintext) { crypto.decryptWebsocketMessage(message.message).then(function(plaintext) {
var proto = decodeIncomingPushMessageProtobuf(plaintext); var proto = decodeIncomingPushMessageProtobuf(getString(plaintext));
// After this point, a) decoding errors are not the server's fault, and // After this point, a) decoding errors are not the server's fault, and
// b) we should handle them gracefully and tell the user they received an invalid message // b) we should handle them gracefully and tell the user they received an invalid message
console.log("Successfully decoded message with id: " + message.id); console.log("Successfully decoded message with id: " + message.id);
@ -473,27 +473,19 @@ function subscribeToPush(message_callback) {
} }
// success_callback(identity_key), error_callback(error_msg) // success_callback(identity_key), error_callback(error_msg)
function getKeysForNumber(number, success_callback, error_callback) { function getKeysForNumber(number) {
API.getKeysForNumber(number, return API.getKeysForNumber(number).then(function(response) {
function(response) { for (var i = 0; i < response.length; i++) {
for (var i = 0; i < response.length; i++) { saveDeviceObject({
try { encodedNumber: number + "." + response[i].deviceId,
saveDeviceObject({ identityKey: response[i].identityKey,
encodedNumber: number + "." + response[i].deviceId, publicKey: response[i].publicKey,
identityKey: response[i].identityKey, preKeyId: response[i].keyId,
publicKey: response[i].publicKey, registrationId: response[i].registrationId
preKeyId: response[i].keyId, });
registrationId: response[i].registrationId }
}); return response[0].identityKey;
} catch (e) { });
error_callback(e);
return;
}
}
success_callback(response[0].identityKey);
}, function(code) {
error_callback("Error making HTTP request: " + code);
});
} }
// success_callback(server success/failure map), error_callback(error_msg) // success_callback(server success/failure map), error_callback(error_msg)
@ -547,8 +539,8 @@ function sendMessageToNumbers(numbers, message, callback) {
callback({success: successfulNumbers, failure: errors}); callback({success: successfulNumbers, failure: errors});
} }
var registerError = function(number, message) { var registerError = function(number, message, error) {
errors[errors.length] = { number: number, reason: message }; errors[errors.length] = { number: number, reason: message, error: error };
numberCompleted(); numberCompleted();
} }
@ -560,7 +552,7 @@ function sendMessageToNumbers(numbers, message, callback) {
if (error instanceof Error && error.name == "HTTPError" && (error.message == 410 || error.message == 409)) { if (error instanceof Error && error.name == "HTTPError" && (error.message == 410 || error.message == 409)) {
//TODO: Re-request keys for number here //TODO: Re-request keys for number here
} }
registerError(number, error); registerError(number, "Failed to create or send message", error);
}); });
} }
@ -569,15 +561,15 @@ function sendMessageToNumbers(numbers, message, callback) {
var devicesForNumber = getDeviceObjectListFromNumber(number); var devicesForNumber = getDeviceObjectListFromNumber(number);
if (devicesForNumber.length == 0) { if (devicesForNumber.length == 0) {
getKeysForNumber(number, function(identity_key) { getKeysForNumber(number).then(function(identity_key) {
devicesForNumber = getDeviceObjectListFromNumber(number); devicesForNumber = getDeviceObjectListFromNumber(number);
if (devicesForNumber.length == 0) if (devicesForNumber.length == 0)
registerError(number, new Error("Failed to retreive new device keys for number " + number)); registerError(number, "Failed to retreive new device keys for number " + number, null);
else else
doSendMessage(number, devicesForNumber, message); doSendMessage(number, devicesForNumber, message);
}, function(error_msg) { }).catch(function(error) {
registerError(number, new Error("Failed to retreive new device keys for number " + number)); registerError(number, "Failed to retreive new device keys for number " + number, error);
}); });
} else } else
doSendMessage(number, devicesForNumber, message); doSendMessage(number, devicesForNumber, message);
} }

View file

@ -101,14 +101,14 @@ $('#init-go').click(function() {
} }
if (!single_device) { if (!single_device) {
getKeysForNumber(number, function(identityKey) { getKeysForNumber(number).then(function(identityKey) {
subscribeToPush(function(message) { subscribeToPush(function(message) {
//TODO receive shared identity key //TODO receive shared identity key
register_keys_func(); register_keys_func();
}); });
requestIdentityPrivKeyFromMasterDevice(number); requestIdentityPrivKeyFromMasterDevice(number);
}, function(error_msg) { }).catch(function(error) {
alert(error_msg); //TODO alert(error); //TODO
}); });
} else { } else {
register_keys_func(); register_keys_func();