Rework the email domain and alias handling for user edits to fix various bugs
This commit is contained in:
@@ -168,8 +168,9 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
email: '',
|
||||
fallbackEmail: '',
|
||||
aliases: {},
|
||||
emailAddresses: [],
|
||||
availableEmailAddresses: [],
|
||||
selectedEmailDomains: [],
|
||||
currentEmailDomains: [],
|
||||
availableEmailDomains: [],
|
||||
superuser: false,
|
||||
|
||||
show: function (userInfo) {
|
||||
@@ -181,8 +182,9 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
$scope.useredit.groupIds = angular.copy(userInfo.groupIds);
|
||||
$scope.useredit.superuser = userInfo.groupIds.indexOf('admin') !== -1;
|
||||
|
||||
$scope.useredit.availableEmailAddresses = $scope.emailDomains.map(function (d) { return userInfo.username + '@' + d.domain; });
|
||||
$scope.useredit.emailAddresses = [];
|
||||
$scope.useredit.availableEmailDomains = $scope.emailDomains.map(function (d) { return { domain: d, address: userInfo.username + '@' + d.domain }; });
|
||||
$scope.useredit.currentEmailDomains = [];
|
||||
$scope.useredit.selectedEmailDomains = [];
|
||||
$scope.useredit.aliases = {};
|
||||
|
||||
// fetch user's mailboxes and aliases
|
||||
@@ -191,13 +193,19 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
Client.getUserMailbox(domain.domain, userInfo.id, function (error) {
|
||||
if (error) return callback();
|
||||
|
||||
var emailAddress = userInfo.username + '@' + domain.domain;
|
||||
tmp.push(emailAddress);
|
||||
var d = $scope.useredit.availableEmailDomains.find(function (d) { return d.domain.domain === domain.domain; });
|
||||
if (!d) {
|
||||
console.error('Unable to map domain, this should never happen.');
|
||||
return callback();
|
||||
}
|
||||
|
||||
$scope.useredit.currentEmailDomains.push(d);
|
||||
tmp.push(d);
|
||||
|
||||
Client.getAliases(domain.domain, userInfo.id, function (error, result) {
|
||||
if (error) return callback();
|
||||
|
||||
$scope.useredit.aliases[emailAddress] = result.join(',');
|
||||
$scope.useredit.aliases[d.address] = result.join(',');
|
||||
|
||||
callback();
|
||||
});
|
||||
@@ -208,7 +216,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
if (error) return console.error(error);
|
||||
|
||||
// we need this copy as angular multiselect cannot deal with dynamic arrays!
|
||||
$scope.useredit.emailAddresses = tmp;
|
||||
$scope.useredit.selectedEmailDomains = tmp;
|
||||
});
|
||||
|
||||
$scope.useredit_form.$setPristine();
|
||||
@@ -236,8 +244,9 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
$scope.useredit.error = {};
|
||||
$scope.useredit.busy = true;
|
||||
|
||||
var userId = $scope.useredit.userInfo.id;
|
||||
var data = {
|
||||
id: $scope.useredit.userInfo.id,
|
||||
id: userId,
|
||||
email: $scope.useredit.email,
|
||||
fallbackEmail: $scope.useredit.fallbackEmail
|
||||
};
|
||||
@@ -266,40 +275,71 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
Client.setGroups(data.id, $scope.useredit.groupIds, function (error) {
|
||||
if (error) return console.error('Unable to update groups for user:', error);
|
||||
|
||||
asyncForEach($scope.useredit.availableEmailAddresses, function (address, callback) {
|
||||
var isEnabled = !!$scope.useredit.emailAddresses.find(function (a) { return a === address; });
|
||||
var userId = $scope.useredit.userInfo.id;
|
||||
var addedEmailDomains = $scope.useredit.selectedEmailDomains.filter(function (s) {
|
||||
return !$scope.useredit.currentEmailDomains.find(function (c) {
|
||||
return c.domain.domain === s.domain.domain;
|
||||
});
|
||||
});
|
||||
var removedEmailDomains = $scope.useredit.currentEmailDomains.filter(function (c) {
|
||||
return !$scope.useredit.selectedEmailDomains.find(function (s) {
|
||||
return s.domain.domain === c.domain.domain;
|
||||
});
|
||||
});
|
||||
|
||||
var domain = $scope.emailDomains.find(function (d) { return address.split('@')[1] === d.domain; });
|
||||
if (!domain) console.error('Domain not found. Internal error should not happen.');
|
||||
|
||||
var aliases = $scope.useredit.aliases[address] ? $scope.useredit.aliases[address].split(',') : [];
|
||||
|
||||
Client.setAliases(domain.domain, userId, aliases, function (error) {
|
||||
asyncForEach(removedEmailDomains, function (emailDomain, callback) {
|
||||
// cleanup aliases first
|
||||
Client.setAliases(emailDomain.domain.domain, userId, [], function (error) {
|
||||
if (error) return callback(error);
|
||||
|
||||
// TODO we could be smarter and check if the selection has actually changed
|
||||
if (isEnabled) Client.enableUserMailbox(domain.domain, userId, callback);
|
||||
else Client.disableUserMailbox(domain.domain, userId, callback);
|
||||
Client.disableUserMailbox(emailDomain.domain.domain, userId, callback);
|
||||
});
|
||||
}, function (error) {
|
||||
$scope.useredit.busy = false;
|
||||
if (error) {
|
||||
$scope.useredit.busy = false;
|
||||
return console.error('Unable to remove mailboxes and aliases.', error);
|
||||
}
|
||||
|
||||
if (error) return console.error('unable to adjust email addresses.', error);
|
||||
// enable email on domains
|
||||
asyncForEach(addedEmailDomains, function (emailDomain, callback) {
|
||||
Client.enableUserMailbox(emailDomain.domain.domain, userId, function (error) {
|
||||
if (error) return callback(error);
|
||||
|
||||
$scope.useredit.userInfo = {};
|
||||
$scope.useredit.email = '';
|
||||
$scope.useredit.superuser = false;
|
||||
$scope.useredit.groupIds = [];
|
||||
$scope.useredit.emailAddresses = [];
|
||||
$scope.useredit.aliases = '';
|
||||
var aliases = $scope.useredit.aliases[emailDomain.address] ? $scope.useredit.aliases[emailDomain.address].split(',') : [];
|
||||
|
||||
$scope.useredit_form.$setPristine();
|
||||
$scope.useredit_form.$setUntouched();
|
||||
Client.setAliases(emailDomain.domain.domain, userId, aliases, callback);
|
||||
});
|
||||
}, function (error) {
|
||||
if (error) {
|
||||
$scope.useredit.busy = false;
|
||||
return console.error('Unable to remove mailboxes and aliases.', error);
|
||||
}
|
||||
|
||||
refresh();
|
||||
// sync the aliases for enabled domains
|
||||
asyncForEach($scope.useredit.selectedEmailDomains, function (emailDomain, callback) {
|
||||
var aliases = $scope.useredit.aliases[emailDomain.address] ? $scope.useredit.aliases[emailDomain.address].split(',') : [];
|
||||
Client.setAliases(emailDomain.domain.domain, userId, aliases, callback);
|
||||
}, function (error) {
|
||||
$scope.useredit.busy = false;
|
||||
|
||||
$('#userEditModal').modal('hide');
|
||||
if (error) return console.error('unable to adjust email addresses.', error);
|
||||
|
||||
$scope.useredit.userInfo = {};
|
||||
$scope.useredit.email = '';
|
||||
$scope.useredit.superuser = false;
|
||||
$scope.useredit.groupIds = [];
|
||||
$scope.useredit.availableEmailDomains = [];
|
||||
$scope.useredit.currentEmailDomains = [];
|
||||
$scope.useredit.selectedEmailDomains = [];
|
||||
$scope.useredit.aliases = '';
|
||||
|
||||
$scope.useredit_form.$setPristine();
|
||||
$scope.useredit_form.$setUntouched();
|
||||
|
||||
refresh();
|
||||
|
||||
$('#userEditModal').modal('hide');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -360,7 +400,8 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
|
||||
busyFetching: false,
|
||||
error: {},
|
||||
group: null,
|
||||
lists: [],
|
||||
selectedLists: [],
|
||||
currentLists: [],
|
||||
availableLists: [],
|
||||
|
||||
show: function (group) {
|
||||
|
||||
Reference in New Issue
Block a user