diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserGroupMapping.java b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserGroupMapping.java index d8814e25056173a4457e0fdd11161ada27a01589..c09db1124a3ffb7abbe779dace48fa4eac05e91a 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserGroupMapping.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserGroupMapping.java @@ -36,6 +36,15 @@ public class UserGroupMapping implements DatabaseObject { this.groups = this.groups.concat("," + s); } + public void removeGroup(String s) { + if (this.groups.contains(s) ) { + if (this.groups.contains(",")) + this.groups = this.groups.replace(s + ",", ""); + else + this.groups = ""; + } + } + @Override public PreparedStatement getInsert(PreparedStatement ps) throws Exception { ps.setString(1, username); diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/AddUserToGroupFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/AddUserToGroupFlow.java index 412b2fe6ca34d9048e160a1fb9cc593511996e44..f3dae3392a08cd0de60243a85546fa221cadf291 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/AddUserToGroupFlow.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/AddUserToGroupFlow.java @@ -23,45 +23,44 @@ import static net.jami.jams.server.Server.userAuthenticationModule; public class AddUserToGroupFlow { public static void addUserToGroup(String groupName, String username) { + userAuthenticationModule.getAuthSources().forEach((k, v) -> { + List<UserProfile> profiles = v.searchUserProfiles(username, "LOGON_NAME"); + if (!profiles.isEmpty()) { + UserProfile profile = profiles.get(0); + StatementList statementList = new StatementList(); + statementList.addStatement(new StatementElement("name", "=", username, "")); - userAuthenticationModule.getAuthSources().forEach((k, v) -> { - List<UserProfile> profiles = v.searchUserProfiles(username, "LOGON_NAME"); - if (!profiles.isEmpty()) { - UserProfile profile = profiles.get(0); - StatementList statementList = new StatementList(); - statementList.addStatement(new StatementElement("name", "=", username, "")); - - if (profile != null) { - if (profile.getGroupMemberships() == null) - profile.setGroupMemberships(new ArrayList<>()); - profile.getGroupMemberships().add(groupName); - } + if (profile != null) { + if (profile.getGroupMemberships() == null) + profile.setGroupMemberships(new ArrayList<>()); + profile.getGroupMemberships().add(groupName); + } - statementList = new StatementList(); - statementList.addStatement(new StatementElement("username", "=", username, "")); - if (dataStore.getUserGroupMappingsDao().getObjects(statementList).isEmpty()) { - // if the mapping doesn't exist, create it and add the group directly. - UserGroupMapping newMapping = new UserGroupMapping(); - newMapping.setUsername(username); - newMapping.setGroups(""); - newMapping.addGroup(groupName); - dataStore.getUserGroupMappingsDao().storeObject(newMapping); - } else { - // otherwise, update the object. + statementList = new StatementList(); + statementList.addStatement(new StatementElement("username", "=", username, "")); + if (dataStore.getUserGroupMappingsDao().getObjects(statementList).isEmpty()) { + // if the mapping doesn't exist, create it and add the group directly. + UserGroupMapping newMapping = new UserGroupMapping(); + newMapping.setUsername(username); + newMapping.setGroups(""); + newMapping.addGroup(groupName); + dataStore.getUserGroupMappingsDao().storeObject(newMapping); + } else { + // otherwise, update the object. - UserGroupMapping mapping = dataStore.getUserGroupMappingsDao().getObjects(statementList).get(0); - mapping.addGroup(groupName); - String newGroups = mapping.getGroups(); + UserGroupMapping mapping = dataStore.getUserGroupMappingsDao().getObjects(statementList).get(0); + mapping.addGroup(groupName); + String newGroups = mapping.getGroups(); - StatementList update = new StatementList(); - StatementElement st0 = new StatementElement("groups", "=", newGroups, ""); - update.addStatement(st0); - StatementList constraint = new StatementList(); - StatementElement st1 = new StatementElement("username", "=", username, ""); - constraint.addStatement(st1); - dataStore.getUserGroupMappingsDao().updateObject(update, constraint); - } + StatementList update = new StatementList(); + StatementElement st0 = new StatementElement("groups", "=", newGroups, ""); + update.addStatement(st0); + StatementList constraint = new StatementList(); + StatementElement st1 = new StatementElement("username", "=", username, ""); + constraint.addStatement(st1); + dataStore.getUserGroupMappingsDao().updateObject(update, constraint); } - }); + } + }); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java index 828b69e7be2e7ecd0744089864f2b8f4a1f5eaea..46bc2e01336e505936a7e703fd1e028b38c35296 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java @@ -10,10 +10,7 @@ import lombok.extern.slf4j.Slf4j; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.dao.StatementElement; import net.jami.jams.common.dao.StatementList; -import net.jami.jams.common.objects.user.AccessLevel; -import net.jami.jams.common.objects.user.Group; -import net.jami.jams.common.objects.user.User; -import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.common.objects.user.*; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import net.jami.jams.server.core.workflows.AddUserToGroupFlow; import net.jami.jams.server.core.workflows.RegisterDeviceFlow; @@ -80,15 +77,52 @@ public class GroupServlet extends HttpServlet { @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException { String name = req.getParameter("newName"); + StatementList statementList = new StatementList(); + StatementElement st = new StatementElement("name", "=", name, ""); + + statementList.addStatement(st); + Group targetGroup = dataStore.getGroupDao().getObjects(statementList).get(0); + List<UserProfile> profiles = dataStore.getUserProfileDao().getObjects(null).stream().filter(profile -> + profile.getGroupMemberships().contains(targetGroup.getName())).collect(Collectors.toList()); + + profiles.forEach(profile -> + targetGroup.getGroupMembers().add(profile.getUsername())); + + // if the username sent isn't already part of the group members, then we add it + if (!targetGroup.getGroupMembers().contains(req.getParameter("groupMembers"))) + AddUserToGroupFlow.addUserToGroup(name, req.getParameter("groupMembers")); + // otherwise remove the group from the user's memberships. + else { + statementList = new StatementList(); + st = new StatementElement("username", "=", req.getParameter("groupMembers"), ""); + statementList.addStatement(st); + + UserProfile targetProfile = dataStore.getUserProfileDao().getObjects(statementList).get(0); + UserGroupMapping mapping = dataStore.getUserGroupMappingsDao().getObjects(statementList).get(0); + mapping.removeGroup(name); + + StatementList update = new StatementList(); + StatementElement st0 = new StatementElement("groups", "=", mapping.getGroups(), ""); + update.addStatement(st0); + StatementList constraint = new StatementList(); + StatementElement st1 = new StatementElement("username", "=", mapping.getUsername(), ""); + constraint.addStatement(st1); + + // update user mappings + dataStore.getUserGroupMappingsDao().updateObject(update, constraint); + + List<String> groups = targetProfile.getGroupMemberships(); + groups.remove(name); + // TODO: LDAP/AD handling + dataStore.updateUserProfile(targetProfile); + } + StatementList update = new StatementList(); StatementElement st0 = new StatementElement("name", "=", name, ""); update.addStatement(st0); StatementList constraint = new StatementList(); StatementElement st1 = new StatementElement("name", "=", name, ""); constraint.addStatement(st1); - - AddUserToGroupFlow.addUserToGroup(name, req.getParameter("groupMembers")); - if (dataStore.getGroupDao().updateObject(update, constraint)) resp.setStatus(200); else resp.sendError(500, "could not update the group's name!"); }