diff --git a/src/main/java/it/inaf/oats/vospace/CreateNodeController.java b/src/main/java/it/inaf/oats/vospace/CreateNodeController.java index 27e971ddf91007af6b9882a20fb36982c2944b70..16418249bf8b4a3b5399676c2693b101f0f33efc 100644 --- a/src/main/java/it/inaf/oats/vospace/CreateNodeController.java +++ b/src/main/java/it/inaf/oats/vospace/CreateNodeController.java @@ -63,7 +63,8 @@ public class CreateNodeController extends BaseNodeController { List<String> nodeGroups = Arrays.asList(groupWritePropValues.get(0).split(" ", -1)); - if (!nodeGroups.stream().anyMatch((i) -> userGroups.contains(i))) { + if (userGroups == null || + !nodeGroups.stream().anyMatch((i) -> userGroups.contains(i))) { // If groups don't match check ownership at least List<String> nodeOwner = getNodePropertyByURI(parentNode, "ivo://ivoa.net/vospace/core#creator"); diff --git a/src/test/java/it/inaf/oats/vospace/CreateNodeControllerTest.java b/src/test/java/it/inaf/oats/vospace/CreateNodeControllerTest.java index fdb2a9aa38b4497771751303b8dda1e7d1854c4f..4d8f24daf920e20695e40858ced55cb9fbcf4018 100644 --- a/src/test/java/it/inaf/oats/vospace/CreateNodeControllerTest.java +++ b/src/test/java/it/inaf/oats/vospace/CreateNodeControllerTest.java @@ -17,7 +17,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.mockito.ArgumentMatchers.any; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; @@ -26,9 +25,14 @@ import net.ivoa.xml.vospace.v2.LinkNode; import java.util.List; import it.inaf.ia2.aa.data.User; import java.util.Optional; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @SpringBootTest -@AutoConfigureMockMvc(addFilters = false) +@ContextConfiguration(classes = {TokenFilterConfig.class}) +@TestPropertySource(properties = "spring.main.allow-bean-definition-overriding=true") +@AutoConfigureMockMvc public class CreateNodeControllerTest { @MockBean @@ -48,10 +52,26 @@ public class CreateNodeControllerTest { // Set groupwrite property Property groups = new Property(); groups.setUri("ivo://ivoa.net/vospace/core#groupwrite"); - groups.setValue("test1 test2"); + groups.setValue("group1 group2"); parentNode.setProperties(List.of(groups)); return parentNode; } + + private ContainerNode getContainerParentNodeWithCreator(String path){ + ContainerNode parentNode = new ContainerNode(); + // Set parent node address at / + parentNode.setUri("vos://example.com!vospace" + path); + // Set groupwrite property + Property groups = new Property(); + groups.setUri("ivo://ivoa.net/vospace/core#groupwrite"); + groups.setValue("group3"); + Property creator = new Property(); + creator.setUri("ivo://ivoa.net/vospace/core#creator"); + creator.setValue("user2"); + parentNode.setProperties(List.of(groups,creator)); + return parentNode; + } + private LinkNode getLinkParentNode(String path) { LinkNode parentNode = new LinkNode(); @@ -60,7 +80,7 @@ public class CreateNodeControllerTest { // Set groupwrite property Property groups = new Property(); groups.setUri("ivo://ivoa.net/vospace/core#groupwrite"); - groups.setValue("test1 test2"); + groups.setValue("group1 group2"); parentNode.setProperties(List.of(groups)); return parentNode; } @@ -80,7 +100,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getContainerParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_XML)) @@ -98,7 +118,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getContainerParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_JSON)) @@ -116,7 +136,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getContainerParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -134,7 +154,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getContainerParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) @@ -151,11 +171,8 @@ public class CreateNodeControllerTest { when(nodeDao.listNode(eq("/"))) .thenReturn(Optional.of(getContainerParentNode("/"))); - User user = new User(); - user.setGroups(List.of("test3", "test4")); - mockMvc.perform(put("/nodes/mydata2") - .principal(user) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -176,7 +193,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getContainerParentNode("/mydata1"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -194,7 +211,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.ofNullable(null)); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -203,7 +220,7 @@ public class CreateNodeControllerTest { verifyArguments(); } - + @Test public void testLinkNodeFound() throws Exception { String requestBody = getResourceFileContent("create-unstructured-data-node.xml"); @@ -212,7 +229,7 @@ public class CreateNodeControllerTest { .thenReturn(Optional.of(getLinkParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user2_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -221,16 +238,16 @@ public class CreateNodeControllerTest { verifyArguments(); } - + @Test public void testPermissionDenied() throws Exception { String requestBody = getResourceFileContent("create-unstructured-data-node.xml"); when(nodeDao.listNode(eq("/"))) - .thenReturn(Optional.of(getLinkParentNode("/"))); + .thenReturn(Optional.of(getContainerParentNode("/"))); mockMvc.perform(put("/nodes/mydata1") - .principal(getUser()) + .header("Authorization", "Bearer user1_token") .content(requestBody) .contentType(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML)) @@ -240,6 +257,24 @@ public class CreateNodeControllerTest { verifyArguments(); } + @Test + public void testWriteWithOnlyOwnership() throws Exception { + String requestBody = getResourceFileContent("create-unstructured-data-node.xml"); + + when(nodeDao.listNode(eq("/"))) + .thenReturn(Optional.of(getContainerParentNodeWithCreator("/"))); + + mockMvc.perform(put("/nodes/mydata1") + .header("Authorization", "Bearer user2_token") + .content(requestBody) + .contentType(MediaType.APPLICATION_XML) + .accept(MediaType.APPLICATION_XML)) + .andDo(print()) + .andExpect(status().is2xxSuccessful()); + + verifyArguments(); + } + private void verifyArguments() { verify(controller).createNode( argThat(node -> {