users: cannot update profile fields of external user

This commit is contained in:
Girish Ramakrishnan
2024-01-20 10:41:24 +01:00
parent bd1ab000f3
commit c99c24b3bd
7 changed files with 174 additions and 93 deletions
+44 -47
View File
@@ -186,7 +186,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
$scope.userImport.busy = false;
$scope.userImport.done = true;
if ($scope.userImport.success) {
refresh();
refreshCurrentPage();
refreshAllUsers();
}
});
@@ -254,7 +254,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
$scope.userRemove.userInfo = {};
refresh();
refreshCurrentPage();
refreshAllUsers();
$('#userRemoveModal').modal('hide');
@@ -353,7 +353,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
if ($scope.userAdd.sendInvite) Client.sendInviteEmail(userId, user.email, function (error) { if (error) console.error('Failed to send invite.', error); });
refresh();
refreshCurrentPage();
refreshAllUsers();
$('#userAddModal').modal('hide');
@@ -402,29 +402,36 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
$scope.userEdit.busy = true;
var userId = $scope.userEdit.userInfo.id;
var data = {
id: userId
};
// only send if not the current active user
if (userId !== $scope.userInfo.id) {
data.active = $scope.userEdit.active;
data.role = $scope.userEdit.role;
}
async.series([
function setRole(next) {
if (userId === $scope.userInfo.id) return next(); // cannot set role on self
Client.setRole(userId, $scope.userEdit.role, next);
},
function setActive(next) {
if (userId === $scope.userInfo.id) return next(); // cannot set role on self
Client.setActive(userId, $scope.userEdit.active, next);
},
function updateUserProfile(next) {
if ($scope.userEdit.source) return next(); // cannot update profile of external user
// username is settable only if it was empty previously. it's editable for the "lock" profiles feature
var data = {};
if (!$scope.userEdit.userInfo.username) data.username = $scope.userEdit.username;
data.email = $scope.userEdit.email;
data.displayName = $scope.userEdit.displayName;
data.fallbackEmail = $scope.userEdit.fallbackEmail;
Client.updateUserProfile(userId, data, next);
},
function setGroups(next) {
if ($scope.config.ldapGroupsSynced) return next(); // cannot update user groups when syncing ldap groups
// only change those if it is a local user
if (!$scope.userEdit.source) {
// username is settable only if it was empty previously. it's editable for the "lock" profiles feature
if (!$scope.userEdit.userInfo.username) data.username = $scope.userEdit.username;
data.email = $scope.userEdit.email;
data.displayName = $scope.userEdit.displayName;
data.fallbackEmail = $scope.userEdit.fallbackEmail;
}
var groupIds = $scope.userEdit.selectedGroups.map(function (g) { return g.id; });
Client.setGroups(userId, groupIds, next);
}
], function (error) {
$scope.userEdit.busy = false;
Client.updateUser(data, function (error) {
if (error) {
$scope.userEdit.busy = false;
if (error.statusCode === 409) {
if (error.message.toLowerCase().indexOf('email') !== -1) {
$scope.userEdit.error.email = 'Email already taken';
@@ -441,19 +448,9 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
return;
}
if ($scope.config.ldapGroupsSynced) return; // cannot update user groups when syncing ldap groups
var groupIds = $scope.userEdit.selectedGroups.map(function (g) { return g.id; });
Client.setGroups(data.id, groupIds, function (error) {
$scope.userEdit.busy = false;
if (error) return console.error('Unable to update groups for user:', error);
refreshUsers(false);
$('#userEditModal').modal('hide');
});
refreshUsersCurrentPage(false /* busy indicator */);
if (!$scope.config.ldapGroupsSynced) refreshGroups();
$('#userEditModal').modal('hide');
});
},
@@ -519,7 +516,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
if (error) return console.error('Unable to add memebers.', error.statusCode, error.message);
refresh();
refreshCurrentPage();
$('#groupAddModal').modal('hide');
});
@@ -596,7 +593,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
$scope.groupEdit.busy = false;
if (error) return console.error('Unable to set removed app access.', error.statusCode, error.message);
refresh();
refreshCurrentPage();
// refresh apps to reflect change
Client.refreshInstalledApps();
@@ -676,7 +673,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
if (error) return console.error('Unable to remove group.', error.statusCode, error.message);
refresh();
refreshCurrentPage();
$('#groupRemoveModal').modal('hide');
});
}
@@ -807,7 +804,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
}
};
function getUsers(callback) {
function getUsersCurrentPage(callback) {
var users = [];
Client.getUsers($scope.userSearchString, $scope.userStateFilter.value, $scope.currentPage, $scope.pageItems, function (error, results) {
@@ -827,10 +824,10 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
});
}
function refreshUsers(showBusy) { // loads users on current page only
function refreshUsersCurrentPage(showBusy) { // loads users on current page only
if (showBusy) $scope.userRefreshBusy = true;
getUsers(function (error, result) {
getUsersCurrentPage(function (error, result) {
if (error) return console.error('Unable to get user listing.', error);
angular.copy(result, $scope.users);
@@ -857,26 +854,26 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
});
}
function refresh() {
function refreshCurrentPage() {
refreshGroups(function (error) {
if (error) return console.error('Unable to get group listing.', error);
refreshUsers(true);
refreshUsersCurrentPage(true /* busy indicator */);
});
}
$scope.showNextPage = function () {
$scope.currentPage++;
refreshUsers();
refreshUsersCurrentPage(false /* no busy indicator */);
};
$scope.showPrevPage = function () {
if ($scope.currentPage > 1) $scope.currentPage--;
else $scope.currentPage = 1;
refreshUsers();
refreshUsersCurrentPage(false /* no busy indicator */);
};
$scope.updateFilter = function () {
refreshUsers();
refreshUsersCurrentPage(false /* no busy indicator */);
};
function refreshAllUsers() { // this loads all users on Cloudron, not just current page
@@ -893,7 +890,7 @@ angular.module('Application').controller('UsersController', ['$scope', '$locatio
}
Client.onReady(function () {
refresh();
refreshCurrentPage();
refreshAllUsers();
// Order matters for permissions used in canEdit