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