Skip to content
Commits on Source (2)
...@@ -110,31 +110,31 @@ public class JWTWebServiceController { ...@@ -110,31 +110,31 @@ public class JWTWebServiceController {
@GetMapping(value = {"/ws/jwt/search/**", "/vo/search/**"}, produces = MediaType.TEXT_PLAIN_VALUE) @GetMapping(value = {"/ws/jwt/search/**", "/vo/search/**"}, produces = MediaType.TEXT_PLAIN_VALUE)
public void isMemberOf(HttpServletRequest request, HttpServletResponse response) throws IOException { public void isMemberOf(HttpServletRequest request, HttpServletResponse response) throws IOException {
String group = getGroupFromRequest(request, "/ws/jwt/search/", "/vo/search/"); String groupNamesString = getGroupFromRequest(request, "/ws/jwt/search/", "/vo/search/");
List<String> groupNames = groupNameService.extractGroupNames(group); List<String> groupNames = groupNameService.extractGroupNames(groupNamesString);
boolean isMember = membershipManager.isCurrentUserMemberOf("ROOT"); GroupEntity group = null;
if (!isMember) {
String parentPath = ""; // starting from ROOT String parentPath = ""; // starting from ROOT
for (String groupName : groupNames) { for (String groupName : groupNames) {
Optional<GroupEntity> optionalGroup = groupsDAO.findGroupByParentAndName(parentPath, groupName); Optional<GroupEntity> optionalGroup = groupsDAO.findGroupByParentAndName(parentPath, groupName);
if (optionalGroup.isPresent()) { if (optionalGroup.isPresent()) {
GroupEntity groupEntity = optionalGroup.get(); GroupEntity groupEntity = optionalGroup.get();
parentPath = groupEntity.getPath(); parentPath = groupEntity.getPath();
isMember = membershipManager.isCurrentUserMemberOf(groupEntity.getId()); boolean isMember = membershipManager.isCurrentUserMemberOf(groupEntity.getId());
if (isMember) { if (isMember) {
break; group = groupEntity;
}
} else {
break;
} }
} else {
group = null;
break;
} }
} }
if (isMember) { if (group != null) {
try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) { try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
pw.println(group); pw.println(groupNameService.getCompleteName(groupNames));
} }
} }
// else: empty response (as defined by GMS standard) // else: empty response (as defined by GMS standard)
...@@ -261,7 +261,7 @@ public class JWTWebServiceController { ...@@ -261,7 +261,7 @@ public class JWTWebServiceController {
if (userId.isPresent()) { if (userId.isPresent()) {
try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) { try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
for (UserPermission userPermission : searchService.getUserPermission(groupEntity, userId.get(), permissionsManager.getCurrentUserPermissions(groupEntity))) { for (UserPermission userPermission : searchService.getUserPermission(groupEntity, userId.get(), permissionsManager.getCurrentUserPermissions(groupEntity))) {
String group = String.join(".", userPermission.getGroupCompleteName()); String group = groupNameService.getCompleteName(userPermission.getGroupCompleteName());
pw.println(group + " " + userPermission.getPermission()); pw.println(group + " " + userPermission.getPermission());
} }
} }
......
...@@ -125,7 +125,7 @@ public class PermissionsController { ...@@ -125,7 +125,7 @@ public class PermissionsController {
if (userId.isPresent()) { if (userId.isPresent()) {
try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) { try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
for (UserPermission userPermission : searchService.getUserPermission(groupEntity, userId.get(), permissionsManager.getCurrentUserPermissions(groupEntity))) { for (UserPermission userPermission : searchService.getUserPermission(groupEntity, userId.get(), permissionsManager.getCurrentUserPermissions(groupEntity))) {
String group = String.join(".", userPermission.getGroupCompleteName()); String group = groupNameService.getCompleteName(userPermission.getGroupCompleteName());
pw.println(group + " " + userPermission.getPermission()); pw.println(group + " " + userPermission.getPermission());
} }
} }
......
...@@ -120,18 +120,22 @@ public class MembershipsDAO { ...@@ -120,18 +120,22 @@ public class MembershipsDAO {
public boolean isMemberOf(String userId, String groupId) { public boolean isMemberOf(String userId, String groupId) {
String sql = "SELECT COUNT(*) FROM gms_membership " String sql = "SELECT COUNT(*)\n"
+ " WHERE user_id = ? AND group_id = ?"; + "FROM gms_membership m\n"
+ "JOIN gms_group g ON g.id = m.group_id\n"
+ "JOIN gms_group gs ON g.path @> gs.path\n"
+ "WHERE gs.id = ?\n"
+ "AND m.user_id = ?";
return jdbcTemplate.query(conn -> { return jdbcTemplate.query(conn -> {
PreparedStatement ps = conn.prepareStatement(sql); PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, userId); ps.setString(1, groupId);
ps.setString(2, groupId); ps.setString(2, userId);
return ps; return ps;
}, resultSet -> { }, resultSet -> {
resultSet.next(); resultSet.next();
int count = resultSet.getInt(1); int count = resultSet.getInt(1);
return count == 1; return count > 0;
}); });
} }
......
...@@ -83,7 +83,9 @@ public class GroupNameService { ...@@ -83,7 +83,9 @@ public class GroupNameService {
} }
private List<String> splitNames(String completeGroupName) { private List<String> splitNames(String completeGroupName) {
return Arrays.asList(completeGroupName.split("(?<!\\\\)\\.")); return Arrays.stream(completeGroupName.split("(?<!\\\\)\\."))
.map(name -> name.replace("\\.", "."))
.collect(Collectors.toList());
} }
public String getShortGroupName(String completeGroupName, Optional<String> groupPrefix) { public String getShortGroupName(String completeGroupName, Optional<String> groupPrefix) {
...@@ -157,6 +159,12 @@ public class GroupNameService { ...@@ -157,6 +159,12 @@ public class GroupNameService {
return names; return names;
} }
public String getCompleteName(List<String> names) {
return String.join(".", names.stream()
.map(n -> n.replace(".", "\\."))
.collect(Collectors.toList()));
}
private GroupEntity getRoot() { private GroupEntity getRoot() {
return groupsDAO.findGroupById("ROOT") return groupsDAO.findGroupById("ROOT")
.orElseThrow(() -> new IllegalStateException("Missing root group")); .orElseThrow(() -> new IllegalStateException("Missing root group"));
......
...@@ -115,11 +115,15 @@ public class JWTWebServiceControllerTest { ...@@ -115,11 +115,15 @@ public class JWTWebServiceControllerTest {
when(membershipManager.isCurrentUserMemberOf(eq(group3.getId()))).thenReturn(true); when(membershipManager.isCurrentUserMemberOf(eq(group3.getId()))).thenReturn(true);
String group = "group\\.1.subgroup.subsubgroup"; String group = "group%5C.1.subgroup.subsubgroup";
mockMvc.perform(get("/ws/jwt/search/" + group).principal(principal)) mockMvc.perform(get("/vo/search/" + group).principal(principal))
.andExpect(status().isOk()) .andExpect(status().isOk())
.andExpect(content().string(group + "\n")); .andExpect(content().string("group\\.1.subgroup.subsubgroup\n"));
mockMvc.perform(get("/vo/search/" + group + "/inexistent").principal(principal))
.andExpect(status().isOk())
.andExpect(content().string(""));
} }
@Test @Test
......
...@@ -7,11 +7,14 @@ import it.inaf.ia2.gms.manager.PermissionsManager; ...@@ -7,11 +7,14 @@ import it.inaf.ia2.gms.manager.PermissionsManager;
import it.inaf.ia2.gms.model.Permission; import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUserPermission; import it.inaf.ia2.gms.model.RapUserPermission;
import it.inaf.ia2.gms.model.request.AddPermissionRequest; import it.inaf.ia2.gms.model.request.AddPermissionRequest;
import it.inaf.ia2.gms.model.response.UserPermission;
import it.inaf.ia2.gms.persistence.GroupsDAO; import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity; import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.service.GroupNameService; import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.SearchService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
...@@ -45,6 +48,9 @@ public class PermissionsControllerTest { ...@@ -45,6 +48,9 @@ public class PermissionsControllerTest {
@Mock @Mock
private PermissionsManager permissionsManager; private PermissionsManager permissionsManager;
@Mock
private SearchService searchService;
@Mock @Mock
private GroupsDAO groupsDAO; private GroupsDAO groupsDAO;
...@@ -137,6 +143,26 @@ public class PermissionsControllerTest { ...@@ -137,6 +143,26 @@ public class PermissionsControllerTest {
.andExpect(content().string("rap_user ADMIN\n")); .andExpect(content().string("rap_user ADMIN\n"));
} }
@Test
public void testGetUserPermissions() throws Exception {
when(groupsDAO.findGroupByParentAndName("", "people")).thenReturn(Optional.of(getPeopleGroup()));
when(groupsDAO.findGroupByParentAndName("people_id", "name.surname")).thenReturn(Optional.of(getNameSurnameGroup()));
List<UserPermission> permissions = new ArrayList<>();
UserPermission up = new UserPermission();
up.setGroupCompleteName(Arrays.asList("people", "name.surname"));
up.setPermission(Permission.VIEW_MEMBERS);
permissions.add(up);
when(searchService.getUserPermission(any(), any(), any())).thenReturn(permissions);
mockMvc.perform(get("/permission?group=people.name\\.surname&user_id=id").principal(getPrincipal())
.accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andExpect(content().string("people.name\\.surname VIEW_MEMBERS\n"));
}
@Test @Test
public void testAddPermission() throws Exception { public void testAddPermission() throws Exception {
......
...@@ -37,8 +37,8 @@ public class MembershipsDAOTest { ...@@ -37,8 +37,8 @@ public class MembershipsDAOTest {
@Test @Test
public void testAddAndRemoveMembers() { public void testAddAndRemoveMembers() {
groupsDAO.createGroup(groupEntity("A")); groupsDAO.createGroup(groupEntity("A", "A"));
groupsDAO.createGroup(groupEntity("B")); groupsDAO.createGroup(groupEntity("B", "B"));
assertTrue(membershipsDAO.findByGroup("A").isEmpty()); assertTrue(membershipsDAO.findByGroup("A").isEmpty());
...@@ -72,11 +72,48 @@ public class MembershipsDAOTest { ...@@ -72,11 +72,48 @@ public class MembershipsDAOTest {
membershipsDAO.deleteAllGroupsMembership(new ArrayList<>()); membershipsDAO.deleteAllGroupsMembership(new ArrayList<>());
} }
private GroupEntity groupEntity(String groupId) { @Test
public void testIsMemberOfRecursive() {
groupsDAO.createGroup(groupEntity("ROOT", ""));
groupsDAO.createGroup(groupEntity("A", "A"));
groupsDAO.createGroup(groupEntity("E", "A.E"));
groupsDAO.createGroup(groupEntity("F", "A.E.F"));
groupsDAO.createGroup(groupEntity("B", "B"));
groupsDAO.createGroup(groupEntity("C", "B.C"));
groupsDAO.createGroup(groupEntity("D", "B.C.D"));
membershipsDAO.addMember(membershipEntity(USER_1, "F"));
membershipsDAO.addMember(membershipEntity(USER_1, "C"));
assertFalse(membershipsDAO.isMemberOf(USER_1, "ROOT"));
assertFalse(membershipsDAO.isMemberOf(USER_1, "A"));
assertFalse(membershipsDAO.isMemberOf(USER_1, "B"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "C"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "D"));
assertFalse(membershipsDAO.isMemberOf(USER_1, "E"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "F"));
membershipsDAO.addMember(membershipEntity(USER_1, "ROOT"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "ROOT"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "A"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "B"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "C"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "D"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "E"));
assertTrue(membershipsDAO.isMemberOf(USER_1, "F"));
assertFalse(membershipsDAO.isMemberOf(USER_1, "inexistent-id"));
}
private GroupEntity groupEntity(String groupId, String groupPath) {
GroupEntity groupEntity = new GroupEntity(); GroupEntity groupEntity = new GroupEntity();
groupEntity.setId(groupId); groupEntity.setId(groupId);
groupEntity.setName(groupId); groupEntity.setName(groupId);
groupEntity.setPath(groupId); groupEntity.setPath(groupPath);
groupEntity.setLeaf(false); groupEntity.setLeaf(false);
return groupEntity; return groupEntity;
} }
......
...@@ -50,7 +50,7 @@ public class GroupNameServiceTest { ...@@ -50,7 +50,7 @@ public class GroupNameServiceTest {
assertEquals(1, names.size()); assertEquals(1, names.size());
assertEquals(2, names.get("def").size()); assertEquals(2, names.get("def").size());
assertEquals("Parent_group", names.get("def").get(0)); assertEquals("Parent_group", names.get("def").get(0));
assertEquals("Child\\.withDot", names.get("def").get(1)); assertEquals("Child.withDot", names.get("def").get(1));
} }
@Test @Test
......