瀏覽代碼

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 年之前
父節點
當前提交
9967b955c8
共有 1 個文件被更改,包括 49 次插入42 次删除
  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 () {