diff --git a/CHANGES.md b/CHANGES.md index 67d87942e..66ed74be5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Bugfix: Modal auto-closes when you open it for a second time. - Take roster nickname into consideration when rendering messages and chat headings. - Hide the textarea when a user is muted in a groupchat. +- Don't restore a BOSH session without knowing the JID - #1296: `embedded` view mode shows `chatbox-navback` arrow in header - #1532: Converse reloads on enter pressed in the filter box diff --git a/dist/converse.js b/dist/converse.js index 506a2e639..0cb42d351 100644 --- a/dist/converse.js +++ b/dist/converse.js @@ -64221,6 +64221,47 @@ _converse.initConnection = function () { _converse.api.trigger('connectionInitialized'); }; +async function initSession() { + const id = 'converse.bosh-session'; + _converse.session = new Backbone.Model({ + id + }); + _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); + + try { + await new es6_promise_dist_es6_promise_auto__WEBPACK_IMPORTED_MODULE_3___default.a((success, error) => _converse.session.fetch({ + success, + error + })); + + if (_converse.jid && _converse.session.get('jid') !== _converse.jid) { + _converse.session.clear({ + 'silent': true + }); + + _converse.session.save({ + 'jid': _converse.jid, + id + }); + } + } catch (e) { + if (_converse.jid) { + _converse.session.save({ + 'jid': _converse.jid + }); + } + } + /** + * Triggered once the session has been initialized. The session is a + * persistent object which stores session information in the browser storage. + * @event _converse#sessionInitialized + * @memberOf _converse + */ + + + _converse.api.trigger('sessionInitialized'); +} + function setUpXMLLogging() { strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].log = function (level, msg) { _converse.log(msg, level); @@ -64239,12 +64280,14 @@ function setUpXMLLogging() { }; } -function finishInitialization() { +async function finishInitialization() { initClientConfig(); initPlugins(); _converse.initConnection(); + await initSession(); + _converse.logIn(); _converse.registerGlobalEventHandlers(); @@ -64687,25 +64730,6 @@ _converse.initialize = async function (settings, callback) { } }; - this.initSession = function () { - const id = 'converse.bosh-session'; - _converse.session = new Backbone.Model({ - id - }); - _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); - - _converse.session.fetch(); - /** - * Triggered once the session has been initialized. The session is a - * persistent object which stores session information in the browser storage. - * @event _converse#sessionInitialized - * @memberOf _converse - */ - - - _converse.api.trigger('sessionInitialized'); - }; - this.clearSession = function () { if (!_converse.config.get('trusted') || isTestEnv()) { window.localStorage.clear(); @@ -64899,8 +64923,6 @@ _converse.initialize = async function (settings, callback) { _converse.setUserJID(); - _converse.initSession(); - _converse.enableCarbons(); _converse.initStatus(reconnecting); @@ -65057,25 +65079,29 @@ _converse.initialize = async function (settings, callback) { this.restoreBOSHSession = function (jid_is_required) { /* Tries to restore a cached BOSH session. */ - if (!this.jid) { + const jid = _converse.session.get('jid'); + + if (!jid) { const msg = "restoreBOSHSession: tried to restore a \"keepalive\" session " + "but we don't have the JID for the user!"; if (jid_is_required) { throw new Error(msg); } else { _converse.log(msg); + + return false; } - } + } else { + try { + this.connection.restore(jid, this.onConnectStatusChanged); + return true; + } catch (e) { + _converse.log("Could not restore session for jid: " + jid + " Error message: " + e.message, strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].LogLevel.WARN); - try { - this.connection.restore(this.jid, this.onConnectStatusChanged); - return true; - } catch (e) { - _converse.log("Could not restore session for jid: " + this.jid + " Error message: " + e.message, strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].LogLevel.WARN); + this.clearSession(); // We want to clear presences (see #555) - this.clearSession(); // We want to clear presences (see #555) - - return false; + return false; + } } }; @@ -65214,7 +65240,7 @@ _converse.initialize = async function (settings, callback) { } if (isTestEnv()) { - finishInitialization(); + await finishInitialization(); return _converse; } else if (!_lodash_noconflict__WEBPACK_IMPORTED_MODULE_4___default.a.isUndefined(_i18n__WEBPACK_IMPORTED_MODULE_6__["default"])) { const url = _converse_headless_utils_core__WEBPACK_IMPORTED_MODULE_11__["default"].interpolate(_converse.locales_url, { @@ -65228,7 +65254,7 @@ _converse.initialize = async function (settings, callback) { } } - finishInitialization(); + await finishInitialization(); return init_promise; }; /** @@ -66180,7 +66206,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-dis _converse.api.trigger('discoInitialized'); } - _converse.api.listen.on('sessionInitialized', initStreamFeatures); + _converse.api.listen.on('setUserJID', initStreamFeatures); _converse.api.listen.on('reconnected', initializeDisco); @@ -70620,7 +70646,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca _converse.vcards.fetch(); }; - _converse.api.listen.on('sessionInitialized', _converse.initVCardCollection); + _converse.api.listen.on('setUserJID', _converse.initVCardCollection); _converse.api.listen.on('statusInitialized', () => { const vcards = _converse.vcards; diff --git a/src/headless/converse-core.js b/src/headless/converse-core.js index 110182c97..4d3418ba4 100644 --- a/src/headless/converse-core.js +++ b/src/headless/converse-core.js @@ -424,6 +424,31 @@ _converse.initConnection = function () { } +async function initSession () { + const id = 'converse.bosh-session'; + _converse.session = new Backbone.Model({id}); + _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); + try { + await new Promise((success, error) => _converse.session.fetch({success, error})); + if (_converse.jid && _converse.session.get('jid') !== _converse.jid) { + _converse.session.clear({'silent': true}); + _converse.session.save({'jid': _converse.jid, id}); + } + } catch (e) { + if (_converse.jid) { + _converse.session.save({'jid': _converse.jid}); + } + } + /** + * Triggered once the session has been initialized. The session is a + * persistent object which stores session information in the browser storage. + * @event _converse#sessionInitialized + * @memberOf _converse + */ + _converse.api.trigger('sessionInitialized'); +} + + function setUpXMLLogging () { Strophe.log = function (level, msg) { _converse.log(msg, level); @@ -441,10 +466,11 @@ function setUpXMLLogging () { } -function finishInitialization () { +async function finishInitialization () { initClientConfig(); initPlugins(); _converse.initConnection(); + await initSession(); _converse.logIn(); _converse.registerGlobalEventHandlers(); if (!Backbone.history.started) { @@ -830,21 +856,6 @@ _converse.initialize = async function (settings, callback) { } } - - this.initSession = function () { - const id = 'converse.bosh-session'; - _converse.session = new Backbone.Model({id}); - _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); - _converse.session.fetch(); - /** - * Triggered once the session has been initialized. The session is a - * persistent object which stores session information in the browser storage. - * @event _converse#sessionInitialized - * @memberOf _converse - */ - _converse.api.trigger('sessionInitialized'); - }; - this.clearSession = function () { if (!_converse.config.get('trusted') || isTestEnv()) { window.localStorage.clear(); @@ -1007,7 +1018,6 @@ _converse.initialize = async function (settings, callback) { */ _converse.connection.flush(); // Solves problem of returned PubSub BOSH response not received by browser _converse.setUserJID(); - _converse.initSession(); _converse.enableCarbons(); _converse.initStatus(reconnecting) }; @@ -1155,24 +1165,28 @@ _converse.initialize = async function (settings, callback) { this.restoreBOSHSession = function (jid_is_required) { /* Tries to restore a cached BOSH session. */ - if (!this.jid) { + const jid = _converse.session.get('jid'); + if (!jid) { const msg = "restoreBOSHSession: tried to restore a \"keepalive\" session "+ "but we don't have the JID for the user!"; if (jid_is_required) { throw new Error(msg); } else { _converse.log(msg); + return false; } } - try { - this.connection.restore(this.jid, this.onConnectStatusChanged); - return true; - } catch (e) { - _converse.log( - "Could not restore session for jid: "+ - this.jid+" Error message: "+e.message, Strophe.LogLevel.WARN); - this.clearSession(); // We want to clear presences (see #555) - return false; + else { + try { + this.connection.restore(jid, this.onConnectStatusChanged); + return true; + } catch (e) { + _converse.log( + "Could not restore session for jid: "+ + jid+" Error message: "+e.message, Strophe.LogLevel.WARN); + this.clearSession(); // We want to clear presences (see #555) + return false; + } } }; @@ -1313,7 +1327,7 @@ _converse.initialize = async function (settings, callback) { } if (isTestEnv()) { - finishInitialization(); + await finishInitialization(); return _converse; } else if (!_.isUndefined(i18n)) { const url = u.interpolate(_converse.locales_url, {'locale': _converse.locale}); @@ -1323,7 +1337,7 @@ _converse.initialize = async function (settings, callback) { _converse.log(e.message, Strophe.LogLevel.FATAL); } } - finishInitialization(); + await finishInitialization(); return init_promise; }; diff --git a/src/headless/converse-disco.js b/src/headless/converse-disco.js index 07610a7ef..78d892c33 100644 --- a/src/headless/converse-disco.js +++ b/src/headless/converse-disco.js @@ -311,7 +311,7 @@ converse.plugins.add('converse-disco', { _converse.api.trigger('discoInitialized'); } - _converse.api.listen.on('sessionInitialized', initStreamFeatures); + _converse.api.listen.on('setUserJID', initStreamFeatures); _converse.api.listen.on('reconnected', initializeDisco); _converse.api.listen.on('connected', initializeDisco); diff --git a/src/headless/converse-vcard.js b/src/headless/converse-vcard.js index 0426278c2..38bc48ad9 100644 --- a/src/headless/converse-vcard.js +++ b/src/headless/converse-vcard.js @@ -125,7 +125,7 @@ converse.plugins.add('converse-vcard', { _converse.vcards.browserStorage = new Backbone.BrowserStorage[_converse.config.get('storage')](id); _converse.vcards.fetch(); } - _converse.api.listen.on('sessionInitialized', _converse.initVCardCollection); + _converse.api.listen.on('setUserJID', _converse.initVCardCollection); _converse.api.listen.on('statusInitialized', () => { diff --git a/src/headless/dist/converse-headless.js b/src/headless/dist/converse-headless.js index dd84aa0cd..cfd81eac5 100644 --- a/src/headless/dist/converse-headless.js +++ b/src/headless/dist/converse-headless.js @@ -42062,6 +42062,47 @@ _converse.initConnection = function () { _converse.api.trigger('connectionInitialized'); }; +async function initSession() { + const id = 'converse.bosh-session'; + _converse.session = new Backbone.Model({ + id + }); + _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); + + try { + await new es6_promise_dist_es6_promise_auto__WEBPACK_IMPORTED_MODULE_3___default.a((success, error) => _converse.session.fetch({ + success, + error + })); + + if (_converse.jid && _converse.session.get('jid') !== _converse.jid) { + _converse.session.clear({ + 'silent': true + }); + + _converse.session.save({ + 'jid': _converse.jid, + id + }); + } + } catch (e) { + if (_converse.jid) { + _converse.session.save({ + 'jid': _converse.jid + }); + } + } + /** + * Triggered once the session has been initialized. The session is a + * persistent object which stores session information in the browser storage. + * @event _converse#sessionInitialized + * @memberOf _converse + */ + + + _converse.api.trigger('sessionInitialized'); +} + function setUpXMLLogging() { strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].log = function (level, msg) { _converse.log(msg, level); @@ -42080,12 +42121,14 @@ function setUpXMLLogging() { }; } -function finishInitialization() { +async function finishInitialization() { initClientConfig(); initPlugins(); _converse.initConnection(); + await initSession(); + _converse.logIn(); _converse.registerGlobalEventHandlers(); @@ -42528,25 +42571,6 @@ _converse.initialize = async function (settings, callback) { } }; - this.initSession = function () { - const id = 'converse.bosh-session'; - _converse.session = new Backbone.Model({ - id - }); - _converse.session.browserStorage = new Backbone.BrowserStorage.session(id); - - _converse.session.fetch(); - /** - * Triggered once the session has been initialized. The session is a - * persistent object which stores session information in the browser storage. - * @event _converse#sessionInitialized - * @memberOf _converse - */ - - - _converse.api.trigger('sessionInitialized'); - }; - this.clearSession = function () { if (!_converse.config.get('trusted') || isTestEnv()) { window.localStorage.clear(); @@ -42740,8 +42764,6 @@ _converse.initialize = async function (settings, callback) { _converse.setUserJID(); - _converse.initSession(); - _converse.enableCarbons(); _converse.initStatus(reconnecting); @@ -42898,25 +42920,29 @@ _converse.initialize = async function (settings, callback) { this.restoreBOSHSession = function (jid_is_required) { /* Tries to restore a cached BOSH session. */ - if (!this.jid) { + const jid = _converse.session.get('jid'); + + if (!jid) { const msg = "restoreBOSHSession: tried to restore a \"keepalive\" session " + "but we don't have the JID for the user!"; if (jid_is_required) { throw new Error(msg); } else { _converse.log(msg); + + return false; } - } + } else { + try { + this.connection.restore(jid, this.onConnectStatusChanged); + return true; + } catch (e) { + _converse.log("Could not restore session for jid: " + jid + " Error message: " + e.message, strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].LogLevel.WARN); - try { - this.connection.restore(this.jid, this.onConnectStatusChanged); - return true; - } catch (e) { - _converse.log("Could not restore session for jid: " + this.jid + " Error message: " + e.message, strophe_js__WEBPACK_IMPORTED_MODULE_0__["Strophe"].LogLevel.WARN); + this.clearSession(); // We want to clear presences (see #555) - this.clearSession(); // We want to clear presences (see #555) - - return false; + return false; + } } }; @@ -43055,7 +43081,7 @@ _converse.initialize = async function (settings, callback) { } if (isTestEnv()) { - finishInitialization(); + await finishInitialization(); return _converse; } else if (!_lodash_noconflict__WEBPACK_IMPORTED_MODULE_4___default.a.isUndefined(_i18n__WEBPACK_IMPORTED_MODULE_6__["default"])) { const url = _converse_headless_utils_core__WEBPACK_IMPORTED_MODULE_11__["default"].interpolate(_converse.locales_url, { @@ -43069,7 +43095,7 @@ _converse.initialize = async function (settings, callback) { } } - finishInitialization(); + await finishInitialization(); return init_promise; }; /** @@ -44021,7 +44047,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-dis _converse.api.trigger('discoInitialized'); } - _converse.api.listen.on('sessionInitialized', initStreamFeatures); + _converse.api.listen.on('setUserJID', initStreamFeatures); _converse.api.listen.on('reconnected', initializeDisco); @@ -48461,7 +48487,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca _converse.vcards.fetch(); }; - _converse.api.listen.on('sessionInitialized', _converse.initVCardCollection); + _converse.api.listen.on('setUserJID', _converse.initVCardCollection); _converse.api.listen.on('statusInitialized', () => { const vcards = _converse.vcards;