From 5dbefdecfe611f9496f9105a62e8f46ccb927add Mon Sep 17 00:00:00 2001 From: =Corey Hulen Date: Thu, 5 Nov 2015 11:54:40 -0800 Subject: PLT-1016 force logout on other browsers --- web/react/stores/browser_store.jsx | 31 +++++++++++++++++++++++-------- web/react/utils/client.jsx | 1 + web/templates/head.html | 9 +++++++++ 3 files changed, 33 insertions(+), 8 deletions(-) (limited to 'web') diff --git a/web/react/stores/browser_store.jsx b/web/react/stores/browser_store.jsx index 75fb8aa3c..b88ca43cd 100644 --- a/web/react/stores/browser_store.jsx +++ b/web/react/stores/browser_store.jsx @@ -24,6 +24,8 @@ class BrowserStoreClass { this.setLastServerVersion = this.setLastServerVersion.bind(this); this.clear = this.clear.bind(this); this.clearAll = this.clearAll.bind(this); + this.checkedLocalStorageSupported = ''; + this.signalLogout = this.signalLogout.bind(this); var currentVersion = sessionStorage.getItem('storage_version'); if (currentVersion !== global.window.mm_config.Version) { @@ -105,6 +107,13 @@ class BrowserStoreClass { sessionStorage.setItem('last_server_version', version); } + signalLogout() { + if (this.isLocalStorageSupported()) { + localStorage.setItem('__logout__', 'yes'); + localStorage.removeItem('__logout__'); + } + } + /** * Preforms the given action on each item that has the given prefix * Signature for action is action(key, value) @@ -147,20 +156,26 @@ class BrowserStoreClass { } isLocalStorageSupported() { + if (this.checkedLocalStorageSupported !== '') { + return this.checkedLocalStorageSupported; + } + try { - sessionStorage.setItem('testSession', '1'); - sessionStorage.removeItem('testSession'); + sessionStorage.setItem('__testSession__', '1'); + sessionStorage.removeItem('__testSession__'); - localStorage.setItem('testLocal', '1'); - if (localStorage.getItem('testLocal') !== '1') { - return false; + localStorage.setItem('__testLocal__', '1'); + if (localStorage.getItem('__testLocal__') !== '1') { + this.checkedLocalStorageSupported = false; } - localStorage.removeItem('testLocal', '1'); + localStorage.removeItem('__testLocal__', '1'); - return true; + this.checkedLocalStorageSupported = true; } catch (e) { - return false; + this.checkedLocalStorageSupported = false; } + + return this.checkedLocalStorageSupported; } } diff --git a/web/react/utils/client.jsx b/web/react/utils/client.jsx index 003e24d33..d27fe16cf 100644 --- a/web/react/utils/client.jsx +++ b/web/react/utils/client.jsx @@ -231,6 +231,7 @@ export function resetPassword(data, success, error) { export function logout() { track('api', 'api_users_logout'); var currentTeamUrl = TeamStore.getCurrentTeamUrl(); + BrowserStore.signalLogout(); BrowserStore.clear(); ErrorStore.storeLastError(null); window.location.href = currentTeamUrl + '/logout'; diff --git a/web/templates/head.html b/web/templates/head.html index a73e809a7..2bbf921ee 100644 --- a/web/templates/head.html +++ b/web/templates/head.html @@ -52,6 +52,15 @@ headers: { 'X-MM-TokenIndex': mm_session_token_index } }); } + + $(function () { + $(window).bind('storage', function (e) { + if (e.originalEvent.key === '__logout__') { + console.log('detected logout from a different tab'); + window.location.href = '/' + window.mm_team.name; + } + }); + });