From a3f25ee134010b6f2c3eac9f11f4e3d544a545ea Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Wed, 18 Jul 2018 14:21:08 +0200 Subject: [PATCH] frontend allows to connect/disconnect users from ldap --- frontend-js/src/main/js/ServerConnector.js | 26 ++- .../main/js/gui/admin/AbstractAdminPanel.js | 1 + .../src/main/js/gui/admin/UsersAdminPanel.js | 120 ++++++++++-- frontend-js/src/main/js/map/data/User.js | 175 ++++++++++++++++++ .../test/js/gui/admin/UserAdminPanel-test.js | 57 +++--- .../mapviewer/api/users/UserRestImpl.java | 6 +- 6 files changed, 334 insertions(+), 51 deletions(-) diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 91a84461e3..271aeb78f6 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -124,6 +124,12 @@ ServerConnector.getNeutralOverlayColorInt = function () { }); }; +/** + * + * @param url + * @param description + * @returns {Promise} + */ ServerConnector.sendGetRequest = function (url, description) { return this.sendRequest({ url: url, @@ -243,9 +249,9 @@ ServerConnector.sendDeleteRequest = function (url, json) { /** * - * @param url - * @param json - * @returns {PromiseLike} + * @param {string} url + * @param {Object} json + * @returns {Promise} */ ServerConnector.sendPatchRequest = function (url, json) { return this.sendRequest({ @@ -255,6 +261,10 @@ ServerConnector.sendPatchRequest = function (url, json) { }); }; +/** + * + * @returns {string} + */ ServerConnector.getApiBaseUrl = function () { return this.getServerBaseUrl() + "/api/"; }; @@ -1137,6 +1147,11 @@ ServerConnector.getLoggedUser = function () { } }; +/** + * + * @param {string} login + * @returns {Promise} + */ ServerConnector.getUser = function (login) { var self = this; var queryParams = { @@ -1163,7 +1178,7 @@ ServerConnector.getUser = function (login) { /** * * @param {User} user - * @returns {PromiseLike<any>} + * @returns {Promise} */ ServerConnector.updateUser = function (user) { var self = this; @@ -1176,7 +1191,8 @@ ServerConnector.updateUser = function (user) { surname: user.getSurname(), password: user.getPassword(), email: user.getEmail(), - termsOfUseConsent: user.isTermsOfUseConsent() + termsOfUseConsent: user.isTermsOfUseConsent(), + connectedToLdap: user.isConnectedToLdap() } }; return self.sendPatchRequest(self.getUserUrl(queryParams), filterParams).then(function () { diff --git a/frontend-js/src/main/js/gui/admin/AbstractAdminPanel.js b/frontend-js/src/main/js/gui/admin/AbstractAdminPanel.js index 7c0668ee45..3780b87494 100644 --- a/frontend-js/src/main/js/gui/admin/AbstractAdminPanel.js +++ b/frontend-js/src/main/js/gui/admin/AbstractAdminPanel.js @@ -24,6 +24,7 @@ var Promise = require("bluebird"); * @param params.parent * * @constructor + * @extends Panel */ function AbstractAdminPanel(params) { params["scrollable"] = true; diff --git a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js index 3bef291f7e..daf9d1d8e0 100644 --- a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js +++ b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js @@ -6,7 +6,6 @@ var PrivilegeType = require('../../map/data/PrivilegeType'); var AbstractAdminPanel = require('./AbstractAdminPanel'); var EditUserDialog = require('./EditUserDialog'); -var SecurityError = require('../../SecurityError'); var User = require("../../map/data/User"); @@ -15,6 +14,13 @@ var GuiConnector = require('../../GuiConnector'); // noinspection JSUnusedLocalSymbols var logger = require('../../logger'); +/** + * + * @param {Object} params + * + * @constructor + * @extends AbstractAdminPanel + */ function UsersAdminPanel(params) { var self = this; AbstractAdminPanel.call(self, params); @@ -25,6 +31,10 @@ function UsersAdminPanel(params) { UsersAdminPanel.prototype = Object.create(AbstractAdminPanel.prototype); UsersAdminPanel.prototype.constructor = UsersAdminPanel; +/** + * + * @private + */ UsersAdminPanel.prototype._createGui = function () { var self = this; var usersDiv = Functions.createElement({ @@ -44,6 +54,11 @@ UsersAdminPanel.prototype._createGui = function () { }; +/** + * + * @returns {HTMLElement} + * @private + */ UsersAdminPanel.prototype._createMenuRow = function () { var self = this; var menuRow = Functions.createElement({ @@ -75,6 +90,11 @@ UsersAdminPanel.prototype._createMenuRow = function () { return menuRow; }; +/** + * + * @returns {HTMLElement} + * @private + */ UsersAdminPanel.prototype._createUsersTableRow = function () { var self = this; var projectsRow = Functions.createElement({ @@ -90,7 +110,7 @@ UsersAdminPanel.prototype._createUsersTableRow = function () { }); projectsRow.appendChild(usersTable); - // noinspection JSUnusedGlobalSymbols + // noinspection JSCheckFunctionSignatures $(usersTable).DataTable({ fnRowCallback: function (nRow, aData) { nRow.setAttribute('id', aData[0]); @@ -103,6 +123,8 @@ UsersAdminPanel.prototype._createUsersTableRow = function () { title: 'Surname' }, { title: 'Email' + }, { + title: 'Authentication' }, { title: 'Edit' }, { @@ -136,6 +158,27 @@ UsersAdminPanel.prototype._createUsersTableRow = function () { }).catch(GuiConnector.alert); }); + $(usersTable).on("click", "[name='ldap-auth']", function () { + var field = this; + var login = $(this).attr('data'); + GuiConnector.showProcessing(); + return self.getServerConnector().getUser(login).then(function (user) { + var newIsConnected = $('input:checked', field).val() === "LDAP"; + var isConnected = user.isConnectedToLdap(); + if (isConnected !== newIsConnected) { + console.log(newIsConnected); + user.setConnectedToLdap(newIsConnected); + return self.getServerConnector().updateUser(user); + } else { + console.log('dont change'); + } + }).catch(function (error) { + GuiConnector.alert(error); + }).finally(function(){ + GuiConnector.hideProcessing(); + }); + }); + $(usersTable).on("click", "[name='showEditDialog']", function () { var button = this; return self.showEditDialog($(button).attr("data")).then(null, GuiConnector.alert); @@ -144,10 +187,15 @@ UsersAdminPanel.prototype._createUsersTableRow = function () { return projectsRow; }; +/** + * + * @param {String} login + * @returns {Promise} + */ UsersAdminPanel.prototype.showEditDialog = function (login) { var self = this; GuiConnector.showProcessing(); - return ServerConnector.getUser(login).then(function (user) { + return self.getServerConnector().getUser(login).then(function (user) { return self.getDialog(user); }).then(function (dialog) { dialog.open(); @@ -158,6 +206,11 @@ UsersAdminPanel.prototype.showEditDialog = function (login) { }); }; +/** + * + * @param {User} user + * @returns {Promise} + */ UsersAdminPanel.prototype.getDialog = function (user) { var self = this; if (self._dialogs === undefined) { @@ -186,14 +239,18 @@ UsersAdminPanel.prototype.getDialog = function (user) { } }; +/** + * + * @returns {Promise} + */ UsersAdminPanel.prototype.init = function () { var self = this; return AbstractAdminPanel.prototype.init.call(this).then(function () { - return ServerConnector.getLoggedUser(); + return self.getServerConnector().getLoggedUser(); }).then(function (user) { var privilege = self.getConfiguration().getPrivilegeType(PrivilegeType.USER_MANAGEMENT); if (user.hasPrivilege(privilege)) { - return ServerConnector.getUsers().then(function (users) { + return self.getServerConnector().getUsers().then(function (users) { return self.setUsers(users); }); } else { @@ -202,6 +259,10 @@ UsersAdminPanel.prototype.init = function () { }); }; +/** + * + * @param {User[]} users + */ UsersAdminPanel.prototype.setUsers = function (users) { var self = this; var dataTable = $($("[name='usersTable']", self.getElement())[0]).DataTable(); @@ -218,6 +279,11 @@ UsersAdminPanel.prototype.setUsers = function (users) { }; +/** + * + * @param {User} user + * @param {Array} dataTableRow + */ UsersAdminPanel.prototype.addUpdateListener = function (user, dataTableRow) { var self = this; @@ -241,7 +307,12 @@ UsersAdminPanel.prototype.addUpdateListener = function (user, dataTableRow) { user.addListener("onreload", listener); }; - +/** + * + * @param {User} user + * @param {Array} [row] + * @returns {Array} + */ UsersAdminPanel.prototype.userToTableRow = function (user, row) { if (row === undefined) { row = []; @@ -251,20 +322,39 @@ UsersAdminPanel.prototype.userToTableRow = function (user, row) { row[1] = user.getName(); row[2] = user.getSurname(); row[3] = user.getEmail(); - row[4] = "<button name='showEditDialog' data='" + user.getLogin() + "'><i class='fa fa-edit' style='font-size:17px'></i></button>"; - row[5] = "<button name='removeUser' data='" + user.getLogin() + "'><i class='fa fa-trash-o' style='font-size:17px'></i></button>"; + var ldapFieldId = 'ldap-auth-' + user.getLogin(); + if (user.isConnectedToLdap()) { + row[4] = "<fieldset name='ldap-auth' id='" + ldapFieldId + "' data='" + user.getLogin() + "'> <input type='radio' name='" + ldapFieldId + "' value='LOCAL'> LOCAL <input type='radio' name='" + ldapFieldId + "' checked value='LDAP'> LDAP </fieldset>"; + } else { + if (user.isLdapAccountAvailable()) { + row[4] = "<fieldset name='ldap-auth' id='" + ldapFieldId + "' data='" + user.getLogin() + "'> <input type='radio' name='" + ldapFieldId + "' value='LOCAL' checked> LOCAL <input type='radio' name='" + ldapFieldId + "' value='LDAP'> LDAP </fieldset>"; + // row[4] = "LOCAL <button name='connectLdap' data='" + user.getLogin() + "'>CONNECT LDAP</button>" + } else { + row[4] = "<fieldset name='ldap-auth' id='" + ldapFieldId + "' data='" + user.getLogin() + "'> <input type='radio' name='" + ldapFieldId + "' value='LOCAL' checked> LOCAL</fieldset>"; + } + } + + row[5] = "<button name='showEditDialog' data='" + user.getLogin() + "'><i class='fa fa-edit' style='font-size:17px'></i></button>"; + row[6] = "<button name='removeUser' data='" + user.getLogin() + "'><i class='fa fa-trash-o' style='font-size:17px'></i></button>"; return row; }; +/** + * + * @returns {Promise} + */ UsersAdminPanel.prototype.onRefreshClicked = function () { var self = this; - return ServerConnector.getUsers(true).then(function (users) { + return self.getServerConnector().getUsers(true).then(function (users) { return self.setUsers(users); }); }; +/** + * + */ UsersAdminPanel.prototype.destroy = function () { var self = this; var table = $("[name='usersTable']", self.getElement())[0]; @@ -277,9 +367,12 @@ UsersAdminPanel.prototype.destroy = function () { self._dialogs[key].destroy(); } } - }; +/** + * + * @returns {Promise} + */ UsersAdminPanel.prototype.onAddClicked = function () { var self = this; var user = new User({}); @@ -293,10 +386,15 @@ UsersAdminPanel.prototype.onAddClicked = function () { }); }; +/** + * + * @param {string} login + * @returns {Promise} + */ UsersAdminPanel.prototype.removeUser = function (login) { var self = this; GuiConnector.showProcessing(); - return ServerConnector.removeUser(login).then(function () { + return self.getServerConnector().removeUser(login).then(function () { return self.onRefreshClicked(); }).then(function () { GuiConnector.hideProcessing(); diff --git a/frontend-js/src/main/js/map/data/User.js b/frontend-js/src/main/js/map/data/User.js index fdccd92f98..8c129f086c 100644 --- a/frontend-js/src/main/js/map/data/User.js +++ b/frontend-js/src/main/js/map/data/User.js @@ -2,11 +2,17 @@ /* exported logger */ +// noinspection JSUnusedLocalSymbols var logger = require('../../logger'); var UserPreferences = require('./UserPreferences'); var ObjectWithListeners = require('../../ObjectWithListeners'); +/** + * + * @param javaObject + * @constructor + */ function User(javaObject) { // call super constructor ObjectWithListeners.call(this); @@ -25,6 +31,8 @@ function User(javaObject) { this.setNeutralColor(javaObject.neutralColor); this.setSimpleColor(javaObject.simpleColor); this.setTermsOfUseConsent(javaObject.termsOfUseConsent); + this.setLdapAccountAvailable(javaObject.ldapAccountAvailable); + this.setConnectedToLdap(javaObject.connectedToLdap); } // this class inherits from ObjectWithListeners class where generic methods for @@ -32,86 +40,170 @@ function User(javaObject) { User.prototype = Object.create(ObjectWithListeners.prototype); User.prototype.constructor = User; +/** + * + * @param {string} login + */ User.prototype.setLogin = function (login) { this._login = login; }; +/** + * + * @returns {string} + */ User.prototype.getLogin = function () { return this._login; }; +/** + * + * @param {string} name + */ User.prototype.setName = function (name) { this._name = name; }; +/** + * + * @returns {string} + */ User.prototype.getName = function () { return this._name; }; +/** + * + * @param {string} surname + */ User.prototype.setSurname = function (surname) { this._surname = surname; }; +/** + * + * @returns {string} + */ User.prototype.getSurname = function () { return this._surname; }; +/** + * + * @param {string} email + */ User.prototype.setEmail = function (email) { this._email = email; }; +/** + * + * @returns {string} + */ User.prototype.getEmail = function () { return this._email; }; +/** + * + * @param {boolean} removed + */ User.prototype.setRemoved = function (removed) { this._removed = removed; }; +/** + * + * @returns {boolean} + */ User.prototype.getRemoved = function () { return this._removed; }; +/** + * + * @param {string} minColor + */ User.prototype.setMinColor = function (minColor) { this._minColor = minColor; }; +/** + * + * @returns {string} + */ User.prototype.getMinColor = function () { return this._minColor; }; +/** + * + * @param {string} simpleColor + */ User.prototype.setSimpleColor = function (simpleColor) { this._simpleColor = simpleColor; }; +/** + * + * @returns {string} + */ User.prototype.getSimpleColor = function () { return this._simpleColor; }; +/** + * + * @param {string} neutralColor + */ User.prototype.setNeutralColor = function (neutralColor) { this._neutralColor = neutralColor; }; +/** + * + * @returns {string} + */ User.prototype.getNeutralColor = function () { return this._neutralColor; }; +/** + * + * @param {string} maxColor + */ User.prototype.setMaxColor = function (maxColor) { this._maxColor = maxColor; }; +/** + * + * @returns {string} + */ User.prototype.getMaxColor = function () { return this._maxColor; }; +/** + * + * @param {string} password + */ User.prototype.setPassword = function (password) { this._password = password; }; +/** + * + * @returns {string} + */ User.prototype.getPassword = function () { return this._password; }; +/** + * + * @param {Object[]} privileges + */ User.prototype.setPrivileges = function (privileges) { this._privileges = privileges; if (this._privileges === undefined) { @@ -119,10 +211,18 @@ User.prototype.setPrivileges = function (privileges) { } }; +/** + * + * @returns {Array} + */ User.prototype.getPrivileges = function () { return this._privileges; }; +/** + * + * @param {UserPreferences|Object} preferences + */ User.prototype.setPreferences = function (preferences) { if (!(preferences instanceof UserPreferences)) { preferences = new UserPreferences(preferences); @@ -130,14 +230,31 @@ User.prototype.setPreferences = function (preferences) { this._preferences = preferences; }; +/** + * + * @returns {UserPreferences} + */ User.prototype.getPreferences = function () { return this._preferences; }; +/** + * + * @param {PrivilegeType} type + * @param {number} [objectId] + * @returns {boolean} + */ User.prototype.hasPrivilege = function (type, objectId) { return this.getPrivilegeValue(type, objectId) > 0; }; +/** + * + * @param {Object} params + * @param {number} params.objectId + * @param {PrivilegeType} params.type + * @param {number} [params.value=1] + */ User.prototype.setPrivilege = function (params) { var objectId = params.objectId; var type = params.type; @@ -165,6 +282,13 @@ User.prototype.setPrivilege = function (params) { }); }; +/** + * + * @param {PrivilegeType} type + * @param {number} [objectId] + * + * @returns {number} + */ User.prototype.getPrivilegeValue = function (type, objectId) { for (var i = 0; i < this._privileges.length; i++) { var privilege = this._privileges[i]; @@ -177,6 +301,12 @@ User.prototype.getPrivilegeValue = function (type, objectId) { return 0; }; +/** + * + * @param {Configuration} configuration + * + * @returns {Object} + */ User.prototype.privilegesToExport = function (configuration) { var self = this; var result = {}; @@ -201,6 +331,11 @@ User.prototype.privilegesToExport = function (configuration) { return result; }; +/** + * + * @param {User} user + * @returns {PromiseLike} + */ User.prototype.update = function (user) { var self = this; self.setLogin(user.getLogin()); @@ -217,12 +352,52 @@ User.prototype.update = function (user) { return self.callListeners("onreload"); }; +/** + * + * @param {boolean} termsOfUseConsent + */ User.prototype.setTermsOfUseConsent = function (termsOfUseConsent) { this._termsOfUseConsent = termsOfUseConsent; }; +/** + * + * @returns {boolean} + */ User.prototype.isTermsOfUseConsent = function () { return this._termsOfUseConsent; }; +/** + * + * @param {boolean} ldapAccountAvailable + */ +User.prototype.setLdapAccountAvailable = function (ldapAccountAvailable) { + this._ldapAccountAvailable = ldapAccountAvailable; +}; + +/** + * + * @returns {boolean} + */ +User.prototype.isLdapAccountAvailable = function () { + return this._ldapAccountAvailable; +}; + +/** + * + * @param {boolean} connectedToLdap + */ +User.prototype.setConnectedToLdap = function (connectedToLdap) { + this._connectedToLdap = connectedToLdap; +}; + +/** + * + * @returns {boolean} + */ +User.prototype.isConnectedToLdap = function () { + return this._connectedToLdap; +}; + module.exports = User; 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 494f438fb5..fb675b9525 100644 --- a/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js +++ b/frontend-js/src/test/js/gui/admin/UserAdminPanel-test.js @@ -11,6 +11,14 @@ var logger = require('../../logger'); var assert = require('assert'); +function createUserAdminPanel(configuration) { + return new UsersAdminPanel({ + element: testDiv, + configuration: configuration, + serverConnector: ServerConnector + }); +} + describe('UsersAdminPanel', function () { describe('init', function () { @@ -18,10 +26,7 @@ describe('UsersAdminPanel', function () { helper.loginAsAdmin(); var usersTab; return ServerConnector.getConfiguration().then(function (configuration) { - usersTab = new UsersAdminPanel({ - element: testDiv, - configuration: configuration - }); + usersTab = createUserAdminPanel(configuration); return usersTab.init(); }).then(function () { assert.equal(0, logger.getWarnings().length); @@ -35,10 +40,7 @@ describe('UsersAdminPanel', function () { return Promise.reject(new SecurityError("Access denied.")); }; return ServerConnector.getConfiguration().then(function (configuration) { - usersTab = new UsersAdminPanel({ - element: testDiv, - configuration: configuration - }); + usersTab = createUserAdminPanel(configuration); return usersTab.init(); }).then(function () { assert.equal(0, logger.getWarnings().length); @@ -52,48 +54,39 @@ describe('UsersAdminPanel', function () { it('refresh', function () { helper.loginAsAdmin(); - var mapTab; + var usersTab; return ServerConnector.getConfiguration().then(function (configuration) { - mapTab = new UsersAdminPanel({ - element: testDiv, - configuration: configuration - }); - return mapTab.init(); + usersTab = createUserAdminPanel(configuration); + return usersTab.init(); }).then(function () { - return mapTab.onRefreshClicked(); + return usersTab.onRefreshClicked(); }).then(function () { - return mapTab.destroy(); + return usersTab.destroy(); }); }); it('showEditDialog', function () { helper.loginAsAdmin(); - var mapTab; + var usersTab; return ServerConnector.getConfiguration().then(function (configuration) { - mapTab = new UsersAdminPanel({ - element: testDiv, - configuration: configuration - }); - return mapTab.init(); + usersTab = createUserAdminPanel(configuration); + return usersTab.init(); }).then(function () { - return mapTab.showEditDialog("anonymous"); + return usersTab.showEditDialog("anonymous"); }).then(function () { - return mapTab.destroy(); + return usersTab.destroy(); }); }); it('onAddClicked', function () { helper.loginAsAdmin(); - var mapTab; + var usersTab; return ServerConnector.getConfiguration().then(function (configuration) { - mapTab = new UsersAdminPanel({ - element: testDiv, - configuration: configuration - }); - return mapTab.init(); + usersTab = createUserAdminPanel(configuration); + return usersTab.init(); }).then(function () { - return mapTab.onAddClicked(); + return usersTab.onAddClicked(); }).then(function () { - return mapTab.destroy(); + return usersTab.destroy(); }); }); diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java index 51792ae019..4753bfa1e5 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java @@ -62,7 +62,7 @@ public class UserRestImpl extends BaseRestImpl { throw new ObjectNotFoundException("User doesn't exist"); } Boolean ldapAvailable = false; - if (columnSet.contains("ldapAccaountAvailable")) { + if (columnSet.contains("ldapAccountAvailable")) { List<User> userList = new ArrayList<>(); userList.add(ownUserData); ldapAvailable = getUserService().ldapAccountExistsForLogin(userList).get(login); @@ -89,7 +89,7 @@ public class UserRestImpl extends BaseRestImpl { columnsSet.add("privileges"); columnsSet.add("termsOfUseConsent"); columnsSet.add("connectedToLdap"); - columnsSet.add("ldapAccaountAvailable"); + columnsSet.add("ldapAccountAvailable"); } else { for (String str : columns.split(",")) { columnsSet.add(str); @@ -127,7 +127,7 @@ public class UserRestImpl extends BaseRestImpl { value = user.isTermsOfUseConsent(); } else if (column.equals("connectedtoldap") && admin) { value = user.isConnectedToLdap(); - } else if (column.equals("ldapaccaountavailable") && admin) { + } else if (column.equals("ldapaccountavailable") && admin) { if (ldapAvailable == null) { ldapAvailable = false; } -- GitLab