Use Path instead of File From 2.13, Gerrit core switched to using Path instead of File in its SitePaths. Change-Id: Ia77642a406d6dad638ee354e021c401065f5728f
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serverconfig/ServerConfigServlet.java b/src/main/java/com/googlesource/gerrit/plugins/serverconfig/ServerConfigServlet.java index 7e0e937..b93e2eb 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/serverconfig/ServerConfigServlet.java +++ b/src/main/java/com/googlesource/gerrit/plugins/serverconfig/ServerConfigServlet.java
@@ -14,6 +14,7 @@ package com.googlesource.gerrit.plugins.serverconfig; +import com.google.common.base.CharMatcher; import com.google.common.base.Charsets; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.ListMultimap; @@ -46,6 +47,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.MessageFormat; import javax.servlet.http.HttpServlet; @@ -58,10 +61,7 @@ private static final Logger log = LoggerFactory .getLogger(ServerConfigServlet.class); - private final File site_path; - private final File etc_dir; - private final File static_dir; - private final String gerrit_config_path; + private final SitePaths sitePaths; private final AuditService auditService; private final DynamicItem<WebSession> webSession; private final String pluginName; @@ -72,20 +72,13 @@ this.webSession = webSession; this.auditService = auditService; this.pluginName = pluginName; - this.site_path = sitePaths.site_path.toFile(); - this.etc_dir = sitePaths.etc_dir.toFile(); - this.static_dir = sitePaths.static_dir.toFile(); - try { - this.gerrit_config_path = sitePaths.gerrit_config.toFile().getCanonicalPath(); - } catch (IOException e) { - throw new RuntimeException(e); - } + this.sitePaths = sitePaths; } @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { - if (!isValidFile(req)) { + if (!isValidPath(req)) { res.setStatus(HttpServletResponse.SC_FORBIDDEN); return; } @@ -95,7 +88,7 @@ @Override public void doPut(HttpServletRequest req, HttpServletResponse res) throws IOException { - if (!isValidFile(req)) { + if (!isValidPath(req)) { res.setStatus(HttpServletResponse.SC_FORBIDDEN); return; } @@ -108,7 +101,7 @@ private void writeFileAndFireAuditEvent(HttpServletRequest req, HttpServletResponse res) throws IOException { - File oldFile = resolveFile(req); + File oldFile = resolvePath(req).toFile(); File dir = oldFile.getParentFile(); File newFile = File.createTempFile(oldFile.getName(), ".new", dir); streamRequestToFile(req, newFile); @@ -173,31 +166,30 @@ } private boolean isGerritConfig(HttpServletRequest req) throws IOException { - File f = resolveFile(req); - return gerrit_config_path.equals(f.getCanonicalPath()); + return Files.isSameFile(sitePaths.gerrit_config, resolvePath(req)); } - private boolean isValidFile(HttpServletRequest req) throws IOException { - File f = resolveFile(req); - if (!f.isFile()) { + private boolean isValidPath(HttpServletRequest req) throws IOException { + Path p = resolvePath(req); + if (!Files.isRegularFile(p)) { return false; } - return isParent(etc_dir, f) || isParent(static_dir, f); + return isParent(sitePaths.etc_dir, p) || isParent(sitePaths.static_dir, p); } - private File resolveFile(HttpServletRequest req) { - return new File(site_path, req.getServletPath() + req.getPathInfo()); + private Path resolvePath(HttpServletRequest req) { + return sitePaths.resolve(CharMatcher.is('/').trimLeadingFrom( + req.getServletPath() + req.getPathInfo())); } - private boolean isParent(File parent, File child) throws IOException { - File p = parent.getCanonicalFile(); - File c = child.getCanonicalFile(); + private boolean isParent(Path parent, Path child) throws IOException { + Path p = child; for (;;) { - c = c.getParentFile(); - if (c == null) { + p = p.getParent(); + if (p == null) { return false; } - if (c.equals(p)) { + if (Files.isSameFile(p, parent)) { return true; } } @@ -205,7 +197,7 @@ private void streamFile(HttpServletRequest req, HttpServletResponse res) throws IOException { - File f = resolveFile(req); + File f = resolvePath(req).toFile(); res.setStatus(HttpServletResponse.SC_OK); res.setContentType("application/octet-stream"); res.setContentLength((int) f.length()); @@ -218,7 +210,7 @@ private void writeFile(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setStatus(HttpServletResponse.SC_NO_CONTENT); - streamRequestToFile(req, resolveFile(req)); + streamRequestToFile(req, resolvePath(req).toFile()); } private void streamRequestToFile(HttpServletRequest req, File file)