Divorce identity wipe from tryAgain functions

We'd like to live in a world where we can retry all the pending
conflicts in a conversation as a batch, which means we don't want to
wipe the identity key before processing each message. Thus, remove that
step from these handlers and encapsulate in a method on the conversation
model.
This commit is contained in:
lilia 2015-02-23 16:23:22 -08:00
parent c642854ddf
commit 857eee5003
5 changed files with 46 additions and 14 deletions

View file

@ -37819,13 +37819,11 @@ window.axolotl.sessions = {
}
};
var wipeIdentityAndTryMessageAgain = function(from, encodedMessage) {
// Wipe identity key!
textsecure.storage.devices.removeIdentityKeyForNumber(from.split('.')[0]);
var tryMessageAgain = function(from, encodedMessage) {
//TODO: Probably breaks with a devicecontrol message
return textsecure.protocol_wrapper.handlePreKeyWhisperMessage(from, encodedMessage).then(decodeMessageContents);
}
textsecure.replay.registerFunction(wipeIdentityAndTryMessageAgain, textsecure.replay.Type.INIT_SESSION);
textsecure.replay.registerFunction(tryMessageAgain, textsecure.replay.Type.INIT_SESSION);
})();
/* vim: ts=4:sw=4:expandtab
@ -39445,8 +39443,7 @@ window.textsecure.messaging = function() {
}
var tryMessageAgain = function(number, encodedMessage, timestamp) {
textsecure.storage.devices.removeIdentityKeyForNumber(number);
var proto = textsecure.protobuf.PushMessageContent.decode(encodedMessage, 'binary');
var proto = textsecure.protobuf.PushMessageContent.decode(encodedMessage);
return new Promise(function(resolve, reject) {
sendMessageProto(timestamp, [number], proto, function(res) {
if (res.failure.length > 0)
@ -39513,7 +39510,7 @@ window.textsecure.messaging = function() {
if (error.message !== "Identity key changed")
registerError(number, "Failed to reload device keys", error);
else {
error = new textsecure.OutgoingIdentityKeyError(number, getString(message.encode()), timestamp);
error = new textsecure.OutgoingIdentityKeyError(number, message.toArrayBuffer(), timestamp);
registerError(number, "Identity key changed", error);
}
});

View file

@ -190,6 +190,7 @@
return '';
}
},
isPrivate: function() {
return this.get('type') === 'private';
},
@ -218,7 +219,35 @@
this.updateAvatarUrl();
}
return this.avatarUrl || '/images/default.png';
},
resolveConflicts: function() {
if (!this.isPrivate()) {
throw "Can't call resolveConflicts on non-private conversation";
}
if (!this.messageCollection.find(function(m) { return m.getKeyConflict(); })) {
throw "No conflicts to resolve";
}
textsecure.storage.devices.removeIdentityKeyForNumber(this.get('id'));
this.messageCollection.each(function(message) {
var conflict = message.getKeyConflict();
if (conflict) {
new textsecure.ReplayableError(conflict).replay().
then(function(pushMessageContent) {
message.save('errors', []);
if (message.isIncoming()) {
extension.trigger('message:decrypted', {
message_id: message.id,
data: pushMessageContent
});
}
});
}
});
}
});
Whisper.ConversationCollection = Backbone.Collection.extend({

View file

@ -47,6 +47,15 @@
if (this.collection) {
return this.collection.conversation.contactCollection.get(this.get('source'));
}
},
isOutgoing: function() {
return this.get('type') === 'outgoing';
},
getKeyConflict: function() {
return _.find(this.get('errors'), function(e) {
return ( e.name === 'IncomingIdentityKeyError' ||
e.name === 'OutgoingIdentityKeyError');
});
}
});

View file

@ -119,11 +119,9 @@
}
};
var wipeIdentityAndTryMessageAgain = function(from, encodedMessage) {
// Wipe identity key!
textsecure.storage.devices.removeIdentityKeyForNumber(from.split('.')[0]);
var tryMessageAgain = function(from, encodedMessage) {
//TODO: Probably breaks with a devicecontrol message
return textsecure.protocol_wrapper.handlePreKeyWhisperMessage(from, encodedMessage).then(decodeMessageContents);
}
textsecure.replay.registerFunction(wipeIdentityAndTryMessageAgain, textsecure.replay.Type.INIT_SESSION);
textsecure.replay.registerFunction(tryMessageAgain, textsecure.replay.Type.INIT_SESSION);
})();

View file

@ -128,8 +128,7 @@ window.textsecure.messaging = function() {
}
var tryMessageAgain = function(number, encodedMessage, timestamp) {
textsecure.storage.devices.removeIdentityKeyForNumber(number);
var proto = textsecure.protobuf.PushMessageContent.decode(encodedMessage, 'binary');
var proto = textsecure.protobuf.PushMessageContent.decode(encodedMessage);
return new Promise(function(resolve, reject) {
sendMessageProto(timestamp, [number], proto, function(res) {
if (res.failure.length > 0)
@ -196,7 +195,7 @@ window.textsecure.messaging = function() {
if (error.message !== "Identity key changed")
registerError(number, "Failed to reload device keys", error);
else {
error = new textsecure.OutgoingIdentityKeyError(number, getString(message.encode()), timestamp);
error = new textsecure.OutgoingIdentityKeyError(number, message.toArrayBuffer(), timestamp);
registerError(number, "Identity key changed", error);
}
});