From 398142c7dea87e8afff1cd3cbca713c8cb4c74b2 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Wed, 12 Feb 2014 02:02:45 +0200 Subject: [PATCH] Add a test for the passphrase storage. Updates #111 --- converse.js | 34 +++++++++++----------- spec/converse.js | 74 ++++++++++++++++-------------------------------- 2 files changed, 40 insertions(+), 68 deletions(-) diff --git a/converse.js b/converse.js index ce0b6b34b..26a7a09c9 100644 --- a/converse.js +++ b/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')]; diff --git a/spec/converse.js b/spec/converse.js index fa416e532..9a6ff8d42 100644 --- a/spec/converse.js +++ b/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("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("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); - it("allows you to stop listening or subscribing to an event", function () { - this.callback = function () {}; - this.anotherCallback = function () {}; - this.neverCalled = function () {}; + // 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)]); - spyOn(this, 'callback'); - spyOn(this, 'anotherCallback'); - spyOn(this, 'neverCalled'); - converse.on('onInitialized', this.callback); - converse.on('onInitialized', this.anotherCallback); + // Clean up + this.prebind = false; + }, converse)); - 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)); }));