From df5c390acd5016f135da1101792d9319e5d06e28 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 19 Feb 2018 14:54:36 +0100
Subject: [PATCH] when user has no access to users management, proper tab is
 disabled

---
 frontend-js/src/main/js/ServerConnector.js    |  2 +
 frontend-js/src/main/js/gui/Panel.js          |  9 +--
 .../src/main/js/gui/admin/EditUserDialog.js   |  1 -
 .../src/main/js/gui/admin/UsersAdminPanel.js  |  8 +++
 .../src/test/js/ServerConnector-test.js       | 17 ++++++
 .../test/js/gui/admin/UserAdminPanel-test.js  | 58 ++++++++++++++-----
 6 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 68766ff382..e7e6662fe6 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -1097,6 +1097,8 @@ ServerConnector.getUsers = function (forceRefresh) {
         self._users.push(self._usersByLogin[user.getLogin()]);
       }
       return self._users;
+    }).then(null, function (error) {
+      return self.processNetworkError(error);
     });
   }
 
diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js
index 8149894865..ed0594d070 100644
--- a/frontend-js/src/main/js/gui/Panel.js
+++ b/frontend-js/src/main/js/gui/Panel.js
@@ -83,11 +83,8 @@ Panel.prototype.createHelpButton = function () {
 Panel.prototype.disablePanel = function (message) {
   var self = this;
 
-  var searchQueryElement = self.getControlElement(PanelControlElementType.SEARCH_DIV);
-  var searchResultsElement = self.getControlElement(PanelControlElementType.SEARCH_RESULTS_DIV);
-
-  searchQueryElement.style.visibility = "hidden";
-  searchResultsElement.style.visibility = "hidden";
+  $(self.getElement()).children().css("visibility", "hidden");
+  $("[class='minerva-help-button']",self.getElement()).children().css("visibility", "visible");
   var hideReasonDiv = document.createElement("div");
   hideReasonDiv.className = "searchPanel";
 
@@ -97,7 +94,7 @@ Panel.prototype.disablePanel = function (message) {
   center.appendChild(messageDiv);
   hideReasonDiv.appendChild(center);
 
-  self.getElement().insertBefore(hideReasonDiv, searchQueryElement);
+  $(self.getElement()).prepend(hideReasonDiv);
 };
 
 Panel.prototype.isDisabled = function () {
diff --git a/frontend-js/src/main/js/gui/admin/EditUserDialog.js b/frontend-js/src/main/js/gui/admin/EditUserDialog.js
index e4a51806b4..f45581a464 100644
--- a/frontend-js/src/main/js/gui/admin/EditUserDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditUserDialog.js
@@ -127,7 +127,6 @@ EditUserDialog.prototype.addTab = function (params) {
   });
 
   contentDiv.style.overflow = "auto";
-  
   if (params.content !== undefined) {
     contentDiv.appendChild(params.content);
   }
diff --git a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
index 5f018fb7fe..83f2ff058d 100644
--- a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
@@ -4,6 +4,8 @@ var Promise = require('bluebird');
 
 var AbstractAdminPanel = require('./AbstractAdminPanel');
 var EditUserDialog = require('./EditUserDialog');
+var SecurityError = require('../../SecurityError');
+
 var User = require("../../map/data/User");
 
 var Functions = require('../../Functions');
@@ -165,6 +167,12 @@ UsersAdminPanel.prototype.init = function () {
   var self = this;
   return ServerConnector.getUsers().then(function (users) {
     return self.setUsers(users);
+  }).catch(function (error) {
+    if (error instanceof SecurityError) {
+      self.disablePanel("You have no privilege to manage users");
+    } else {
+      throw error;
+    }
   });
 };
 
diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js
index 22fc81ae7c..3a476c3233 100644
--- a/frontend-js/src/test/js/ServerConnector-test.js
+++ b/frontend-js/src/test/js/ServerConnector-test.js
@@ -15,6 +15,7 @@ var NetworkError = require('../../main/js/NetworkError');
 var Project = require('../../main/js/map/data/Project');
 var Reaction = require('../../main/js/map/data/Reaction');
 var ServerConnector = require('../../main/js/ServerConnector');
+var SecurityError = require('../../main/js/SecurityError');
 
 var logger = require('./logger');
 var chai = require('chai');
@@ -355,6 +356,22 @@ describe('ServerConnector', function () {
         assert.ok(user.getName() !== modifiedName);
       });
     });
+    it('access denied', function () {
+      var originalFun = ServerConnector._sendRequest;
+      ServerConnector._sendRequest = function () {
+        return Promise.reject(new NetworkError("", {
+          statusCode: HttpStatus.FORBIDDEN
+        }))
+      };
+      return ServerConnector.getUsers().then(function () {
+          assert.notOk("Security error expected");
+        }, function (error) {
+          assert.ok(error instanceof SecurityError);
+        }
+      ).finally(function () {
+        ServerConnector._sendRequest = originalFun;
+      });
+    });
   });
 
   describe('uploadFile', function () {
diff --git a/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js
index 92410c1671..28f5ad6e20 100644
--- a/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js
@@ -3,6 +3,7 @@
 require("../../mocha-config");
 
 var UsersAdminPanel = require('../../../../main/js/gui/admin/UsersAdminPanel');
+var SecurityError = require('../../../../main/js/SecurityError');
 var ServerConnector = require('../../ServerConnector-mock');
 var logger = require('../../logger');
 
@@ -10,22 +11,49 @@ var assert = require('assert');
 
 describe('UsersAdminPanel', function () {
 
-  it('init', function () {
-    var usersTab;
-    var project;
-    return ServerConnector.getProject().then(function (result) {
-      project = result;
-      return ServerConnector.getConfiguration();
-    }).then(function (configuration) {
-      usersTab = new UsersAdminPanel({
-        element: testDiv,
-        project: project,
-        configuration: configuration
+  describe('init', function () {
+    it('default', function () {
+      var usersTab;
+      var project;
+      return ServerConnector.getProject().then(function (result) {
+        project = result;
+        return ServerConnector.getConfiguration();
+      }).then(function (configuration) {
+        usersTab = new UsersAdminPanel({
+          element: testDiv,
+          project: project,
+          configuration: configuration
+        });
+        return usersTab.init();
+      }).then(function () {
+        assert.equal(0, logger.getWarnings().length);
+        return usersTab.destroy();
+      });
+    });
+    it('user without access', function () {
+      var usersTab;
+      var project;
+      var oldFun = ServerConnector.getUsers;
+      ServerConnector.getUsers = function () {
+        return Promise.reject(new SecurityError("Access denied."));
+      };
+      return ServerConnector.getProject().then(function (result) {
+        project = result;
+        return ServerConnector.getConfiguration();
+      }).then(function (configuration) {
+        usersTab = new UsersAdminPanel({
+          element: testDiv,
+          project: project,
+          configuration: configuration
+        });
+        return usersTab.init();
+      }).then(function () {
+        assert.equal(0, logger.getWarnings().length);
+        assert.ok(usersTab.getElement().innerHTML.indexOf("no privilege") >= 0);
+        return usersTab.destroy();
+      }).finally(function () {
+        ServerConnector.getUsers = oldFun;
       });
-      return usersTab.init();
-    }).then(function () {
-      assert.equal(0, logger.getWarnings().length);
-      return usersTab.destroy();
     });
   });
 
-- 
GitLab