diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTask.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTask.java index 1d88eb5337335a626f2390c5ab9be78c46ee6fff..184c6af62c41654adc04693552b76ebeb6d395db 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTask.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTask.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.task; import java.io.File; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -24,6 +25,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Level; @@ -151,17 +153,25 @@ public class UserManagementMaintenanceTask extends AbstractGroupMaintenanceTask Log4jSimpleLogger logger = new Log4jSimpleLogger(operationLog); Set<String> knownUsers = new HashSet<>(); UserManager userManager = createUserManager(config, logger, report); + Set<String> usersToBeIgnored = getUsersToBeIgnored(config); for (UserGroup group : config.getGroups()) { - addGroup(userManager, group); + addGroup(userManager, group, usersToBeIgnored); addAllTo(knownUsers, group.getUsers()); addAllTo(knownUsers, config.getInstanceAdmins()); } - userManager.manage(knownUsers); + knownUsers.removeAll(usersToBeIgnored); + userManager.manage(knownUsers, usersToBeIgnored); handleReport(report); operationLog.info("finished"); } + private Set<String> getUsersToBeIgnored(UserManagerConfig config) + { + List<String> usersToBeIgnored = config.getUsersToBeIgnored(); + return usersToBeIgnored != null ? new TreeSet<String>(usersToBeIgnored) : Collections.emptySet(); + } + private static void addAllTo(Collection<String> set, Collection<String> setToBeAddedOrNull) { if (setToBeAddedOrNull != null) @@ -170,7 +180,7 @@ public class UserManagementMaintenanceTask extends AbstractGroupMaintenanceTask } } - private void addGroup(UserManager userManager, UserGroup group) + private void addGroup(UserManager userManager, UserGroup group, Set<String> usersToBeIgnored) { String key = group.getKey(); if (shareIdsMappingFile != null) @@ -188,7 +198,7 @@ public class UserManagementMaintenanceTask extends AbstractGroupMaintenanceTask { for (String user : users) { - principalsByUserId.put(user, new Principal(user, "", "", "")); + addPrincipal(principalsByUserId, new Principal(user, "", "", ""), usersToBeIgnored); } } List<String> ldapGroupKeys = group.getLdapGroupKeys(); @@ -210,7 +220,7 @@ public class UserManagementMaintenanceTask extends AbstractGroupMaintenanceTask } for (Principal principal : principals) { - principalsByUserId.put(principal.getUserId(), principal); + addPrincipal(principalsByUserId, principal, usersToBeIgnored); } } catch (Throwable e) { @@ -228,6 +238,14 @@ public class UserManagementMaintenanceTask extends AbstractGroupMaintenanceTask } } + private void addPrincipal(Map<String, Principal> principalsByUserId, Principal principal, Set<String> usersToBeIgnored) + { + if (usersToBeIgnored.contains(principal.getUserId()) == false) + { + principalsByUserId.put(principal.getUserId(), principal); + } + } + private void handleReport(UserManagerReport report) { String errorReport = report.getErrorReport(); 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 9b7ee1a8a886d5af5a7de832ab94d0fa28c5e309..20da322ca1d110410d9d3414f17c65619e332841 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 @@ -251,7 +251,7 @@ public class UserManager logger.log(LogLevel.INFO, principalsByUserId.size() + " users for " + (group.isEnabled() ? "" : "disabled ") + "group " + groupCode); } - public void manage(Set<String> knownUsers) + public void manage(Set<String> knownUsers, Set<String> usersToBeIgnored) { String sessionToken = null; try @@ -272,7 +272,7 @@ public class UserManager { String groupCode = entry.getKey(); Map<String, Principal> users = entry.getValue(); - manageGroup(sessionToken, groupCode, users, currentState, report); + manageGroup(sessionToken, groupCode, users, usersToBeIgnored, currentState, report); } updateHomeSpaces(sessionToken, currentState, report); removeUsersFromGlobalGroup(sessionToken, currentState, report); @@ -650,17 +650,17 @@ public class UserManager } private void manageGroup(String sessionToken, String groupCode, Map<String, Principal> groupUsers, - CurrentState currentState, UserManagerReport report) + Set<String> usersToBeIgnored, CurrentState currentState, UserManagerReport report) { try { Context context = new Context(sessionToken, service, currentState, report); if (currentState.groupExists(groupCode)) { - manageKnownGroup(context, groupCode, groupUsers); + manageKnownGroup(context, groupCode, groupUsers, usersToBeIgnored); } else { - manageNewGroup(context, groupCode, groupUsers); + manageNewGroup(context, groupCode, groupUsers, usersToBeIgnored); } createSamples(context, groupCode); createExperiments(context, groupCode); @@ -794,13 +794,13 @@ public class UserManager } } - private void manageKnownGroup(Context context, String groupCode, Map<String, Principal> groupUsers) + private void manageKnownGroup(Context context, String groupCode, Map<String, Principal> groupUsers, Set<String> usersToBeIgnored) { createCommonSpaces(context, groupCode); - manageUsers(context, groupCode, groupUsers); + manageUsers(context, groupCode, groupUsers, usersToBeIgnored); } - private void manageNewGroup(Context context, String groupCode, Map<String, Principal> groupUsers) + private void manageNewGroup(Context context, String groupCode, Map<String, Principal> groupUsers, Set<String> usersToBeIgnored) { String adminGroupCode = createAdminGroupCode(groupCode); @@ -809,7 +809,7 @@ public class UserManager createCommonSpaces(context, groupCode); - manageUsers(context, groupCode, groupUsers); + manageUsers(context, groupCode, groupUsers, usersToBeIgnored); } private void createCommonSpaces(Context context, String groupCode) @@ -829,11 +829,12 @@ public class UserManager } } - private void manageUsers(Context context, String groupCode, Map<String, Principal> groupUsers) + private void manageUsers(Context context, String groupCode, Map<String, Principal> groupUsers, Set<String> usersToBeIgnored) { UserGroup group = groupsByCode.get(groupCode); Map<String, Person> currentUsersOfGroup = context.getCurrentState().getCurrentUsersOfGroup(groupCode); Set<String> usersToBeRemoved = new TreeSet<>(currentUsersOfGroup.keySet()); + usersToBeRemoved.removeAll(usersToBeIgnored); AuthorizationGroup globalGroup = context.getCurrentState().getGlobalGroup(); String adminGroupCode = createAdminGroupCode(groupCode); boolean createUserSpace = group == null || group.isCreateUserSpace(); diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagerConfig.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagerConfig.java index fd26889514813c38570f33e9c58c581b7420eb61..591a19d8f3acf3d4cb7188db895b802bf34fe08f 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagerConfig.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagerConfig.java @@ -38,6 +38,8 @@ class UserManagerConfig private List<String> instanceAdmins; + private List<String> usersToBeIgnored; + public List<String> getGlobalSpaces() { return globalSpaces; @@ -98,6 +100,16 @@ class UserManagerConfig this.instanceAdmins = instanceAdmins; } + public List<String> getUsersToBeIgnored() + { + return usersToBeIgnored; + } + + public void setUsersToBeIgnored(List<String> usersToBeIgnored) + { + this.usersToBeIgnored = usersToBeIgnored; + } + public boolean getReuseHomeSpace() { return reuseHomeSpace; diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTaskTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTaskTest.java index 6bf9ae71e4b9b1c42c9be020d5a258c67c607ac3..98dc378fe67149dac4703913691864b58e5872d1 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTaskTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/UserManagementMaintenanceTaskTest.java @@ -255,6 +255,35 @@ public class UserManagementMaintenanceTaskTest extends AbstractFileSystemTestCas logRecorder.getLogContent()); } + @Test + public void testExecuteWithTwoUsersOneIgnored() + { + // Given + UserManagementMaintenanceTaskWithMocks task = new UserManagementMaintenanceTaskWithMocks() + .withUserManagerReport(new UserManagerReport(new MockTimeProvider(0, 1000))); + FileUtilities.writeToFile(configFile, ""); + task.setUp("", properties); + FileUtilities.writeToFile(configFile, "{\"usersToBeIgnored\":[\"beta\"], " + + "\"groups\": [{\"key\":\"ABC\", \"users\":[\"alpha\", \"beta\"]}]}"); + + // When + task.execute(); + + // Then + assertEquals("INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Setup plugin \n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Plugin '' initialized. Configuration file: " + + configFile.getAbsolutePath() + "\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - manage 1 groups\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Global spaces: []\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Common spaces: {}\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Common samples: {}\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Common experiments: []\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - Add group ABC[name:null, enabled:true, ldapGroupKeys:null, users:[alpha, beta], admins:null] with users [alpha=alpha]\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - 1 users for group ABC\n" + + "INFO OPERATION.UserManagementMaintenanceTaskWithMocks - finished", + logRecorder.getLogContent()); + } + @Test public void testExecuteEmptyLdapGroupKeys() { @@ -679,7 +708,7 @@ public class UserManagementMaintenanceTaskTest extends AbstractFileSystemTestCas } @Override - public void manage(Set<String> knownUsers) + public void manage(Set<String> knownUsers, Set<String> usersToBeIgnored) { report.addGroup("dummy group, known users: " + knownUsers); } 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 3f7f94a15f8dbe7c3226856ffc24824d39653ed3..172740e4887be56eb9815681d9dbc0918a870c5a 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 @@ -770,6 +770,45 @@ public class UserManagerTest extends AbstractTest builder.assertExpectations(); } + @Test + public void testRemoveUserToBeIgnoredFromAGroup() + { + // Given + // 1. create group G2 with users U1 (admin), U2 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("G2").admins(U1), users(U1, U2, U3)); + assertEquals(manage(userManager).getErrorReport(), ""); + // 2. remove U2 from group G2 + userManager = new UserManagerBuilder(v3api, logger, report()).commonSpaces(commonSpaces).get(); + userManager.setGlobalSpaces(globalSpaces); + userManager.addGroup(new UserGroupAsBuilder("G2").admins(U1), users(U1, U3)); + + // When + UserManagerReport report = manage(userManager, Collections.singleton(U2.getUserId())); + + // Then + assertEquals(report.getErrorReport(), ""); + assertEquals(report.getAuditLog(), ""); + UserManagerExpectationsBuilder builder = createBuilder(); + builder.groups("G2").commonSpaces(commonSpaces).users(U1, U2, U3); + builder.space("A").observer(U1).observer(U2).observer(U3); + builder.space("B").observer(U1).observer(U2).observer(U3); + builder.space("G2_ALPHA").admin(U1).user(U2, U3); + builder.space("G2_BETA").admin(U1).user(U2, U3); + builder.space("G2_GAMMA").admin(U1).observer(U2, U3); + builder.space("G2_U1").admin(U1).non(U2, U3); + builder.space("G2_U2").admin(U1).admin(U2).non(U3); + builder.space("G2_U3").admin(U1).non(U2).admin(U3); + builder.homeSpace(U1, "G2_U1"); + builder.homeSpace(U2, "G2_U2"); + builder.homeSpace(U3, "G2_U3"); + builder.assertExpectations(); + } + @Test public void testMoveUserToAnotherGroup() { @@ -2124,11 +2163,16 @@ public class UserManagerTest extends AbstractTest private UserManagerReport manage(UserManager userManager, String... knownUsers) { - userManager.manage(new TreeSet<>(Arrays.asList(knownUsers))); + return manage(userManager, Collections.emptySet(), knownUsers); + } + + private UserManagerReport manage(UserManager userManager, Set<String> usersToBeIgnored, String... knownUsers) + { + userManager.manage(new TreeSet<>(Arrays.asList(knownUsers)), usersToBeIgnored); daoFactory.getSessionFactory().getCurrentSession().flush(); return report; } - + private Map<String, Principal> users(Principal... principals) { Map<String, Principal> map = new TreeMap<>();