Browse Source

Show an alert before generating private key

To make it clear to the user that the browser might freeze up while generating
the key.
JC Brand 11 years ago
parent
commit
9967b955c8
1 changed files with 49 additions and 42 deletions
  1. 49 42
      converse.js

+ 49 - 42
converse.js

@@ -316,31 +316,39 @@
                 }
                 }
             },
             },
 
 
-            getSession: function (callback) {
+            getSession: function () {
                 var saved_key = this.get('priv_key');
                 var saved_key = this.get('priv_key');
                 var cipher = crypto.lib.PasswordBasedCipher;
                 var cipher = crypto.lib.PasswordBasedCipher;
                 var pass = converse.connection.pass;
                 var pass = converse.connection.pass;
+                var result, key;
                 if (saved_key) {
                 if (saved_key) {
                     var decrypted = cipher.decrypt(crypto.algo.AES, saved_key, pass);
                     var decrypted = cipher.decrypt(crypto.algo.AES, saved_key, pass);
-                    var key = otr.DSA.parsePrivate(decrypted.toString(crypto.enc.Latin1));
+                    key = otr.DSA.parsePrivate(decrypted.toString(crypto.enc.Latin1));
                     if (cipher.decrypt(crypto.algo.AES, this.get('pass_check'), pass).toString(crypto.enc.Latin1) === 'match') {
                     if (cipher.decrypt(crypto.algo.AES, this.get('pass_check'), pass).toString(crypto.enc.Latin1) === 'match') {
                         // Verified that the user's password is still the same
                         // Verified that the user's password is still the same
-                        return callback(key, this.get('instance_tag'));
+                        return {
+                            'key': key,
+                            'instance_tag': this.get('instance_tag')
+                        };
                     }
                     }
-                }
-                this.trigger('showHelpMessages', [__('Please wait, generating private key...')]);
-                setTimeout($.proxy(function () {
-                    // Couldn't get stored key, generate a new one.
-                    var key = new otr.DSA();
-                    var instance_tag = otr.OTR.makeInstanceTag();
-                    this.trigger('showHelpMessages', [__('Private key generated.')]);
-                    this.save({
-                        'priv_key': cipher.encrypt(crypto.algo.AES, key.packPrivate(), pass).toString(),
-                        'pass_check': cipher.encrypt(crypto.algo.AES, 'match', pass).toString(),
-                        'instance_tag': instance_tag
-                    });
-                    return callback(key, instance_tag);
-                }, this));
+                } 
+                // We need to generate a new key
+                result = alert(__(
+                    'Your browser needs to generate a private key, which will be used '+
+                    'in your encrypted chat session. This can take up to 30 seconds and '+
+                    'your browser might freeze and become unresponsive.'));
+                key = new otr.DSA();
+                var instance_tag = otr.OTR.makeInstanceTag();
+                this.trigger('showHelpMessages', [__('Private key generated.')]);
+                this.save({
+                    'priv_key': cipher.encrypt(crypto.algo.AES, key.packPrivate(), pass).toString(),
+                    'pass_check': cipher.encrypt(crypto.algo.AES, 'match', pass).toString(),
+                    'instance_tag': instance_tag
+                });
+                return {
+                    'key': key,
+                    'instance_tag': instance_tag
+                };
             },
             },
 
 
             updateOTRStatus: function (state) {
             updateOTRStatus: function (state) {
@@ -393,33 +401,32 @@
                 // If 'query_msg' is passed in, it means there is an alread incoming
                 // If 'query_msg' is passed in, it means there is an alread incoming
                 // query message from our buddy. Otherwise, it is us who will
                 // query message from our buddy. Otherwise, it is us who will
                 // send the query message to them.
                 // send the query message to them.
-                this.getSession($.proxy(function (key, instance_tag) {
-                    this.otr = new otr.OTR({
-                        fragment_size: 140,
-                        send_interval: 200,
-                        priv: key,
-                        instance_tag: instance_tag,
-                        debug: this.debug
-                    });
-                    this.otr.on('status', $.proxy(this.updateOTRStatus, this));
-                    this.otr.on('smp', $.proxy(this.onSMP, this));
-
-                    this.otr.on('ui', $.proxy(function (msg) {
-                        this.trigger('showReceivedOTRMessage', msg);
-                    }, this));
-                    this.otr.on('io', $.proxy(function (msg) {
-                        this.trigger('sendMessageStanza', msg);
-                    }, this));
-                    this.otr.on('error', $.proxy(function (msg) {
-                        this.trigger('showOTRError', msg);
-                    }, this));
+                session = this.getSession();
+                this.otr = new otr.OTR({
+                    fragment_size: 140,
+                    send_interval: 200,
+                    priv: session.key,
+                    instance_tag: session.instance_tag,
+                    debug: this.debug
+                });
+                this.otr.on('status', $.proxy(this.updateOTRStatus, this));
+                this.otr.on('smp', $.proxy(this.onSMP, this));
 
 
-                    if (query_msg) {
-                        this.otr.receiveMsg(query_msg);
-                    } else {
-                        this.otr.sendQueryMsg();
-                    }
+                this.otr.on('ui', $.proxy(function (msg) {
+                    this.trigger('showReceivedOTRMessage', msg);
+                }, this));
+                this.otr.on('io', $.proxy(function (msg) {
+                    this.trigger('sendMessageStanza', msg);
                 }, this));
                 }, this));
+                this.otr.on('error', $.proxy(function (msg) {
+                    this.trigger('showOTRError', msg);
+                }, this));
+
+                if (query_msg) {
+                    this.otr.receiveMsg(query_msg);
+                } else {
+                    this.otr.sendQueryMsg();
+                }
             },
             },
 
 
             endOTR: function () {
             endOTR: function () {