From f3024b5b6e84740c93218cc0a35471bb9b570f1b Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Mon, 6 Jul 2020 16:04:18 +0200 Subject: [PATCH] Improved getUserPermission endpoint --- .../it/inaf/ia2/gms/client/GmsClient.java | 6 +++ .../client/call/GetGroupPermissionsCall.java | 53 +++++++++++++++++++ .../ia2/gms/client/model/GroupPermission.java | 23 ++++++++ gms/pom.xml | 23 ++++++++ .../controller/JWTWebServiceController.java | 24 ++++++--- .../JWTWebServiceControllerTest.java | 33 ++++++++++-- 6 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetGroupPermissionsCall.java create mode 100644 gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/GroupPermission.java diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java index 481e4c3..7792277 100644 --- a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java +++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java @@ -6,11 +6,13 @@ import it.inaf.ia2.gms.client.call.AddMemberCall; import it.inaf.ia2.gms.client.call.AddPermissionCall; import it.inaf.ia2.gms.client.call.CreateGroupCall; import it.inaf.ia2.gms.client.call.DeleteGroupCall; +import it.inaf.ia2.gms.client.call.GetGroupPermissionsCall; import it.inaf.ia2.gms.client.call.GetUserGroupsCall; import it.inaf.ia2.gms.client.call.GetUserPermissionsCall; import it.inaf.ia2.gms.client.call.ListGroupsCall; import it.inaf.ia2.gms.client.call.RemoveMemberCall; import it.inaf.ia2.gms.client.call.RemovePermissionCall; +import it.inaf.ia2.gms.client.model.GroupPermission; import it.inaf.ia2.gms.client.model.Permission; import it.inaf.ia2.gms.client.model.UserPermission; import java.util.List; @@ -74,6 +76,10 @@ public class GmsClient { return new GetUserPermissionsCall(httpClientWrapper).getUserPermissions(userId); } + public List<GroupPermission> getGroupPermissions(String groupId) { + return new GetGroupPermissionsCall(httpClientWrapper).getGroupPermissions(groupId); + } + public void addInvitedRegistration(String token, String email, Map<String, Permission> groupsPermissions) { new AddInvitedRegistrationCall(httpClientWrapper).addInvitedRegistration(token, email, groupsPermissions); } diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetGroupPermissionsCall.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetGroupPermissionsCall.java new file mode 100644 index 0000000..6c0b996 --- /dev/null +++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetGroupPermissionsCall.java @@ -0,0 +1,53 @@ +package it.inaf.ia2.gms.client.call; + +import it.inaf.ia2.gms.client.model.GroupPermission; +import it.inaf.ia2.gms.client.model.Permission; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class GetGroupPermissionsCall extends BaseGmsCall { + + public GetGroupPermissionsCall(HttpClientWrapper clientWrapper) { + super(clientWrapper); + } + + public List<GroupPermission> getGroupPermissions(String groupId) { + + List<GroupPermission> groupPermissions = new ArrayList<>(); + + String endpoint = "permission"; + endpoint += "/" + groupId; + + HttpRequest groupsRequest = newHttpRequest(endpoint) + .header("Accept", "text/plain") + .GET() + .build(); + + return getClient().sendAsync(groupsRequest, HttpResponse.BodyHandlers.ofInputStream()) + .thenApply(response -> { + if (response.statusCode() == 200) { + return response.body(); + } + logServerErrorInputStream(groupsRequest, response); + throw new IllegalStateException("Unable to retrieve groups"); + }) + .thenApply(inputStream -> { + try (Scanner scan = new Scanner(inputStream)) { + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (!line.isEmpty()) { + String[] split = line.split(" "); + GroupPermission groupPermission = new GroupPermission(); + groupPermission.setUserId(split[0]); + groupPermission.setPermission(Permission.valueOf(split[1])); + groupPermissions.add(groupPermission); + } + } + } + return groupPermissions; + }).join(); + } +} diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/GroupPermission.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/GroupPermission.java new file mode 100644 index 0000000..0ce1d59 --- /dev/null +++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/GroupPermission.java @@ -0,0 +1,23 @@ +package it.inaf.ia2.gms.client.model; + +public class GroupPermission { + + private String userId; + private Permission permission; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Permission getPermission() { + return permission; + } + + public void setPermission(Permission permission) { + this.permission = permission; + } +} diff --git a/gms/pom.xml b/gms/pom.xml index cc40470..c799494 100644 --- a/gms/pom.xml +++ b/gms/pom.xml @@ -126,6 +126,29 @@ <executable>true</executable> </configuration> </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.22.2</version> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>0.8.4</version> + <executions> + <execution> + <goals> + <goal>prepare-agent</goal> + </goals> + </execution> + <execution> + <id>report</id> + <phase>test</phase> + <goals> + <goal>report</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> </project> diff --git a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java index ea828d3..04a3827 100644 --- a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java +++ b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java @@ -56,7 +56,7 @@ public class JWTWebServiceController { @Autowired private GroupsService groupsService; - + @Autowired private GroupNameService groupNameService; @@ -231,13 +231,22 @@ public class JWTWebServiceController { response.setStatus(HttpServletResponse.SC_NO_CONTENT); } - @GetMapping(value = "/permission", produces = MediaType.TEXT_PLAIN_VALUE) - public void getUserPermission(@RequestParam("user_id") String userId, HttpServletRequest request, HttpServletResponse response) throws IOException { + @GetMapping(value = {"/permission/{group:.+}", "/permission/"}, produces = MediaType.TEXT_PLAIN_VALUE) + public void getUserPermission(@PathVariable("group") Optional<String> groupNames, @RequestParam("user_id") Optional<String> userId, HttpServletRequest request, HttpServletResponse response) throws IOException { - try (PrintWriter pw = new PrintWriter(response.getOutputStream())) { - for (UserPermission userPermission : searchService.getUserPermission(userId, permissionsManager.getCurrentUserPermissions(getRoot()))) { - String group = String.join(".", userPermission.getGroupCompleteName()); - pw.println(group + " " + userPermission.getPermission()); + if (userId.isPresent()) { + try (PrintWriter pw = new PrintWriter(response.getOutputStream())) { + for (UserPermission userPermission : searchService.getUserPermission(userId.get(), permissionsManager.getCurrentUserPermissions(getRoot()))) { + String group = String.join(".", userPermission.getGroupCompleteName()); + pw.println(group + " " + userPermission.getPermission()); + } + } + } else { + GroupEntity groupEntity = getGroupFromNames(extractGroupNames(groupNames)); + try (PrintWriter pw = new PrintWriter(response.getOutputStream())) { + for (it.inaf.ia2.gms.model.UserPermission up : permissionsManager.getAllPermissions(groupEntity)) { + pw.println(up.getUser().getId() + " " + up.getPermission()); + } } } } @@ -319,7 +328,6 @@ public class JWTWebServiceController { .orElseThrow(() -> new IllegalStateException("Missing root group")); } - private List<String> extractGroupNames(Optional<String> group) { return extractGroupNames(group.orElse(null)); } diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java index e47104e..5bf8234 100644 --- a/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java +++ b/gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java @@ -4,6 +4,8 @@ import it.inaf.ia2.gms.manager.GroupsManager; import it.inaf.ia2.gms.manager.MembershipManager; import it.inaf.ia2.gms.manager.PermissionsManager; import it.inaf.ia2.gms.model.Permission; +import it.inaf.ia2.gms.model.RapUser; +import it.inaf.ia2.gms.model.UserPermission; import it.inaf.ia2.gms.persistence.GroupsDAO; import it.inaf.ia2.gms.persistence.PermissionsDAO; import it.inaf.ia2.gms.persistence.model.GroupEntity; @@ -12,6 +14,7 @@ import it.inaf.ia2.gms.persistence.model.PermissionEntity; import it.inaf.ia2.gms.service.GroupsService; import it.inaf.ia2.gms.service.JoinService; import java.security.Principal; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -175,17 +178,33 @@ public class JWTWebServiceControllerTest { @Test public void testRemoveMember() throws Exception { - List<String> names = Arrays.asList("LBT", "INAF"); - when(groupsDAO.findGroupByParentAndName("", "LBT")).thenReturn(Optional.of(lbt)); when(groupsDAO.findGroupByParentAndName("lbt_id", "INAF")).thenReturn(Optional.of(inaf)); - + mockMvc.perform(delete("/ws/jwt/membership/LBT.INAF?user_id=userId")) .andExpect(status().isNoContent()); verify(membershipManager, times(1)).removeMember(eq(inaf), eq("userId")); } + @Test + public void testGetGroupPermissions() throws Exception { + + when(groupsDAO.findGroupByParentAndName("", "LBT")).thenReturn(Optional.of(lbt)); + when(groupsDAO.findGroupByParentAndName("lbt_id", "INAF")).thenReturn(Optional.of(inaf)); + + List<UserPermission> permissions = new ArrayList<>(); + UserPermission up = new UserPermission(); + up.setUser(getRapUser()); + up.setPermission(Permission.ADMIN); + permissions.add(up); + when(permissionsManager.getAllPermissions(any())).thenReturn(permissions); + + mockMvc.perform(get("/ws/jwt/permission/LBT.INAF").principal(principal)) + .andExpect(status().isOk()) + .andExpect(content().string("rap_user ADMIN\n")); + } + @Test public void testAddPermission() throws Exception { @@ -218,7 +237,7 @@ public class JWTWebServiceControllerTest { public void testRemovePermission() throws Exception { List<String> names = Arrays.asList("LBT", "INAF"); - + //when(groupsService.findGroupByNames(names)).thenReturn(Optional.of(inaf)); when(groupsDAO.findGroupByParentAndName("", "LBT")).thenReturn(Optional.of(lbt)); when(groupsDAO.findGroupByParentAndName("lbt_id", "INAF")).thenReturn(Optional.of(inaf)); @@ -252,4 +271,10 @@ public class JWTWebServiceControllerTest { inaf.setPath("lbt_id.inaf_id"); return inaf; } + + private RapUser getRapUser() { + RapUser user = new RapUser(); + user.setId("rap_user"); + return user; + } } -- GitLab