From 947c53e129e8386b633d491f25ce67012e55eed5 Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Mon, 13 Apr 2020 18:29:24 +0200 Subject: [PATCH] Added web service endpoint for retrieving user permissions. Updated client lib --- .../it/inaf/ia2/gms/client/GmsClient.java | 7 ++- .../client/call/GetUserPermissionsCall.java | 53 +++++++++++++++++++ .../ia2/gms/client/model/UserPermission.java | 23 ++++++++ .../controller/JWTWebServiceController.java | 16 ++++++ .../inaf/ia2/gms/service/SearchService.java | 2 +- 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java create mode 100644 gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.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 eb46bfc..7be236d 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,10 +6,12 @@ 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.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.Permission; +import it.inaf.ia2.gms.client.model.UserPermission; import java.util.List; public class GmsClient { @@ -21,7 +23,6 @@ public class GmsClient { if (!baseUrl.endsWith("/")) { baseUrl += "/"; } - baseUrl += "ws/jwt"; httpClientWrapper = new HttpClientWrapper(baseUrl); } @@ -66,4 +67,8 @@ public class GmsClient { public void removePermission(String completeGroupName, String userId) { new RemovePermissionCall(httpClientWrapper).removePermission(completeGroupName, userId); } + + public List<UserPermission> getUserPermissions(String userId) { + return new GetUserPermissionsCall(httpClientWrapper).getUserPermissions(userId); + } } diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java new file mode 100644 index 0000000..34db2f1 --- /dev/null +++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java @@ -0,0 +1,53 @@ +package it.inaf.ia2.gms.client.call; + +import it.inaf.ia2.gms.client.model.Permission; +import it.inaf.ia2.gms.client.model.UserPermission; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class GetUserPermissionsCall extends BaseGmsCall { + + public GetUserPermissionsCall(HttpClientWrapper clientWrapper) { + super(clientWrapper); + } + + public List<UserPermission> getUserPermissions(String userId) { + + List<UserPermission> userPermissions = new ArrayList<>(); + + String endpoint = "permission"; + endpoint += "?user_id=" + userId; + + 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(" "); + UserPermission userPermission = new UserPermission(); + userPermission.setGroup(split[0]); + userPermission.setPermission(Permission.valueOf(split[1])); + userPermissions.add(userPermission); + } + } + } + return userPermissions; + }).join(); + } +} diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java new file mode 100644 index 0000000..4f9578d --- /dev/null +++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java @@ -0,0 +1,23 @@ +package it.inaf.ia2.gms.client.model; + +public class UserPermission { + + private String group; + private Permission permission; + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public Permission getPermission() { + return permission; + } + + public void setPermission(Permission permission) { + this.permission = permission; + } +} 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 f338cfe..8985b3b 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 @@ -6,6 +6,7 @@ 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.response.UserPermission; import it.inaf.ia2.gms.persistence.GroupsDAO; import it.inaf.ia2.gms.persistence.PermissionsDAO; import it.inaf.ia2.gms.persistence.model.GroupEntity; @@ -13,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 it.inaf.ia2.gms.service.PermissionUtils; +import it.inaf.ia2.gms.service.SearchService; import java.io.IOException; import java.io.PrintWriter; import java.security.Principal; @@ -64,6 +66,9 @@ public class JWTWebServiceController { @Autowired private PermissionsDAO permissionsDAO; + @Autowired + private SearchService searchService; + /** * This endpoint is compliant with the IVOA GMS standard. */ @@ -220,6 +225,17 @@ 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 { + + 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()); + } + } + } + @PostMapping(value = {"/permission/{group:.+}", "/permission/"}, produces = MediaType.TEXT_PLAIN_VALUE) public void addPermission(@PathVariable("group") Optional<String> groupNames, HttpServletRequest request, HttpServletResponse response) throws IOException { diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java b/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java index 62651fb..ac6b72a 100644 --- a/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java +++ b/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java @@ -145,7 +145,7 @@ public class SearchService { .collect(Collectors.toList()); } - private List<UserPermission> getUserPermission(String targetUserId, List<PermissionEntity> actorPermissions) { + public List<UserPermission> getUserPermission(String targetUserId, List<PermissionEntity> actorPermissions) { List<UserPermission> permissions = new ArrayList<>(); -- GitLab