diff --git a/src/js/client.js b/src/js/client.js index 4bc8831c4..b30651d78 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -530,6 +530,24 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N }); }; + Client.prototype.setExternalLdapConfig = function (config, callback) { + post('/api/v1/settings/external_ldap_config', config, null, function (error, data, status) { + if (error) return callback(error); + if (status !== 200) return callback(new ClientError(status, data)); + + callback(null); + }); + }; + + Client.prototype.getExternalLdapConfig = function (callback) { + get('/api/v1/settings/external_ldap_config', null, function (error, data, status) { + if (error) return callback(error); + if (status !== 200) return callback(new ClientError(status, data)); + + callback(null, data); + }); + }; + Client.prototype.setDynamicDnsConfig = function (enabled, callback) { post('/api/v1/settings/dynamic_dns', { enabled: enabled }, null, function (error, data, status) { if (error) return callback(error); diff --git a/src/views/settings.html b/src/views/settings.html index b689a7505..b54659a9f 100644 --- a/src/views/settings.html +++ b/src/views/settings.html @@ -287,7 +287,7 @@ - + diff --git a/src/views/users.html b/src/views/users.html index 03e669db3..479720e3b 100644 --- a/src/views/users.html +++ b/src/views/users.html @@ -392,4 +392,73 @@ + +
+

External LDAP

+
+ +
+
+
+

+ This option allows to use an external LDAP or ActiveDirectory service for user management. +

+ +
+ +
+ +
+
+
+

{{ externalLdap.error.generic }}

+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ +
+
+ +
+
+ Saved +
+ +
+ +
+
+
diff --git a/src/views/users.js b/src/views/users.js index 390ad5751..89d4ee5f9 100644 --- a/src/views/users.js +++ b/src/views/users.js @@ -413,6 +413,59 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio } }; + $scope.externalLdap = { + busy: false, + error: {}, + success: false, + + // fields + enabled: false, + url: '', + baseDn: '', + filter: '', + bindDn: '', + bindPassword: '', + + submit: function () { + $scope.externalLdap.busy = true; + $scope.externalLdap.error = {}; + $scope.externalLdap.success = false; + + var config = { + enabled: $scope.externalLdap.enabled, + url: $scope.externalLdap.url, + baseDn: $scope.externalLdap.baseDn, + filter: $scope.externalLdap.filter + }; + + if ($scope.externalLdap.bindDn) { + config.bindDn = $scope.externalLdap.bindDn; + config.bindPassword = $scope.externalLdap.bindPassword; + } + + Client.setExternalLdapConfig(config, function (error) { + $scope.externalLdap.busy = false; + + if (error) { + console.error(error); + if (error.statusCode === 424) { + $scope.externalLdap.error.url = true; + } else if (error.statusCode === 400 && error.message === 'invalid baseDn') { + $scope.externalLdap.error.baseDn = true; + } else if (error.statusCode === 400 && error.message === 'invalid filter') { + $scope.externalLdap.error.filter = true; + } else if (error.statusCode === 400 && error.message === 'invalid bind credentials') { + $scope.externalLdap.error.credentials = true; + } else { + $scope.externalLdap.error.generic = error.message; + } + } else { + $scope.externalLdap.success = true; + } + }); + } + }; + $scope.copyToClipboard = function (/*value*/) { document.execCommand('copy'); }; @@ -488,6 +541,19 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio }); } + function loadExternalLdapConfig() { + Client.getExternalLdapConfig(function (error, result) { + if (error) return console.error('Unable to get external ldap config.', error); + + $scope.externalLdap.enabled = result.enabled; + $scope.externalLdap.url = result.url; + $scope.externalLdap.baseDn = result.baseDn; + $scope.externalLdap.filter = result.filter; + $scope.externalLdap.bindDn = result.bindDn; + $scope.externalLdap.bindPassword = result.bindPassword; + }); + } + $scope.showNextPage = function () { $scope.currentPage++; refreshUsers(); @@ -505,6 +571,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio }; Client.onReady(refresh); + Client.onReady(loadExternalLdapConfig); // setup all the dialog focus handling ['userAddModal', 'userRemoveModal', 'userEditModal', 'groupAddModal', 'groupEditModal', 'groupRemoveModal'].forEach(function (id) {