From 28ef6304ce2cc8c155955b054be373f67d5c7f11 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Fri, 29 Mar 2019 11:06:01 +0100 Subject: [PATCH] OO-3984: restrict bulk changes too --- .../olat/admin/user/UserAdminController.java | 5 ++++- .../bulkChange/UserBulkChangeManager.java | 20 ++++++++++++++++--- .../ui/admin/UserSearchTableController.java | 7 ++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java index ee534083d03..ecf45ca8bb6 100644 --- a/src/main/java/org/olat/admin/user/UserAdminController.java +++ b/src/main/java/org/olat/admin/user/UserAdminController.java @@ -498,7 +498,10 @@ public class UserAdminController extends BasicController implements Activateable private boolean isPasswordChangesAllowed(Identity identity) { if (managerRoles.isManagerOf(OrganisationRoles.administrator, editedRoles) - || managerRoles.isManagerOf(OrganisationRoles.rolesmanager, editedRoles)) { + || managerRoles.isManagerOf(OrganisationRoles.rolesmanager, editedRoles) + || (managerRoles.isManagerOf(OrganisationRoles.usermanager, editedRoles) + && !editedRoles.isAdministrator() && !editedRoles.isSystemAdmin() + && !editedRoles.isRolesManager())) { // show pwd form only if user has also right to create new passwords in case // of a user that has no password yet if(ldapLoginModule.isLDAPEnabled() && ldapLoginManager.isIdentityInLDAPSecGroup(identity)) { diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java index d25257760d9..dae0c304be6 100644 --- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java +++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java @@ -39,6 +39,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.helpers.Settings; import org.olat.core.id.Identity; import org.olat.core.id.Preferences; +import org.olat.core.id.Roles; import org.olat.core.id.User; import org.olat.core.id.UserConstants; import org.olat.core.logging.OLog; @@ -108,7 +109,7 @@ public class UserBulkChangeManager implements InitializingBean { public void changeSelectedIdentities(List<Identity> selIdentities, UserBulkChanges userBulkChanges, List<String> notUpdatedIdentities, boolean isAdministrativeUser, - Translator trans, Identity actingIdentity) { + Translator trans, Identity actingIdentity, Roles actingRoles) { Translator transWithFallback = userManager.getPropertyHandlerTranslator(trans); String usageIdentifyer = UserBulkChangeStep00.class.getCanonicalName(); @@ -128,9 +129,17 @@ public class UserBulkChangeManager implements InitializingBean { //reload identity from cache, to prevent stale object identity = securityManager.loadIdentityByKey(identity.getKey()); User user = identity.getUser(); + Roles roles = securityManager.getRoles(identity, true); String oldEmail = user.getEmail(); String errorDesc = ""; boolean updateError = false; + + boolean canManagedCritical = actingRoles.isManagerOf(OrganisationRoles.administrator, roles) + || actingRoles.isManagerOf(OrganisationRoles.rolesmanager, roles) + || (actingRoles.isManagerOf(OrganisationRoles.usermanager, roles) + && !roles.isAdministrator() && !roles.isSystemAdmin() + && !roles.isRolesManager()); + // change pwd if (attributeChangeMap.containsKey(CRED_IDENTIFYER)) { String newPwd = attributeChangeMap.get(CRED_IDENTIFYER); @@ -142,7 +151,12 @@ public class UserBulkChangeManager implements InitializingBean { } else { newPwd = null; } - olatAuthManager.changePasswordAsAdmin(identity, newPwd); + + if (canManagedCritical) { + olatAuthManager.changePasswordAsAdmin(identity, newPwd); + } else { + errorDesc = transWithFallback.translate("error.password"); + } } // set language @@ -213,7 +227,7 @@ public class UserBulkChangeManager implements InitializingBean { // set status - if (userBulkChanges.getStatus() != null) { + if (canManagedCritical && userBulkChanges.getStatus() != null) { Integer status = userBulkChanges.getStatus(); String newStatusText = getStatusText(status); Integer oldStatus = identity.getStatus(); diff --git a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java index 68d4a9b0a4b..8f3e5c24fe0 100644 --- a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java +++ b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java @@ -402,7 +402,7 @@ public class UserSearchTableController extends FormBasicController implements Ac final UserBulkChanges userBulkChanges = new UserBulkChanges(); Step start = new UserBulkChangeStep00(ureq, identities, userBulkChanges); // callback executed in case wizard is finished. - StepRunnerCallback finish = (ureq1, wControl1, runContext) -> { + StepRunnerCallback finish = (uureq, wwControl, runContext) -> { // all information to do now is within the runContext saved boolean hasChanges = false; try { @@ -416,9 +416,10 @@ public class UserSearchTableController extends FormBasicController implements Ac if (!attributeChangeMap.isEmpty() || !roleChangeMap.isEmpty() || !ownGroups.isEmpty() || !partGroups.isEmpty() || userBulkChanges.getStatus() != null){ - Identity addingIdentity = ureq1.getIdentity(); + Roles actingRoles = uureq.getUserSession().getRoles(); + Identity actingIdentity = uureq.getIdentity(); userBulkChangesManager.changeSelectedIdentities(identities, userBulkChanges, notUpdatedIdentities, - isAdministrativeUser, getTranslator(), addingIdentity); + isAdministrativeUser, getTranslator(), actingIdentity, actingRoles); hasChanges = true; } runContext.put("notUpdatedIdentities", notUpdatedIdentities); -- GitLab