Adjust plugin to work with latest Gerrit core
Main-Author: Makson Lee
Bug: Issue 7323
Change-Id: I699aeffdd051b22244903da74674e8a84cbdb88d
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 5466d20..cb2ab69 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/FilteredRepository.java
@@ -18,16 +18,19 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.VisibleRefFilter;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.attributes.AttributesNodeProvider;
@@ -47,25 +50,30 @@
private final Provider<CurrentUser> userProvider;
private final GitRepositoryManager repoManager;
private final VisibleRefFilter.Factory visibleRefFilterFactory;
+ private final PermissionBackend permissionBackend;
@Inject
Factory(
ProjectControl.GenericFactory projectControlFactory,
Provider<CurrentUser> userProvider,
GitRepositoryManager repoManager,
- VisibleRefFilter.Factory visibleRefFilterFactory) {
+ VisibleRefFilter.Factory visibleRefFilterFactory,
+ PermissionBackend permissionBackend) {
this.projectControlFactory = projectControlFactory;
this.userProvider = userProvider;
this.repoManager = repoManager;
this.visibleRefFilterFactory = visibleRefFilterFactory;
+ this.permissionBackend = permissionBackend;
}
- FilteredRepository create(Project.NameKey name) throws NoSuchProjectException, IOException {
+ FilteredRepository create(Project.NameKey name)
+ throws NoSuchProjectException, IOException, PermissionBackendException {
ProjectControl ctl = projectControlFactory.controlFor(name, userProvider.get());
if (ctl.getProject().getState().equals(ProjectState.HIDDEN)) {
throw new NoSuchProjectException(name);
}
- return new FilteredRepository(ctl, repoManager.openRepository(name), visibleRefFilterFactory);
+ return new FilteredRepository(
+ ctl, repoManager.openRepository(name), visibleRefFilterFactory, permissionBackend);
}
}
@@ -73,10 +81,24 @@
private final RefDatabase refdb;
private FilteredRepository(
- ProjectControl ctl, Repository delegate, VisibleRefFilter.Factory refFilterFactory) {
+ ProjectControl ctl,
+ Repository delegate,
+ VisibleRefFilter.Factory refFilterFactory,
+ PermissionBackend permissionBackend)
+ throws PermissionBackendException {
super(toBuilder(delegate));
this.delegate = delegate;
- if (ctl.allRefsAreVisible(Collections.emptySet())) {
+ boolean visible = true;
+ try {
+ permissionBackend
+ .user(ctl.getUser())
+ .project(ctl.getProject().getNameKey())
+ .check(ProjectPermission.READ);
+ } catch (AuthException e) {
+ visible = false;
+ }
+
+ if (visible) {
this.refdb = delegate.getRefDatabase();
} else {
this.refdb =
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/Resolver.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/Resolver.java
index 4b08996..fcdae61 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/Resolver.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/Resolver.java
@@ -18,6 +18,7 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -68,7 +69,7 @@
// Avoid leaking information by not distinguishing between
// project not existing and no access rights.
throw new ServiceNotAuthorizedException();
- } catch (IOException e) {
+ } catch (IOException | PermissionBackendException e) {
ServiceMayNotContinueException err =
new ServiceMayNotContinueException("error opening repository " + name);
err.initCause(e);