Skip to content

Commit

Permalink
Remove all concept of 'key conflict' from the app
Browse files Browse the repository at this point in the history
  • Loading branch information
scottnonnenberg committed Aug 4, 2017
1 parent 5108014 commit ee0b0f5
Show file tree
Hide file tree
Showing 15 changed files with 28 additions and 400 deletions.
6 changes: 0 additions & 6 deletions _locales/en/messages.json
Expand Up @@ -69,12 +69,6 @@
"identityChanged": {
"message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Signal. You may wish to verify the new safety number below."
},
"outgoingKeyConflict": {
"message": "Your safety number with this contact has changed. Click to process and display."
},
"incomingKeyConflict": {
"message": "Received message with a new safety number. Click to process and display."
},
"incomingError": {
"message": "Error handling incoming message."
},
Expand Down
34 changes: 3 additions & 31 deletions background.html
Expand Up @@ -280,12 +280,6 @@ <h3 class='name' dir='auto'> {{ title }} </h3>
</script>
<script type='text/x-tmpl-mustache' id='message-detail'>
<div class='container'>
{{ #hasConflict }}
<div class='hasConflict clearfix'>
<div class='conflicts'>
</div>
</div>
{{ /hasConflict }}
<div class='message-container'></div>
<div class='info'>
<table>
Expand Down Expand Up @@ -315,13 +309,8 @@ <h3 class='name' dir='auto'> {{ title }} </h3>
<script type='text/x-tmpl-mustache' id='group-member-list'>
<div class='container'></div>
</script>
<script type='text/x-tmpl-mustache' id='key_verification_panel'>
<script type='text/x-tmpl-mustache' id='key-verification'>
<div class='container'>
{{> key_verification }}
<p> {{> link_to_support }} </p>
</div>
</script>
<script type='text/x-tmpl-mustache' id='key_verification'>
{{ ^has_their_key }}
<div class='placeholder'>{{ their_key_unknown }}</div>
{{ /has_their_key }}
Expand All @@ -332,6 +321,8 @@ <h3 class='name' dir='auto'> {{ title }} </h3>
{{ #chunks }} <span>{{ . }}</span> {{ /chunks }}
</div>
{{ /has_their_key }}
<p> {{> link_to_support }} </p>
</div>
</script>
<!-- index -->
<script type='text/x-tmpl-mustache' id='group_info_input'>
Expand Down Expand Up @@ -400,24 +391,6 @@ <h3 class='name' dir='auto'> {{ title }} </h3>
{{ learnMore }}
</a>
</script>
<script type='text/x-tmpl-mustache' id='key-conflict-dialogue'>
<h3 class='header'>{{ newIdentity }}</h3>
<div class='content clearfix'>
<div class='clearfix'>
{{> avatar }}
<span class='name'>{{ name }}</span>
<button class='resolve'>{{ resolve }}</button>
<a href='#' class='hideKeys hide'> {{ hideKeys }} </a>
<a href='#' class='showKeys'> {{ showKeys }} </a>
</div>
<div class='keys hide'>
<p>
{{ message }}
{{> link_to_support }}
</p>
</div>
</div>
</script>
<script type='text/x-tmpl-mustache' id='debug-log'>
<div class='content'>
<div>
Expand Down Expand Up @@ -656,7 +629,6 @@ <h2 class='number'></h2>
<script type='text/javascript' src='js/views/contact_list_view.js'></script>
<script type='text/javascript' src='js/views/new_group_update_view.js'></script>
<script type='text/javascript' src='js/views/attachment_view.js'></script>
<script type='text/javascript' src='js/views/key_conflict_dialogue_view.js'></script>
<script type='text/javascript' src='js/views/error_view.js'></script>
<script type='text/javascript' src='js/views/timestamp_view.js'></script>
<script type='text/javascript' src='js/views/message_view.js'></script>
Expand Down
33 changes: 0 additions & 33 deletions js/models/conversations.js
Expand Up @@ -512,39 +512,6 @@
}.bind(this));
},

resolveConflicts: function(conflict) {
var number = conflict.number;
var identityKey = conflict.identityKey;
if (this.isPrivate()) {
number = this.id;
} else if (!_.include(this.get('members'), number)) {
throw 'Tried to resolve conflicts for a unknown group member';
}

if (!this.messageCollection.hasKeyConflicts()) {
throw 'No conflicts to resolve';
}

return textsecure.storage.protocol.saveIdentity(number, identityKey, true).then(function() {
var promise = Promise.resolve();
var conflicts = this.messageCollection.filter(function(message) {
return message.hasKeyConflict(number);
});
// group incoming & outgoing
conflicts = _.groupBy(conflicts, function(m) { return m.get('type'); });
// sort each group by date and concatenate outgoing after incoming
conflicts = _.flatten([
_.sortBy(conflicts.incoming, function(m) { return m.get('received_at'); }),
_.sortBy(conflicts.outgoing, function(m) { return m.get('received_at'); }),
]).forEach(function(message) {
var resolveConflict = function() {
return message.resolveConflict(number);
};
promise = promise.then(resolveConflict, resolveConflict);
});
return promise;
}.bind(this));
},
notify: function(message) {
if (!message.isIncoming()) {
return;
Expand Down
60 changes: 0 additions & 60 deletions js/models/messages.js
Expand Up @@ -88,9 +88,6 @@
if (this.isEndSession()) {
return i18n('sessionEnded');
}
if (this.isIncoming() && this.hasKeyConflicts()) {
return i18n('incomingKeyConflict');
}
if (this.isIncoming() && this.hasErrors()) {
return i18n('incomingError');
}
Expand Down Expand Up @@ -191,26 +188,6 @@
hasErrors: function() {
return _.size(this.get('errors')) > 0;
},
hasKeyConflicts: function() {
return _.any(this.get('errors'), function(e) {
return (e.name === 'IncomingIdentityKeyError' ||
e.name === 'OutgoingIdentityKeyError');
});
},
hasKeyConflict: function(number) {
return _.any(this.get('errors'), function(e) {
return (e.name === 'IncomingIdentityKeyError' ||
e.name === 'OutgoingIdentityKeyError') &&
e.number === number;
});
},
getKeyConflict: function(number) {
return _.find(this.get('errors'), function(e) {
return (e.name === 'IncomingIdentityKeyError' ||
e.name === 'OutgoingIdentityKeyError') &&
e.number === number;
});
},

send: function(promise) {
this.trigger('pending');
Expand Down Expand Up @@ -281,15 +258,6 @@
return this.save({errors : errors});
},

removeConflictFor: function(number) {
var errors = _.reject(this.get('errors'), function(e) {
return e.number === number &&
(e.name === 'IncomingIdentityKeyError' ||
e.name === 'OutgoingIdentityKeyError');
});
this.set({errors: errors});
},

hasNetworkError: function(number) {
var error = _.find(this.get('errors'), function(e) {
return (e.name === 'MessageError' ||
Expand Down Expand Up @@ -325,30 +293,6 @@
}
},

resolveConflict: function(number) {
var error = this.getKeyConflict(number);
if (error) {
this.removeConflictFor(number);
var promise = new textsecure.ReplayableError(error).replay();
if (this.isIncoming()) {
promise = promise.then(function(dataMessage) {
this.removeConflictFor(number);
this.handleDataMessage(dataMessage);
}.bind(this));
} else {
promise = this.send(promise).then(function() {
this.removeConflictFor(number);
this.save();
}.bind(this));
}
promise.catch(function(e) {
this.removeConflictFor(number);
this.saveErrors(e);
}.bind(this));

return promise;
}
},
handleDataMessage: function(dataMessage) {
// This function can be called from the background script on an
// incoming message or from the frontend after the user accepts an
Expand Down Expand Up @@ -640,10 +584,6 @@
conditions: { expires_at: { $lte: Date.now() } },
addIndividually: true
});
},

hasKeyConflicts: function() {
return this.any(function(m) { return m.hasKeyConflicts(); });
}
});
})();
1 change: 1 addition & 0 deletions js/views/contact_list_view.js
Expand Up @@ -5,6 +5,7 @@
'use strict';
window.Whisper = window.Whisper || {};

