From 7766a99154ec51518f64039ada3eac59d01e76de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 27 Aug 2018 10:45:20 +0200 Subject: [PATCH] Do not delete permissions on repository update --- .../api/v2/resources/RepositoryResource.java | 8 +++++- .../resources/RepositoryRootResourceTest.java | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java index c21b7727cb..3ee27f5f84 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java @@ -128,11 +128,17 @@ public class RepositoryResource { public Response update(@PathParam("namespace") String namespace, @PathParam("name") String name, RepositoryDto repositoryDto) { return adapter.update( loadBy(namespace, name), - existing -> dtoToRepositoryMapper.map(repositoryDto, existing.getId()), + existing -> processUpdate(repositoryDto, existing), nameAndNamespaceStaysTheSame(namespace, name) ); } + private Repository processUpdate(RepositoryDto repositoryDto, Repository existing) { + Repository changedRepository = dtoToRepositoryMapper.map(repositoryDto, existing.getId()); + changedRepository.setPermissions(existing.getPermissions()); + return changedRepository; + } + @Path("tags/") public TagRootResource tags() { return tagRootResource.get(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index d47b26e5eb..31cacf2d72 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -11,10 +11,13 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.PageResult; import sonia.scm.repository.NamespaceAndName; +import sonia.scm.repository.Permission; +import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryIsNotArchivedException; @@ -35,10 +38,13 @@ import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT; import static javax.servlet.http.HttpServletResponse.SC_OK; import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentCaptor.forClass; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -240,6 +246,28 @@ public class RepositoryRootResourceTest { verify(repositoryManager).create(any(Repository.class)); } + @Test + public void shouldNotOverwriteExistingPermissionsOnUpdate() throws Exception { + Repository existingRepository = mockRepository("space", "repo"); + existingRepository.setPermissions(singletonList(new Permission("user", PermissionType.READ))); + + URL url = Resources.getResource("sonia/scm/api/v2/repository-test-update.json"); + byte[] repository = Resources.toByteArray(url); + + ArgumentCaptor modifiedRepositoryCaptor = forClass(Repository.class); + doNothing().when(repositoryManager).modify(modifiedRepositoryCaptor.capture()); + + MockHttpRequest request = MockHttpRequest + .put("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo") + .contentType(VndMediaType.REPOSITORY) + .content(repository); + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertFalse(modifiedRepositoryCaptor.getValue().getPermissions().isEmpty()); + } + private PageResult createSingletonPageResult(Repository repository) { return new PageResult<>(singletonList(repository), 0); }