diff --git a/scm-core/src/main/java/sonia/scm/security/GroupCollector.java b/scm-core/src/main/java/sonia/scm/security/GroupCollector.java index 06ac590a9a..6c9bf2e659 100644 --- a/scm-core/src/main/java/sonia/scm/security/GroupCollector.java +++ b/scm-core/src/main/java/sonia/scm/security/GroupCollector.java @@ -1,70 +1,5 @@ package sonia.scm.security; -import com.google.common.collect.ImmutableSet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import sonia.scm.cache.Cache; -import sonia.scm.cache.CacheManager; -import sonia.scm.group.Group; -import sonia.scm.group.GroupDAO; -import sonia.scm.group.GroupNames; - -import java.util.Set; - -/** - * Collect groups for a certain principal. - * Warning: The class is only for internal use and should never used directly. - */ -class GroupCollector { - - private static final Logger LOG = LoggerFactory.getLogger(GroupCollector.class); - - /** Field description */ - public static final String CACHE_NAME = "sonia.cache.externalGroups"; - - /** Field description */ - private final Cache cache; - private Set groupResolvers; - - private final GroupDAO groupDAO; - - GroupCollector(GroupDAO groupDAO, CacheManager cacheManager, Set groupResolvers) { - this.groupDAO = groupDAO; - this.cache = cacheManager.getCache(CACHE_NAME); - this.groupResolvers = groupResolvers; - } - - Iterable collect(String principal) { - - Set externalGroups = cache.get(principal); - - if (externalGroups == null) { - ImmutableSet.Builder newExternalGroups = ImmutableSet.builder(); - - for (GroupResolver groupResolver : groupResolvers) { - Iterable groups = groupResolver.resolveGroups(principal); - groups.forEach(newExternalGroups::add); - } - - cache.put(principal, newExternalGroups.build()); - } - - ImmutableSet.Builder builder = ImmutableSet.builder(); - - builder.add(GroupNames.AUTHENTICATED); - - for (String group : externalGroups) { - builder.add(group); - } - - for (Group group : groupDAO.getAll()) { - if (group.isMember(principal)) { - builder.add(group.getName()); - } - } - - GroupNames groups = new GroupNames(builder.build()); - LOG.debug("collected following groups for principal {}: {}", principal, groups); - return groups; - } +public interface GroupCollector { + Iterable collect(String principal); } diff --git a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupCollector.java b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupCollector.java new file mode 100644 index 0000000000..cdaf0eb7b2 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupCollector.java @@ -0,0 +1,70 @@ +package sonia.scm.group; + +import com.google.common.collect.ImmutableSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.cache.Cache; +import sonia.scm.cache.CacheManager; +import sonia.scm.security.GroupCollector; +import sonia.scm.security.GroupResolver; + +import java.util.Set; + +/** + * Collect groups for a certain principal. + * Warning: The class is only for internal use and should never used directly. + */ +class DefaultGroupCollector implements GroupCollector { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultGroupCollector.class); + + /** Field description */ + public static final String CACHE_NAME = "sonia.cache.externalGroups"; + + /** Field description */ + private final Cache> cache; + private Set groupResolvers; + + private final GroupDAO groupDAO; + + DefaultGroupCollector(GroupDAO groupDAO, CacheManager cacheManager, Set groupResolvers) { + this.groupDAO = groupDAO; + this.cache = cacheManager.getCache(CACHE_NAME); + this.groupResolvers = groupResolvers; + } + + @Override + public Iterable collect(String principal) { + + Set externalGroups = cache.get(principal); + + if (externalGroups == null) { + ImmutableSet.Builder newExternalGroups = ImmutableSet.builder(); + + for (GroupResolver groupResolver : groupResolvers) { + Iterable groups = groupResolver.resolveGroups(principal); + groups.forEach(newExternalGroups::add); + } + + cache.put(principal, newExternalGroups.build()); + } + + ImmutableSet.Builder builder = ImmutableSet.builder(); + + builder.add(GroupNames.AUTHENTICATED); + + for (String group : externalGroups) { + builder.add(group); + } + + for (Group group : groupDAO.getAll()) { + if (group.isMember(principal)) { + builder.add(group.getName()); + } + } + + GroupNames groups = new GroupNames(builder.build()); + LOG.debug("collected following groups for principal {}: {}", principal, groups); + return groups; + } +} diff --git a/scm-core/src/test/java/sonia/scm/security/GroupCollectorTest.java b/scm-webapp/src/test/java/sonia/scm/group/GroupCollectorTest.java similarity index 74% rename from scm-core/src/test/java/sonia/scm/security/GroupCollectorTest.java rename to scm-webapp/src/test/java/sonia/scm/group/GroupCollectorTest.java index 3fb59d1614..4bdcd2694a 100644 --- a/scm-core/src/test/java/sonia/scm/security/GroupCollectorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/group/GroupCollectorTest.java @@ -1,6 +1,5 @@ -package sonia.scm.security; +package sonia.scm.group; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -9,11 +8,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import sonia.scm.group.Group; -import sonia.scm.group.GroupDAO; -import sonia.scm.group.GroupNames; +import sonia.scm.security.GroupCollector; -import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -30,7 +26,7 @@ class GroupCollectorTest { @Test void shouldAlwaysReturnAuthenticatedGroup() { - GroupNames groupNames = collector.collect("trillian", Collections.emptySet()); + Iterable groupNames = collector.collect("trillian"); assertThat(groupNames).containsOnly("_authenticated"); } @@ -49,13 +45,13 @@ class GroupCollectorTest { @Test void shouldReturnGroupsFromDao() { - GroupNames groupNames = collector.collect("trillian", Collections.emptySet()); + Iterable groupNames = collector.collect("trillian"); assertThat(groupNames).contains("_authenticated", "heartOfGold", "fjordsOfAfrican"); } @Test void shouldCombineGivenWithDao() { - GroupNames groupNames = collector.collect("trillian", ImmutableList.of("awesome", "incredible")); + Iterable groupNames = collector.collect("trillian"); assertThat(groupNames).contains("_authenticated", "heartOfGold", "fjordsOfAfrican", "awesome", "incredible"); }