// Contact list view is used in the list group members senario, as well as the NewGroupUpdate view
Whisper.ContactListView = Whisper.ListView.extend({
tagName: 'div',
itemView: Whisper.View.extend({
Expand Down
44 changes: 0 additions & 44 deletions js/views/error_view.js
Expand Up @@ -13,48 +13,4 @@
return this.model;
}
});

var KeyConflictView = ErrorView.extend({
className: 'key-conflict',
templateName: 'key-conflict',
initialize: function(options) {
this.message = options.message;
},
events: {
'click': 'select'
},
render_attributes: function() {
var errorMessage;
if (this.message.isIncoming()) {
errorMessage = 'incomingKeyConflict';
} else {
errorMessage = 'outgoingKeyConflict';
}
return { message: i18n(errorMessage) };
},
select: function() {
this.$el.trigger('select', {message: this.message});
},
});

Whisper.MessageErrorView = Backbone.View.extend({
className: 'error',
initialize: function(options) {
if (this.model.name === 'IncomingIdentityKeyError' ||
this.model.name === 'OutgoingIdentityKeyError') {
this.view = new KeyConflictView({
model : this.model,
message : options.message
});
} else {
this.view = new ErrorView({ model: this.model });
}
this.$el.append(this.view.el);
this.view.render();
},
render: function() {
this.view.render();
return this;
}
});
})();
5 changes: 5 additions & 0 deletions js/views/group_member_list_view.js
Expand Up @@ -5,6 +5,11 @@
'use strict';
window.Whisper = window.Whisper || {};

// This needs to make each member link to their verification view - except for yourself
// Do we update the display of each user to add Verified to their name if verified?
// What about the case where we're brought here because there are multiple users in the no-longer-verified state?
// We probably want to display some sort of helper text in that case at the least
// Or do we show only the problematic users in that case?
Whisper.GroupMemberList = Whisper.View.extend({
className: 'group-member-list panel',
templateName: 'group-member-list',
Expand Down
53 changes: 0 additions & 53 deletions js/views/key_conflict_dialogue_view.js

This file was deleted.

12 changes: 6 additions & 6 deletions js/views/key_verification_view.js
Expand Up @@ -5,9 +5,11 @@
'use strict';
window.Whisper = window.Whisper || {};

// TODO; find all uses of that removed panel
// Add the Verify functionality to this view
Whisper.KeyVerificationView = Whisper.View.extend({
className: 'key-verification',
templateName: 'key_verification',
className: 'key-verification panel',
templateName: 'key-verification',
initialize: function(options) {
this.our_number = textsecure.storage.user.getNumber();
if (options.newKey) {
Expand All @@ -21,6 +23,8 @@
//.then(this.makeQRCode.bind(this));
},
makeQRCode: function() {
// Per Lilia: We can't turn this on until it geneates a Latin1 string, as is
// required by the mobile clients.
new QRCode(this.$('.qr')[0]).makeCode(
dcodeIO.ByteBuffer.wrap(this.our_key).toString('base64')
);
Expand Down Expand Up @@ -72,8 +76,4 @@
};
}
});
Whisper.KeyVerificationPanelView = Whisper.KeyVerificationView.extend({
className: 'key-verification panel',
templateName: 'key_verification_panel',
});
})();

0 comments on commit ee0b0f5

Please sign in to comment.