From effdd6b91f2d28a99f357eae11da628bfbff1181 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 2 Jul 2019 17:49:37 +0200
Subject: [PATCH] force logout in all tabs when user is logged out in any tab

---
 CHANGELOG                                     |  2 ++
 frontend-js/src/main/js/ServerConnector.js    | 28 +++++++++++++++++--
 .../src/test/js/ServerConnector-mock.js       |  4 +++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index e7624beee3..58d54e527f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,8 @@ minerva (13.1.1) stable; urgency=medium
     inside compartment (#856)
   * Bug fix: searching for some drugs in chembl didn't provide any results even 
     though that data exists, for instance 'DORLIMOMAB ARITOX' (#842)
+  * Bug fix: user wasn't logged out in all tabs when the log out event appeard 
+    in only one of them (#847)
 
  -- Piotr Gawron <piotr.gawron@uni.lu>  Fri, 28 Jun 2019 17:00:00 +0200
 
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 85501f0bf4..6ee653204b 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -99,6 +99,30 @@ ServerConnector.getMinOverlayColorInt = function () {
   });
 };
 
+ServerConnector.checkIfUserLogoutFromDifferentTab = function () {
+  var self = this;
+  var sessionLogin = self.getSessionData(null).getLogin();
+  var tabLogin = self._currentTabLogin;
+  if (tabLogin === undefined) {
+    self._currentTabLogin = ServerConnector.getSessionData(null).getLogin();
+    tabLogin = self._currentTabLogin;
+  }
+  if (tabLogin !== sessionLogin) {
+    setTimeout(function () {
+      var sessionLogin = self.getSessionData(null).getLogin();
+      var tabLogin = self._currentTabLogin;
+      if (tabLogin !== sessionLogin) {
+        logger.warn("User was log out in different tab. Reloading page");
+        window.location.reload(false);
+      }
+    }, 100);
+  }
+};
+
+setInterval(function () {
+  ServerConnector.checkIfUserLogoutFromDifferentTab();
+}, 1000);
+
 ServerConnector.returnUserOrSystemColor = function (userColor, systemPromisedColor) {
   return systemPromisedColor.then(function (systemColor) {
     var color = userColor;
@@ -1884,9 +1908,10 @@ ServerConnector.login = function (login, password) {
     if (data["login"] !== undefined) {
       params.login = data["login"];
     }
+    self._currentTabLogin = params.login;
     self.getSessionData().setLogin(params.login);
     return Promise.resolve(self.getSessionData().getToken());
-  }, function (error) {
+  }).catch(function (error) {
     if (error instanceof NetworkError && error.statusCode === HttpStatus.FORBIDDEN) {
       throw new InvalidCredentialsError("Invalid credentials");
     } else {
@@ -2815,5 +2840,4 @@ ServerConnector.submitErrorToMinervaNet = function (report, callback) {
   }, callback);
 };
 
-
 module.exports = ServerConnector;
diff --git a/frontend-js/src/test/js/ServerConnector-mock.js b/frontend-js/src/test/js/ServerConnector-mock.js
index ca183829e0..2690d77827 100644
--- a/frontend-js/src/test/js/ServerConnector-mock.js
+++ b/frontend-js/src/test/js/ServerConnector-mock.js
@@ -43,6 +43,10 @@ function encodeParams(params) {
   return result;
 }
 
+ServerConnectorMock.checkIfUserLogoutFromDifferentTab = function () {
+  logger.debug("checkIfUserLogoutFromDifferentTab is ignored");
+};
+
 ServerConnectorMock._sendRequest = function (params) {
   var self = this;
   var url = params.url;
-- 
GitLab