diff --git a/js/api.js b/js/api.js index aa2cf221f..ca9497f58 100644 --- a/js/api.js +++ b/js/api.js @@ -146,25 +146,22 @@ var API = new function() { }); }; - this.getKeysForNumber = function(number, success_callback, error_callback) { - doAjax({ + this.getKeysForNumber = function(number) { + return doAjax({ call : 'keys', httpType : 'GET', do_auth : true, urlParameters : "/" + getNumberFromString(number) + "/*", }).then(function(response) { - //TODO: Do this conversion somewhere else? - var res = response.keys; - for (var i = 0; i < res.length; i++) { - res[i].identityKey = base64DecToArr(res[i].identityKey); - res[i].publicKey = base64DecToArr(res[i].publicKey); - if (res[i].keyId === undefined) - res[i].keyId = 0; - } - success_callback(res); - }).catch(function(code) { - if (error_callback !== undefined) - error_callback(code); + //TODO: Do this conversion somewhere else? + var res = response.keys; + for (var i = 0; i < res.length; i++) { + res[i].identityKey = base64DecToArr(res[i].identityKey); + res[i].publicKey = base64DecToArr(res[i].publicKey); + if (res[i].keyId === undefined) + res[i].keyId = 0; + } + return res; }); }; diff --git a/js/crypto.js b/js/crypto.js index 156e877ae..80394c469 100644 --- a/js/crypto.js +++ b/js/crypto.js @@ -362,17 +362,17 @@ window.crypto = (function() { // Decrypts message into a raw string crypto.decryptWebsocketMessage = function(message) { var signaling_key = storage.getEncrypted("signaling_key"); //TODO: in crypto_storage - var aes_key = signaling_key.substring(0, 32); - var mac_key = signaling_key.substring(32, 32 + 20); + var aes_key = toArrayBuffer(signaling_key.substring(0, 32)); + var mac_key = toArrayBuffer(signaling_key.substring(32, 32 + 20)); - var decodedMessage = new Uint8Array(base64DecToArr(getString(message))); - if (decodedMessage[0] != 1) + var decodedMessage = base64DecToArr(getString(message)); + if (new Uint8Array(decodedMessage)[0] != 1) throw new Error("Got bad version number: " + decodedMessage[0]); - var iv = decodedMessage.subarray(1, 1 + 16); - var ciphertext = decodedMessage.subarray(1 + 16, decodedMessage.length - 10); - var ivAndCipherText = decodedMessage.subarray(1, decodedMessage.length - 10); - var mac = decodedMessage.subarray(decodedMessage.length - 10, decodedMessage.length); + var iv = decodedMessage.slice(1, 1 + 16); + var ciphertext = decodedMessage.slice(1 + 16, decodedMessage.byteLength - 10); + var ivAndCipherText = decodedMessage.slice(1, decodedMessage.byteLength - 10); + var mac = decodedMessage.slice(decodedMessage.byteLength - 10, decodedMessage.byteLength); return verifyMACWithVersionByte(ivAndCipherText, mac_key, mac).then(function() { return window.crypto.subtle.decrypt({name: "AES-CBC", iv: iv}, aes_key, ciphertext); diff --git a/js/helpers.js b/js/helpers.js index cee780286..18c4aca5a 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -456,7 +456,7 @@ function subscribeToPush(message_callback) { console.log("Got pong message"); } else if (message.type === undefined && message.id !== undefined) { 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 // b) we should handle them gracefully and tell the user they received an invalid message 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) -function getKeysForNumber(number, success_callback, error_callback) { - API.getKeysForNumber(number, - function(response) { - for (var i = 0; i < response.length; i++) { - try { - saveDeviceObject({ - encodedNumber: number + "." + response[i].deviceId, - identityKey: response[i].identityKey, - publicKey: response[i].publicKey, - preKeyId: response[i].keyId, - registrationId: response[i].registrationId - }); - } catch (e) { - error_callback(e); - return; - } - } - success_callback(response[0].identityKey); - }, function(code) { - error_callback("Error making HTTP request: " + code); - }); +function getKeysForNumber(number) { + return API.getKeysForNumber(number).then(function(response) { + for (var i = 0; i < response.length; i++) { + saveDeviceObject({ + encodedNumber: number + "." + response[i].deviceId, + identityKey: response[i].identityKey, + publicKey: response[i].publicKey, + preKeyId: response[i].keyId, + registrationId: response[i].registrationId + }); + } + return response[0].identityKey; + }); } // success_callback(server success/failure map), error_callback(error_msg) @@ -547,8 +539,8 @@ function sendMessageToNumbers(numbers, message, callback) { callback({success: successfulNumbers, failure: errors}); } - var registerError = function(number, message) { - errors[errors.length] = { number: number, reason: message }; + var registerError = function(number, message, error) { + errors[errors.length] = { number: number, reason: message, error: error }; numberCompleted(); } @@ -560,7 +552,7 @@ function sendMessageToNumbers(numbers, message, callback) { if (error instanceof Error && error.name == "HTTPError" && (error.message == 410 || error.message == 409)) { //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); if (devicesForNumber.length == 0) { - getKeysForNumber(number, function(identity_key) { - devicesForNumber = getDeviceObjectListFromNumber(number); - if (devicesForNumber.length == 0) - registerError(number, new Error("Failed to retreive new device keys for number " + number)); - else - doSendMessage(number, devicesForNumber, message); - }, function(error_msg) { - registerError(number, new Error("Failed to retreive new device keys for number " + number)); - }); + getKeysForNumber(number).then(function(identity_key) { + devicesForNumber = getDeviceObjectListFromNumber(number); + if (devicesForNumber.length == 0) + registerError(number, "Failed to retreive new device keys for number " + number, null); + else + doSendMessage(number, devicesForNumber, message); + }).catch(function(error) { + registerError(number, "Failed to retreive new device keys for number " + number, error); + }); } else doSendMessage(number, devicesForNumber, message); } diff --git a/js/options.js b/js/options.js index 56a1204f8..4017ac8f6 100644 --- a/js/options.js +++ b/js/options.js @@ -101,14 +101,14 @@ $('#init-go').click(function() { } if (!single_device) { - getKeysForNumber(number, function(identityKey) { + getKeysForNumber(number).then(function(identityKey) { subscribeToPush(function(message) { //TODO receive shared identity key register_keys_func(); }); requestIdentityPrivKeyFromMasterDevice(number); - }, function(error_msg) { - alert(error_msg); //TODO + }).catch(function(error) { + alert(error); //TODO }); } else { register_keys_func();