Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Suppress warnings about usage of deprecated Hashing.md5()
  XDocLoader: Add missing case in switch on DiffMode

Change-Id: Icf1323659e5080d543172aa5d3fb34ee2c27c0d1
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 9a69e96..3fd86ba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -32,10 +32,13 @@
 import com.google.gerrit.httpd.resources.Resource;
 import com.google.gerrit.httpd.resources.SmallResource;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.change.FileContentUtil;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.mime.FileTypeRegistry;
+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;
@@ -73,7 +76,6 @@
   public static final String PATH_PREFIX = "/project/";
 
   private final String pluginName;
-  private final Provider<ReviewDb> db;
   private final ProjectControl.Factory projectControlFactory;
   private final ProjectCache projectCache;
   private final Provider<GetHead> getHead;
@@ -82,11 +84,12 @@
   private final FileTypeRegistry fileTypeRegistry;
   private final XDocProjectConfig.Factory cfgFactory;
   private final Formatters formatters;
+  private final CommitsCollection commits;
+  private final PermissionBackend permissionBackend;
 
   @Inject
   XDocServlet(
       @PluginName String pluginName,
-      Provider<ReviewDb> db,
       ProjectControl.Factory projectControlFactory,
       ProjectCache projectCache,
       Provider<GetHead> getHead,
@@ -94,9 +97,10 @@
       XDocCache cache,
       FileTypeRegistry fileTypeRegistry,
       XDocProjectConfig.Factory cfgFactory,
-      Formatters formatters) {
+      Formatters formatters,
+      CommitsCollection commits,
+      PermissionBackend permissionBackend) {
     this.pluginName = pluginName;
-    this.db = db;
     this.projectControlFactory = projectControlFactory;
     this.projectCache = projectCache;
     this.getHead = getHead;
@@ -105,6 +109,8 @@
     this.fileTypeRegistry = fileTypeRegistry;
     this.cfgFactory = cfgFactory;
     this.formatters = formatters;
+    this.commits = commits;
+    this.permissionBackend = permissionBackend;
   }
 
   @Override
@@ -121,7 +127,7 @@
         return;
       }
 
-      MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
+      MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[]) null);
       mimeType =
           new MimeType(
               FileContentUtil.resolveContentType(
@@ -129,7 +135,7 @@
       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
@@ -191,6 +197,8 @@
     } catch (MethodNotAllowedException e) {
       CacheHeaders.setNotCacheable(res);
       res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+    } catch (PermissionBackendException e) {
+      //
     }
   }
 
@@ -289,7 +297,7 @@
   }
 
   private String getRevision(String revision, ProjectControl projectControl)
-      throws ResourceNotFoundException, AuthException, IOException {
+      throws ResourceNotFoundException, AuthException, IOException, PermissionBackendException {
     if (revision == null) {
       return null;
     }
@@ -305,7 +313,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;
@@ -328,7 +343,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/client/ChangeInfo.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
index 44ea4c6..97a5867 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
@@ -46,13 +46,7 @@
   }
 
   public final boolean isOpen() {
-    switch (getStatus()) {
-      case NEW:
-      case DRAFT:
-        return true;
-      default:
-        return false;
-    }
+    return getStatus() == ChangeStatus.NEW;
   }
 
   protected ChangeInfo() {}
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 da56201..def2f5b 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
@@ -80,7 +80,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(