Adapt to permission backend

Change-Id: I6d9e337f500d2b1584c557613de1ef977ef293d4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
index 89df7a0..6312c38 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -36,6 +36,10 @@
 import com.google.gerrit.server.mime.FileTypeRegistry;
 import com.google.gerrit.server.change.FileContentUtil;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.CommitsCollection;
 import com.google.gerrit.server.project.GetHead;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectCache;
@@ -87,6 +91,8 @@
   private final FileTypeRegistry fileTypeRegistry;
   private final XDocProjectConfig.Factory cfgFactory;
   private final Formatters formatters;
+  private final CommitsCollection commits;
+  private final PermissionBackend permissionBackend;
 
   @Inject
   XDocServlet(
@@ -99,7 +105,9 @@
       XDocCache cache,
       FileTypeRegistry fileTypeRegistry,
       XDocProjectConfig.Factory cfgFactory,
-      Formatters formatters) {
+      Formatters formatters,
+      CommitsCollection commits,
+      PermissionBackend permissionBackend) {
     this.pluginName = pluginName;
     this.db = db;
     this.projectControlFactory = projectControlFactory;
@@ -110,6 +118,8 @@
     this.fileTypeRegistry = fileTypeRegistry;
     this.cfgFactory = cfgFactory;
     this.formatters = formatters;
+    this.commits = commits;
+    this.permissionBackend = permissionBackend;
   }
 
   @Override
@@ -127,13 +137,13 @@
         return;
       }
 
-      MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
+      MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[])null);
       mimeType = new MimeType(FileContentUtil.resolveContentType(
           state, key.file, FileMode.FILE, mimeType.toString()));
       FormatterProvider formatter = getFormatter(req, key, mimeType);
       validateDiffMode(key);
 
-      ProjectControl projectControl = projectControlFactory.validateFor(key.project);
+      ProjectControl projectControl = projectControlFactory.controlFor(key.project);
       String rev = getRevision(
           key.diffMode == DiffMode.NO_DIFF
               ? MoreObjects.firstNonNull(key.revision, cfg.getIndexRef())
@@ -191,6 +201,8 @@
     } catch (MethodNotAllowedException e) {
       CacheHeaders.setNotCacheable(res);
       res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+    } catch (PermissionBackendException e) {
+      //
     }
   }
 
@@ -293,7 +305,7 @@
 
   private String getRevision(String revision,
       ProjectControl projectControl) throws ResourceNotFoundException,
-      AuthException, IOException {
+      AuthException, IOException, PermissionBackendException {
     if (revision == null) {
       return null;
     }
@@ -309,7 +321,14 @@
       if (!rev.startsWith(Constants.R_REFS)) {
         rev = Constants.R_HEADS + rev;
       }
-      if (!projectControl.controlForRef(rev).isVisible()) {
+      try {
+        permissionBackend
+            .user(projectControl.getUser())
+            .project(projectControl.getProject().getNameKey())
+            .ref(rev)
+            .check(RefPermission.READ);
+      } catch (AuthException e) {
+        // Don't leak the project's existence
         throw new ResourceNotFoundException();
       }
       return rev;
@@ -334,7 +353,8 @@
       throws ResourceNotFoundException, IOException {
     try (RevWalk rw = new RevWalk(repo)) {
       RevCommit commit = rw.parseCommit(revId);
-      if (!projectControl.canReadCommit(db.get(), repo, commit)) {
+      ProjectState state = projectControl.getProjectState();
+      if (!commits.canRead(state, repo, commit)) {
         throw new ResourceNotFoundException();
       }
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
index 0bf1150..4f953ed 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
@@ -84,7 +84,7 @@
   public FormatterProvider get(ProjectState project, String fileName) {
     XDocGlobalConfig globalCfg = new XDocGlobalConfig(
         pluginCfgFactory.getGlobalPluginConfig(pluginName));
-    MimeType mimeType = fileTypeRegistry.getMimeType(fileName, null);
+    MimeType mimeType = fileTypeRegistry.getMimeType(fileName, (byte[])null);
     mimeType = new MimeType(FileContentUtil.resolveContentType(
         project, fileName, FileMode.FILE, mimeType.toString()));
     String extension = FilenameUtils.getExtension(fileName);