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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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) {