From 2f085290160bde9ab4e2d82b7a95eb063145fb74 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Fri, 26 Mar 2021 16:17:17 +0100
Subject: [PATCH] Group with dot in name escape bugfix

---
 .../controller/JWTWebServiceController.java   |  2 +-
 .../gms/controller/PermissionsController.java |  2 +-
 .../ia2/gms/service/GroupNameService.java     |  4 ++-
 .../controller/PermissionsControllerTest.java | 26 +++++++++++++++++++
 .../ia2/gms/service/GroupNameServiceTest.java |  2 +-
 5 files changed, 32 insertions(+), 4 deletions(-)

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 95fe2b1..0dd5c86 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
@@ -261,7 +261,7 @@ public class JWTWebServiceController {
         if (userId.isPresent()) {
             try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
                 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());
                 }
             }
diff --git a/gms/src/main/java/it/inaf/ia2/gms/controller/PermissionsController.java b/gms/src/main/java/it/inaf/ia2/gms/controller/PermissionsController.java
index 68fe489..39f649f 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/controller/PermissionsController.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/controller/PermissionsController.java
@@ -125,7 +125,7 @@ public class PermissionsController {
         if (userId.isPresent()) {
             try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {
                 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());
                 }
             }
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/GroupNameService.java b/gms/src/main/java/it/inaf/ia2/gms/service/GroupNameService.java
index 8b58646..d9972a0 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/GroupNameService.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/GroupNameService.java
@@ -83,7 +83,9 @@ public class GroupNameService {
     }
 
     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) {
diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/PermissionsControllerTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/PermissionsControllerTest.java
index 8b41c20..850f97d 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/controller/PermissionsControllerTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/controller/PermissionsControllerTest.java
@@ -7,11 +7,14 @@ import it.inaf.ia2.gms.manager.PermissionsManager;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.model.RapUserPermission;
 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.model.GroupEntity;
 import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.service.GroupNameService;
+import it.inaf.ia2.gms.service.SearchService;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import static org.hamcrest.CoreMatchers.is;
@@ -45,6 +48,9 @@ public class PermissionsControllerTest {
     @Mock
     private PermissionsManager permissionsManager;
 
+    @Mock
+    private SearchService searchService;
+
     @Mock
     private GroupsDAO groupsDAO;
 
@@ -137,6 +143,26 @@ public class PermissionsControllerTest {
                 .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
     public void testAddPermission() throws Exception {
 
diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/GroupNameServiceTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/GroupNameServiceTest.java
index 826e91e..8c16c39 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/service/GroupNameServiceTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/service/GroupNameServiceTest.java
@@ -50,7 +50,7 @@ public class GroupNameServiceTest {
         assertEquals(1, names.size());
         assertEquals(2, names.get("def").size());
         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
-- 
GitLab