Explorar o código

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 %!s(int64=11) %!d(string=hai) anos
pai
achega
9967b955c8
Modificáronse 1 ficheiros con 49 adicións e 42 borrados
  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 () {