From 5e62d0cfd83f837cdf6d52b6d0078ae2b73f9523 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 22 Jun 2017 14:03:05 -0700 Subject: [PATCH] Update identity key after a send error tells us it has changed FREEBIE --- js/models/conversations.js | 4 ++++ js/models/messages.js | 30 +++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 25d05f2eb..b5f9fb01d 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -46,6 +46,7 @@ }); this.messageCollection.on('change:errors', this.handleMessageError, this); + this.messageCollection.on('send-error', this.onMessageError, this); this.on('change:avatar', this.updateAvatarUrl); this.on('destroy', this.revokeAvatarUrl); @@ -55,6 +56,9 @@ return this.id === this.ourNumber; }, + onMessageError: function() { + this.updateVerified(); + }, updateVerified: function() { if (this.isPrivate()) { return Promise.all([ diff --git a/js/models/messages.js b/js/models/messages.js index d56a9a1d0..c243bd09f 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -211,15 +211,6 @@ } this.save({sent: true, expirationStartTimestamp: now}); this.sendSyncMessage(); - - // var error = new Error('OutgoingIdentityKeyError'); - // error.name = 'OutgoingIdentityKeyError'; - // error.number = result.successfulNumbers[0]; - // throw error; - - // var error = new Error('OutgoingMessageError'); - // error.name = 'OutgoingMessageError'; - // throw error; }.bind(this)).catch(function(result) { var now = Date.now(); this.trigger('done'); @@ -227,19 +218,36 @@ this.set({dataMessage: result.dataMessage}); } + var promises = []; + if (result instanceof Error) { this.saveErrors(result); if (result.name === 'SignedPreKeyRotationError') { - getAccountManager().rotateSignedPreKey(); + return getAccountManager().rotateSignedPreKey(); + } + else if (result.name === 'OutgoingIdentityKeyError') { + promises.push(textsecure.storage.protocol.saveIdentity( + result.number, result.identityKey, false + )); } } else { this.saveErrors(result.errors); if (result.successfulNumbers.length > 0) { this.set({sent: true, expirationStartTimestamp: now}); - this.sendSyncMessage(); + promises.push(this.sendSyncMessage()); } + promises = promises.concat(_.map(result.errors, function(error) { + if (error.name === 'OutgoingIdentityKeyError') { + return textsecure.storage.protocol.saveIdentity( + error.number, error.identityKey, false + ); + } + })); } + return Promise.all(promises).then(function() { + this.trigger('send-error', this.get('errors')); + }.bind(this)); }.bind(this)); },