diff --git a/background.html b/background.html index 354b22f8f8b..5bd1fb5b552 100644 --- a/background.html +++ b/background.html @@ -287,6 +287,13 @@ <div class='key'> {{ #your_key }} <span>{{ . }}</span> {{ /your_key }} </div> + <div class='securityNumber'></div> + </script> + <script type='text/x-tmpl-mustache' id='security_number'> + <label> Security number </label> + <div class='key'> + {{ #chunks }} <span>{{ . }}</span> {{ /chunks }} + </div> </script> <!-- index --> <script type='text/x-tmpl-mustache' id='group_info_input'> diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 16657ce39e8..357da10828c 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -200,8 +200,13 @@ textsecure.storage.protocol.loadIdentityKey(their_number).then(function(their_key) { textsecure.storage.protocol.loadIdentityKey(our_number).then(function(our_key) { var view = new Whisper.KeyVerificationPanelView({ - model: { their_key: their_key, your_key: our_key } - }).render(); + model: { + your_number: our_number, + their_number: their_number, + their_key: their_key, + your_key: our_key + } + }); this.listenBack(view); }.bind(this)); }.bind(this)); diff --git a/js/views/key_conflict_dialogue_view.js b/js/views/key_conflict_dialogue_view.js index 41176542467..5fb706f1cbc 100644 --- a/js/views/key_conflict_dialogue_view.js +++ b/js/views/key_conflict_dialogue_view.js @@ -12,18 +12,19 @@ initialize: function(options) { this.contact = options.contact; this.conversation = options.conversation; - textsecure.storage.protocol.loadIdentityKey(textsecure.storage.user.getNumber()).then(function(our_key) { + var our_number = textsecure.storage.user.getNumber(); + textsecure.storage.protocol.loadIdentityKey(our_number).then(function(our_key) { this.your_key = our_key; this.render(); - }.bind(this)); - textsecure.storage.protocol.loadIdentityKey(textsecure.storage.user.getNumber()).then(function(our_key) { var view = new Whisper.KeyVerificationView({ model: { + your_number: our_number, + their_number: this.model.number, their_key : this.model.identityKey, your_key : our_key } }); - view.render().$el.appendTo(this.$('.keys')); + view.$el.appendTo(this.$('.keys')); }.bind(this)); }, events: { diff --git a/js/views/key_verification_view.js b/js/views/key_verification_view.js index 895ae56207a..3022ed7cfa1 100644 --- a/js/views/key_verification_view.js +++ b/js/views/key_verification_view.js @@ -5,9 +5,45 @@ 'use strict'; window.Whisper = window.Whisper || {}; + var SecurityNumberView = Whisper.View.extend({ + className: 'securityNumber', + templateName: 'security_number', + initialize: function() { + this.generateSecurityNumber(); + }, + generateSecurityNumber: function() { + new libsignal.FingerprintGenerator(5200).createFor( + this.model.your_number, + this.model.your_key, + this.model.their_number, + this.model.their_key + ).then(this.handleSecurityNumber.bind(this)); + }, + handleSecurityNumber: function(securityNumber) { + this.model.securityNumber = securityNumber; + this.render(); + }, + render_attributes: function() { + var s = this.model.securityNumber; + var chunks = []; + for (var i = 0; i < s.length; i += 5) { + chunks.push(s.substring(i, i+5)); + } + return { chunks: chunks }; + } + }); + Whisper.KeyVerificationView = Whisper.View.extend({ className: 'key-verification', templateName: 'key_verification', + initialize: function() { + this.render(); + /* + this.$('.securityNumber').append( + new SecurityNumberView({model: this.model}).el + ); + */ + }, splitKey: function(key) { // key is an array buffer var bytes = new Uint8Array(key);