From e4d18bc8374addae2cbe919052eecc13305fc8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 17 Sep 2020 16:02:42 +0200 Subject: [PATCH] Cleanup permissions for namespace when it is removed --- .../repository/DefaultNamespaceManager.java | 22 +++++++++++++++- .../sonia/scm/repository/NamespaceDao.java | 4 +++ .../DefaultNamespaceManagerTest.java | 25 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceManager.java index aa3abd4211..6bf1306002 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceManager.java @@ -25,8 +25,8 @@ package sonia.scm.repository; import com.github.legman.EventBus; +import com.github.legman.Subscribe; import sonia.scm.HandlerEventType; -import sonia.scm.event.ScmEventBus; import javax.inject.Inject; import java.util.Collection; @@ -80,6 +80,26 @@ public class DefaultNamespaceManager implements NamespaceManager { fireEvent(HandlerEventType.MODIFY, namespace, oldNamespace); } + @Subscribe + public void cleanupDeletedNamespaces(RepositoryEvent repositoryEvent) { + HandlerEventType eventType = repositoryEvent.getEventType(); + if (eventType == HandlerEventType.DELETE || eventType == HandlerEventType.MODIFY && !repositoryEvent.getItem().getNamespace().equals(repositoryEvent.getOldItem().getNamespace())) { + Collection allNamespaces = repositoryManager.getAllNamespaces(); + String oldNamespace = getOldNamespace(repositoryEvent); + if (!allNamespaces.contains(oldNamespace)) { + dao.delete(oldNamespace); + } + } + } + + public String getOldNamespace(RepositoryEvent repositoryEvent) { + if (repositoryEvent.getEventType() == HandlerEventType.DELETE) { + return repositoryEvent.getItem().getNamespace(); + } else { + return repositoryEvent.getOldItem().getNamespace(); + } + } + private Namespace createNamespaceForName(String namespace) { return dao.get(namespace) .map(Namespace::clone) diff --git a/scm-webapp/src/main/java/sonia/scm/repository/NamespaceDao.java b/scm-webapp/src/main/java/sonia/scm/repository/NamespaceDao.java index a566ba879a..cc90f2c350 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/NamespaceDao.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/NamespaceDao.java @@ -46,4 +46,8 @@ public class NamespaceDao { public void add(Namespace namespace) { store.put(namespace.getNamespace(), namespace); } + + public void delete(String namespace) { + store.remove(namespace); + } } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceManagerTest.java index 81c0b22cdb..6bc6381278 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceManagerTest.java @@ -40,9 +40,10 @@ import java.util.Optional; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static sonia.scm.HandlerEventType.DELETE; +import static sonia.scm.HandlerEventType.MODIFY; @ExtendWith(MockitoExtension.class) @@ -125,4 +126,26 @@ class DefaultNamespaceManagerTest { verify(eventBus).post(argThat(event -> ((NamespaceModificationEvent)event).getEventType() == HandlerEventType.BEFORE_MODIFY)); verify(eventBus).post(argThat(event -> ((NamespaceModificationEvent)event).getEventType() == HandlerEventType.MODIFY)); } + + @Test + void shouldCleanUpPermissionWhenLastRepositoryOfNamespaceWasDeleted() { + when(repositoryManager.getAllNamespaces()).thenReturn(asList("universe", "rest")); + + manager.cleanupDeletedNamespaces(new RepositoryEvent(DELETE, new Repository("1", "git", "life", "earth"))); + + assertThat(dao.get("life")).isEmpty(); + } + + @Test + void shouldCleanUpPermissionWhenLastRepositoryOfNamespaceWasRenamed() { + when(repositoryManager.getAllNamespaces()).thenReturn(asList("universe", "rest", "highway")); + + manager.cleanupDeletedNamespaces( + new RepositoryModificationEvent( + MODIFY, + new Repository("1", "git", "highway", "earth"), + new Repository("1", "git", "life", "earth"))); + + assertThat(dao.get("life")).isEmpty(); + } }