From 356bc7efc3cd908a56e991572061e17e3003c0bf Mon Sep 17 00:00:00 2001 From: felmer <franz-josef.elmer@id.ethz.ch> Date: Thu, 27 Jul 2023 20:21:53 +0200 Subject: [PATCH] SSDM-13800: handle case when ignored users are in a group to be deleted --- .../generic/server/task/UserManager.java | 8 ++-- .../systemtest/task/UserManagerTest.java | 42 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java index 20da322ca1d..dd8ac2d8865 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java @@ -267,7 +267,7 @@ public class UserManager } CurrentState currentState = loadCurrentState(sessionToken, service); manageInstanceAdmins(sessionToken, currentState, report); - removeGroups(sessionToken, currentState, groupsToBeRemoved, report); + removeGroups(sessionToken, currentState, groupsToBeRemoved, usersToBeIgnored, report); for (Entry<String, Map<String, Principal>> entry : usersByGroupCode.entrySet()) { String groupCode = entry.getKey(); @@ -348,13 +348,15 @@ public class UserManager } private void removeGroups(String sessionToken, CurrentState currentState, List<AuthorizationGroup> groups, - UserManagerReport report) + Set<String> usersToBeIgnored, UserManagerReport report) { List<IAuthorizationGroupId> groupIds = new ArrayList<>(); Context context = new Context(sessionToken, service, currentState, report); for (AuthorizationGroup group : groups) { - removeUsersFromGroup(context, group.getCode(), extractUserIds(group)); + Set<String> users = extractUserIds(group); + users.removeAll(usersToBeIgnored); + removeUsersFromGroup(context, group.getCode(), users); groupIds.add(group.getPermId()); report.removeGroup(group.getCode()); String adminGroupCode = group.getCode() + ADMIN_POSTFIX; diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/task/UserManagerTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/task/UserManagerTest.java index 172740e4887..c065cfd6075 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/task/UserManagerTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/task/UserManagerTest.java @@ -1064,6 +1064,48 @@ public class UserManagerTest extends AbstractTest builder.assertExpectations(); } + @Test + public void testRemoveAGroupWithAUserToBeIgnored() + { + // Given + // 1. create group G1 with users U1 (admin) and group G2 with U2 (admin) and U3 + MockLogger logger = new MockLogger(); + Map<Role, List<String>> commonSpaces = commonSpaces(); + UserManager userManager = new UserManagerBuilder(v3api, logger, report()).commonSpaces(commonSpaces).get(); + List<String> globalSpaces = Arrays.asList("A", "B"); + userManager.setGlobalSpaces(globalSpaces); + userManager.addGroup(new UserGroupAsBuilder("G1").admins(U1), users(U1)); + userManager.addGroup(new UserGroupAsBuilder("G2").admins(U2), users(U2, U3)); + assertEquals(manage(userManager).getErrorReport(), ""); + // 2. remove group G2 + userManager = new UserManagerBuilder(v3api, logger, report()).commonSpaces(commonSpaces).get(); + userManager.setGlobalSpaces(globalSpaces); + userManager.addGroup(new UserGroupAsBuilder("G1").admins(U1), users(U1)); + + // When + UserManagerReport report = manage(userManager, Collections.singleton(U3.getUserId())); + + // Then + assertEquals(report.getErrorReport(), ""); + assertEquals(report.getAuditLog(), "1970-01-01 01:00:00 [REMOVE-USER-FROM-AUTHORIZATION-GROUP] group: G2, user: u2\n" + + "1970-01-01 01:00:01 [REMOVE-USER-FROM-AUTHORIZATION-GROUP] group: G2_ADMIN, user: u2\n" + + "1970-01-01 01:00:02 [UNASSIGN-ROLE-FORM-USER] user: u2, role: SPACE_ADMIN for G2_U2\n" + + "1970-01-01 01:00:03 [REMOVE-AUTHORIZATION-GROUP] G2\n" + + "1970-01-01 01:00:04 [REMOVE-AUTHORIZATION-GROUP] G2_ADMIN\n" + + "1970-01-01 01:00:05 [REMOVE-USER-FROM-AUTHORIZATION-GROUP] group: ALL_GROUPS, user: u2\n"); + UserManagerExpectationsBuilder builder = createBuilder(); + builder.groups("G1").commonSpaces(commonSpaces).users(U1); + builder.usersWithoutAuthentication(U2); + builder.space("G1_ALPHA").admin(U1); + builder.space("G1_BETA").admin(U1); + builder.space("G1_GAMMA").admin(U1); + builder.space("G2_U3").non(U1).admin(U3); + builder.homeSpace(U1, "G1_U1"); + builder.homeSpace(U2, "G2_U2"); + builder.homeSpace(U3, "G2_U3"); + builder.assertExpectations(); + } + @Test public void testRemoveAGroupAndAddItAgain() { -- GitLab