Bläddra i källkod

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 år sedan
förälder
incheckning
9967b955c8
1 ändrade filer med 49 tillägg och 42 borttagningar
  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 cipher = crypto.lib.PasswordBasedCipher;
                 var pass = converse.connection.pass;
+                var result, key;
                 if (saved_key) {
                     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') {
                         // 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) {
@@ -393,33 +401,32 @@
                 // If 'query_msg' is passed in, it means there is an alread incoming
                 // query message from our buddy. Otherwise, it is us who will
                 // 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.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 () {