From 116e4d2eeba765fb8764740f85793511498cd0a2 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 22 Jun 2017 17:36:54 -0700 Subject: [PATCH] OutgoingMessage: Reduce the calls to registerError In some cases, due to promise chaining and error propagation, we were calling registerError more than once for a given error. This would then cause the overall callback for the send operation to be called with a partial set of errors, as well as duplicates. Note: we do need to find a way to attach identityKey to the OutgoingIdentityKeyError in the case where it comes directly from the encrypt() instead of our pre-key operations. FREEBIE --- js/libtextsecure.js | 27 +++++++++++++++++++-------- libtextsecure/outgoing_message.js | 27 +++++++++++++++++++-------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/js/libtextsecure.js b/js/libtextsecure.js index efbe1a256..0735aa205 100644 --- a/js/libtextsecure.js +++ b/js/libtextsecure.js @@ -38801,10 +38801,9 @@ OutgoingMessage.prototype = { } return builder.processPreKey(device).catch(function(error) { if (error.message === "Identity key changed") { - error = new textsecure.OutgoingIdentityKeyError( - number, this.message.toArrayBuffer(), - this.timestamp, device.identityKey); - this.registerError(number, "Identity key changed", error); + error.timestamp = device.timestamp; + error.originalMessage = this.message.toArrayBuffer(); + error.identityKey = device.identityKey; } throw error; }.bind(this)); @@ -38915,9 +38914,12 @@ OutgoingMessage.prototype = { }.bind(this)); }.bind(this)); } else if (error.message === "Identity key changed") { - error = new textsecure.OutgoingIdentityKeyError( - number, this.message.toArrayBuffer(), this.timestamp); - this.registerError(number, "Identity key changed", error); + error.timestamp = this.timestamp; + error.originalMessage = this.message.toArrayBuffer(); + // looks like this is an error - we don't have the identity key in this situation! + // but we need it to update the identity key when we get a OutgoingIdentityKeyError + // error.identityKey = ????; + throw error; } else { this.registerError(number, "Failed to create or send message", error); } @@ -38960,7 +38962,16 @@ OutgoingMessage.prototype = { return this.getKeysForNumber(number, updateDevices) .then(this.reloadDevicesAndSend(number, true)) .catch(function(error) { - this.registerError(number, "Failed to retreive new device keys for number " + number, error); + if (error.message === "Identity key changed") { + error = new textsecure.OutgoingIdentityKeyError( + number, error.originalMessage, error.timestamp, error.identityKey + ); + this.registerError(number, "Identity key changed", error); + } else { + this.registerError( + number, "Failed to retrieve new device keys for number " + number, error + ); + } }.bind(this)); }.bind(this)); } diff --git a/libtextsecure/outgoing_message.js b/libtextsecure/outgoing_message.js index cc8e1e844..b688572cc 100644 --- a/libtextsecure/outgoing_message.js +++ b/libtextsecure/outgoing_message.js @@ -59,10 +59,9 @@ OutgoingMessage.prototype = { } return builder.processPreKey(device).catch(function(error) { if (error.message === "Identity key changed") { - error = new textsecure.OutgoingIdentityKeyError( - number, this.message.toArrayBuffer(), - this.timestamp, device.identityKey); - this.registerError(number, "Identity key changed", error); + error.timestamp = device.timestamp; + error.originalMessage = this.message.toArrayBuffer(); + error.identityKey = device.identityKey; } throw error; }.bind(this)); @@ -173,9 +172,12 @@ OutgoingMessage.prototype = { }.bind(this)); }.bind(this)); } else if (error.message === "Identity key changed") { - error = new textsecure.OutgoingIdentityKeyError( - number, this.message.toArrayBuffer(), this.timestamp); - this.registerError(number, "Identity key changed", error); + error.timestamp = this.timestamp; + error.originalMessage = this.message.toArrayBuffer(); + // looks like this is an error - we don't have the identity key in this situation! + // but we need it to update the identity key when we get a OutgoingIdentityKeyError + // error.identityKey = ????; + throw error; } else { this.registerError(number, "Failed to create or send message", error); } @@ -218,7 +220,16 @@ OutgoingMessage.prototype = { return this.getKeysForNumber(number, updateDevices) .then(this.reloadDevicesAndSend(number, true)) .catch(function(error) { - this.registerError(number, "Failed to retreive new device keys for number " + number, error); + if (error.message === "Identity key changed") { + error = new textsecure.OutgoingIdentityKeyError( + number, error.originalMessage, error.timestamp, error.identityKey + ); + this.registerError(number, "Identity key changed", error); + } else { + this.registerError( + number, "Failed to retrieve new device keys for number " + number, error + ); + } }.bind(this)); }.bind(this)); }