From 51f27ea55c3014acd2e88a20736a5e592fe2bfe3 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 25 Sep 2018 14:20:06 +0200
Subject: [PATCH] auto logout after session expired

---
 frontend-js/src/main/js/gui/OverviewDialog.js |  2 +-
 .../src/main/js/gui/topMenu/TopMenu.js        | 39 +++++++++++++++++++
 frontend-js/src/main/js/map/data/Project.js   |  6 ++-
 frontend-js/src/main/js/minerva.js            |  4 +-
 .../src/test/js/gui/topMenu/TopMenu-test.js   | 15 +++++--
 5 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/frontend-js/src/main/js/gui/OverviewDialog.js b/frontend-js/src/main/js/gui/OverviewDialog.js
index 6dabef39ae..40d2761929 100644
--- a/frontend-js/src/main/js/gui/OverviewDialog.js
+++ b/frontend-js/src/main/js/gui/OverviewDialog.js
@@ -36,7 +36,7 @@ OverviewDialog.prototype.constructor = OverviewDialog;
 
 /**
  *
- * @param {number} overviewImageId
+ * @param {number} [overviewImageId]
  */
 OverviewDialog.prototype.showOverview = function (overviewImageId) {
   var self = this;
diff --git a/frontend-js/src/main/js/gui/topMenu/TopMenu.js b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
index 36ede3d8dc..b58b513441 100644
--- a/frontend-js/src/main/js/gui/topMenu/TopMenu.js
+++ b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
@@ -5,6 +5,7 @@ var Promise = require("bluebird");
 /* exported logger */
 
 var AbstractGuiElement = require('../AbstractGuiElement');
+var ConfigurationType = require('../../ConfigurationType');
 var GuiConnector = require('../../GuiConnector');
 var OverviewDialog = require('../OverviewDialog');
 var PanelControlElementType = require('../PanelControlElementType');
@@ -31,6 +32,12 @@ function TopMenu(params) {
   var self = this;
 
   self._createGui();
+
+  self._cronFunction = function () {
+    return self.checkIfSessionIsGoingToExpire();
+  };
+
+  setInterval(self._cronFunction, 1000);
 }
 
 TopMenu.prototype = Object.create(AbstractGuiElement.prototype);
@@ -270,6 +277,7 @@ TopMenu.prototype.destroy = function () {
   if (self._overviewDialog !== undefined) {
     self._overviewDialog.destroy();
   }
+  clearInterval(self._cronFunction);
   return Promise.resolve();
 };
 
@@ -286,4 +294,35 @@ TopMenu.prototype.toggleLegend = function () {
   }
 };
 
+/**
+ *
+ * @returns {Promise}
+ */
+TopMenu.prototype.checkIfSessionIsGoingToExpire = function () {
+  var self = this;
+  var lastAccessTimestamp = self.getServerConnector().getSessionData().getLastRequestTimeStamp();
+  var sessionInactivityOption = self.getConfiguration().getOption(ConfigurationType.SESSION_LENGTH);
+  var sessionInactivityLength = parseInt(sessionInactivityOption.getValue());
+  var sessionExpireTimestamp = lastAccessTimestamp + sessionInactivityLength;
+  var currentTimestamp = Math.floor(Date.now() / 1000);
+
+  //if session is going to expire in 10 minutes show information
+  if (sessionExpireTimestamp - currentTimestamp < 10 * 60) {
+    self.showSessionExpire(sessionExpireTimestamp - currentTimestamp);
+  }
+
+  //if session expired 10 seconds ago force logout
+  if (sessionExpireTimestamp < currentTimestamp - 10) {
+    return self.getServerConnector().logout();
+  }
+  return Promise.resolve();
+};
+
+/**
+ *
+ */
+TopMenu.prototype.showSessionExpire = function (timeInSeconds) {
+  console.log("Session is going to expire in " + timeInSeconds + " seconds");
+};
+
 module.exports = TopMenu;
\ No newline at end of file
diff --git a/frontend-js/src/main/js/map/data/Project.js b/frontend-js/src/main/js/map/data/Project.js
index 82cab1d4c5..16884ab0d2 100644
--- a/frontend-js/src/main/js/map/data/Project.js
+++ b/frontend-js/src/main/js/map/data/Project.js
@@ -298,7 +298,11 @@ Project.prototype.getTopOverviewImage = function () {
  * @param {OverviewImage} topOverviewImage
  */
 Project.prototype.setTopOverviewImage = function (topOverviewImage) {
-  this._topOverviewImage = topOverviewImage;
+  if (topOverviewImage === null) {
+    this._topOverviewImage = undefined;
+  } else {
+    this._topOverviewImage = topOverviewImage;
+  }
 };
 
 /**
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 3d524d5e6d..6cdf12cd52 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -389,7 +389,9 @@ function create(params) {
 
     topMenu = new TopMenu({
       element: functions.getElementByClassName(element, "minerva-top-menu"),
-      customMap: customMap
+      customMap: customMap,
+      configuration: params.getConfiguration(),
+      project: params.getProject()
     });
 
     legend = new Legend({
diff --git a/frontend-js/src/test/js/gui/topMenu/TopMenu-test.js b/frontend-js/src/test/js/gui/topMenu/TopMenu-test.js
index a09060318b..90843d5592 100644
--- a/frontend-js/src/test/js/gui/topMenu/TopMenu-test.js
+++ b/frontend-js/src/test/js/gui/topMenu/TopMenu-test.js
@@ -18,7 +18,8 @@ describe('TopMenu', function () {
 
     new TopMenu({
       element: testDiv,
-      customMap: map
+      customMap: map,
+      configuration: helper.getConfiguration()
     });
 
     assert.equal(logger.getWarnings().length, 0);
@@ -30,7 +31,8 @@ describe('TopMenu', function () {
 
     var topMenu = new TopMenu({
       element: testDiv,
-      customMap: map
+      customMap: map,
+      configuration: helper.getConfiguration()
     });
 
     return topMenu.init();
@@ -42,9 +44,14 @@ describe('TopMenu', function () {
 
     var topMenu = new TopMenu({
       element: testDiv,
-      customMap: map
+      customMap: map,
+      configuration: helper.getConfiguration()
+    });
+    var legend = new Legend({
+      element: document.createElement("div"), customMap: map,
+      configuration: helper.getConfiguration(),
+      project: map.getProject()
     });
-    var legend = new Legend({element: document.createElement("div"), customMap: map});
     topMenu.setLegend(legend);
     return topMenu.init().then(function () {
       $("input", testDiv).prop('checked', true);
-- 
GitLab