Merge branch 'stable-3.1-2021-07' * stable-3.1-2021-07: Hide repository name and description when user has no access Change-Id: I1ee7817f899326667675ee221aeeb1cdb84c2f9c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java index 2b19d95..29258f0 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java
@@ -14,8 +14,9 @@ package com.googlesource.gerrit.plugins.gitiles; +import static java.util.stream.Collectors.toMap; + import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.gerrit.entities.Project; import com.google.gerrit.extensions.restapi.AuthException; @@ -31,8 +32,10 @@ import com.google.inject.Inject; import com.google.inject.Provider; import java.io.IOException; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import org.eclipse.jgit.attributes.AttributesNodeProvider; import org.eclipse.jgit.lib.ObjectDatabase; import org.eclipse.jgit.lib.Ref; @@ -66,8 +69,8 @@ FilteredRepository create(Project.NameKey name) throws NoSuchProjectException, IOException, PermissionBackendException { - ProjectState projectState = projectCache.checkedGet(name); - if (projectState == null || !projectState.getProject().getState().permitsRead()) { + Optional<ProjectState> projectState = projectCache.get(name); + if (!projectState.isPresent() || !projectState.get().statePermitsRead()) { throw new NoSuchProjectException(name); } try { @@ -78,7 +81,10 @@ throw new ServiceMayNotContinueException(e); } return new FilteredRepository( - projectState, userProvider.get(), repoManager.openRepository(name), permissionBackend); + projectState.get(), + userProvider.get(), + repoManager.openRepository(name), + permissionBackend); } } @@ -212,7 +218,10 @@ return null; } try { - return perm.filter(ImmutableMap.of(name, ref), git, RefFilterOptions.defaults()).get(name); + return perm.filter(ImmutableList.of(ref), git, RefFilterOptions.defaults()).stream() + .filter(r -> r.getName().equals(name)) + .findAny() + .orElse(null); } catch (PermissionBackendException e) { throw new IOException(e); } @@ -220,7 +229,7 @@ @Override public Map<String, Ref> getRefs(String prefix) throws IOException { - Map<String, Ref> refs; + Collection<Ref> refs; try { refs = perm.filter( @@ -228,12 +237,8 @@ } catch (PermissionBackendException e) { throw new IOException(e); } - Map<String, Ref> result = Maps.newHashMapWithExpectedSize(refs.size()); - for (Ref ref : refs.values()) { - // VisibleRefFilter adds the prefix to the keys, re-strip it. - result.put(ref.getName().substring(prefix.length()), ref); - } - return refs; + // VisibleRefFilter adds the prefix to the keys, re-strip it. + return refs.stream().collect(toMap(r -> r.getName().substring(prefix.length()), r -> r)); } @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/GerritGitilesAccess.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/GerritGitilesAccess.java index a9196ef..d89b748 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/GerritGitilesAccess.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/GerritGitilesAccess.java
@@ -37,6 +37,7 @@ import java.io.IOException; import java.util.Collections; import java.util.Map; +import java.util.Optional; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.eclipse.jgit.errors.ConfigInvalidException; @@ -169,10 +170,8 @@ @Override public RepositoryDescription getRepositoryDescription() throws IOException { Project.NameKey nameKey = Resolver.getNameKey(req); - ProjectState state = projectCache.get(nameKey); - if (state == null) { - throw new RepositoryNotFoundException(nameKey.get()); - } + ProjectState state = + projectCache.get(nameKey).orElseThrow(() -> new RepositoryNotFoundException(nameKey.get())); return toDescription(nameKey.get(), projectJson.format(state.getProject())); } @@ -182,15 +181,14 @@ // of the project. For non-project access, use All-Projects as project. // If none of the above exists, use global gitiles.config. Project.NameKey nameKey = Resolver.getNameKey(req); - ProjectState state = projectCache.get(nameKey); - if (state != null) { - Config cfg = state.getConfig("gitiles.config").getWithInheritance(); + Optional<ProjectState> state = projectCache.get(nameKey); + if (state.isPresent()) { + Config cfg = state.get().getConfig("gitiles.config").getWithInheritance(); if (cfg != null && cfg.getSections().size() > 0) { return cfg; } } else { - state = projectCache.getAllProjects(); - Config cfg = state.getConfig("gitiles.config").get(); + Config cfg = projectCache.getAllProjects().getConfig("gitiles.config").get(); if (cfg != null && cfg.getSections().size() > 0) { return cfg; }