Explorar el Código

Add a test for the passphrase storage. Updates #111

JC Brand hace 11 años
padre
commit
398142c7de
Se han modificado 2 ficheros con 43 adiciones y 71 borrados
  1. 16 18
      converse.js
  2. 27 53
      spec/converse.js

+ 16 - 18
converse.js

@@ -262,6 +262,20 @@
             }
         };
 
+        this.getSessionPassphrase = function () {
+            if (this.prebind) {
+                var key = hex_sha1(this.connection.jid),
+                    pass = window.sessionStorage[key];
+                if (typeof pass === 'undefined') {
+                    pass = Math.floor(Math.random()*4294967295).toString();
+                    window.sessionStorage[key] = pass;
+                }
+                return pass;
+            } else {
+                return this.connection.pass;
+            }
+        };
+
         this.getVCard = function (jid, callback, errback) {
             if (!this.use_vcards) {
                 if (callback) {
@@ -567,25 +581,11 @@
                 }
             },
 
-            getSessionPassphrase: function () {
-                if (converse.prebind) {
-                    var key = hex_sha1(converse.connection.jid),
-                        pass = window.sessionStorage[key];
-                    if (typeof pass === 'undefined') {
-                        pass = Math.floor(Math.random()*4294967295);
-                        window.sessionStorage[key] = pass;
-                    }
-                    return pass;
-                } else {
-                    return converse.connection.pass;
-                }
-            },
-
             generatePrivateKey: function (callback, instance_tag) {
                 var cipher = CryptoJS.lib.PasswordBasedCipher;
                 var key = new DSA();
                 if (converse.cache_otr_key) {
-                    pass = this.getSessionPassphrase();
+                    pass = converse.getSessionPassphrase();
                     if (typeof pass !== "undefined") {
                         // Encrypt the key and set in sessionStorage. Also store instance tag.
                         window.sessionStorage[hex_sha1(this.id+'priv_key')] =
@@ -602,12 +602,10 @@
             },
 
             getSession: function (callback) {
-                // FIXME: sessionStorage is not supported in IE < 8. Perhaps a
-                // user alert is required here...
                 var cipher = CryptoJS.lib.PasswordBasedCipher;
                 var result, pass, instance_tag, saved_key;
                 if (converse.cache_otr_key) {
-                    pass = this.getSessionPassphrase();
+                    pass = converse.getSessionPassphrase();
                     if (typeof pass !== "undefined") {
                         instance_tag = window.sessionStorage[hex_sha1(this.id+'instance_tag')];
                         saved_key = window.sessionStorage[hex_sha1(this.id+'priv_key')];

+ 27 - 53
spec/converse.js

@@ -8,60 +8,34 @@
     );
 } (this, function (mock, utils) {
     return describe("Converse", $.proxy(function(mock, utils) {
-        window.localStorage.clear();
 
-        it("allows you to subscribe to emitted events", function () {
-            this.callback = function () {};
-            spyOn(this, 'callback');
-            converse.on('onInitialized', this.callback);
-            converse.emit('onInitialized');
-            expect(this.callback).toHaveBeenCalled();
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 2);
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 3);
-        });
+        beforeEach($.proxy(function () {
+            window.localStorage.clear();
+            window.sessionStorage.clear();
+        }, converse));
+
+        it("can store a session passphrase in session storage", $.proxy(function () {
+            var pp;
+            // With no prebind, the user's XMPP password is used and nothing is
+            // stored in session storage.
+            this.prebind = false;
+            this.connection.pass = 's3cr3t!';
+            expect(this.getSessionPassphrase()).toBe(this.connection.pass);
+            expect(window.sessionStorage.length).toBe(0); 
+            expect(window.localStorage.length).toBe(0); 
+
+            // With prebind, a random passphrase is generated and stored in
+            // session storage.
+            this.prebind = true;
+            pp = this.getSessionPassphrase();
+            expect(pp).not.toBe(this.connection.pass);
+            expect(window.sessionStorage.length).toBe(1);
+            expect(window.localStorage.length).toBe(0); 
+            expect(pp).toBe(window.sessionStorage[hex_sha1(converse.connection.jid)]);
+
+            // Clean up
+            this.prebind = false;
+        }, converse));
 
-        it("allows you to listen once for an emitted event", function () {
-            this.callback = function () {};
-            spyOn(this, 'callback');
-            converse.once('onInitialized', this.callback);
-            converse.emit('onInitialized');
-            expect(this.callback).toHaveBeenCalled();
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 1);
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 1);
-        });
-
-        it("allows you to stop listening or subscribing to an event", function () {
-            this.callback = function () {};
-            this.anotherCallback = function () {};
-            this.neverCalled = function () {};
-
-            spyOn(this, 'callback');
-            spyOn(this, 'anotherCallback');
-            spyOn(this, 'neverCalled');
-            converse.on('onInitialized', this.callback);
-            converse.on('onInitialized', this.anotherCallback);
-
-            converse.emit('onInitialized');
-            expect(this.callback).toHaveBeenCalled();
-            expect(this.anotherCallback).toHaveBeenCalled();
-
-            converse.off('onInitialized', this.callback);
-
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 1);
-            expect(this.anotherCallback.callCount, 2);
-
-            converse.once('onInitialized', this.neverCalled);
-            converse.off('onInitialized', this.neverCalled);
-
-            converse.emit('onInitialized');
-            expect(this.callback.callCount, 1);
-            expect(this.anotherCallback.callCount, 3);
-            expect(this.neverCalled).not.toHaveBeenCalled();
-        });
     }, converse, mock, utils));
 }));