From 1ac07526dcb5d91d8d2cce54829225dce4b6aee6 Mon Sep 17 00:00:00 2001 From: John Lees-Miller Date: Fri, 3 Jun 2016 16:11:02 +0100 Subject: [PATCH] Reorganise postbacks and files under /api --- .../wlgitbridge/data/CandidateSnapshot.java | 2 +- .../ac/ic/wlgitbridge/server/FileHandler.java | 55 +++++++++++++++++++ .../ac/ic/wlgitbridge/server/FileServlet.java | 50 ----------------- .../wlgitbridge/server/GitBridgeServer.java | 28 ++++++---- .../wlgitbridge/server/PostbackHandler.java | 2 +- 5 files changed, 75 insertions(+), 62 deletions(-) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java delete mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileServlet.java diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/CandidateSnapshot.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/CandidateSnapshot.java index 62d546636c..f3d99163ed 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/CandidateSnapshot.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/CandidateSnapshot.java @@ -72,7 +72,7 @@ public class CandidateSnapshot { } public JsonElement getJsonRepresentation(String postbackKey) { - String projectURL = Util.getPostbackURL() + projectName; + String projectURL = Util.getPostbackURL() + "api/" + projectName; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("latestVerId", currentVersion); jsonObject.add("files", getFilesAsJson(projectURL, postbackKey)); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java new file mode 100644 index 0000000000..84b76db7e8 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java @@ -0,0 +1,55 @@ +package uk.ac.ic.wlgitbridge.server; + +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.ResourceHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uk.ac.ic.wlgitbridge.bridge.BridgeAPI; +import uk.ac.ic.wlgitbridge.snapshot.push.exception.InvalidPostbackKeyException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Serve files referenced by the snapshot that we send to the Overleaf API. + * + * Requests must include the postback key. + */ +public class FileHandler extends ResourceHandler { + private static final Logger LOG = LoggerFactory.getLogger(FileHandler.class); + + private final BridgeAPI writeLatexDataSource; + private final Pattern DOC_KEY_PATTERN = Pattern.compile("^/(\\w+)/.+$"); + + public FileHandler(BridgeAPI writeLatexDataSource) { + this.writeLatexDataSource = writeLatexDataSource; + } + + @Override + public void handle(String target, + Request baseRequest, + HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + if (!"GET".equals(baseRequest.getMethod())) return; + + Matcher docKeyMatcher = DOC_KEY_PATTERN.matcher(target); + if (!docKeyMatcher.matches()) return; + String docKey = docKeyMatcher.group(1); + + String apiKey = request.getParameter("key"); + if (apiKey == null) return; + + try { + writeLatexDataSource.checkPostbackKey(docKey, apiKey); + } catch (InvalidPostbackKeyException e) { + LOG.warn("INVALID POST BACK KEY: docKey={} apiKey={}", docKey, apiKey); + return; + } + + super.handle(target, baseRequest, request, response); + } +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileServlet.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileServlet.java deleted file mode 100644 index ff27def93d..0000000000 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileServlet.java +++ /dev/null @@ -1,50 +0,0 @@ -package uk.ac.ic.wlgitbridge.server; - -import org.eclipse.jetty.http.HttpURI; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.ResourceHandler; -import org.eclipse.jetty.util.MultiMap; -import uk.ac.ic.wlgitbridge.bridge.BridgeAPI; -import uk.ac.ic.wlgitbridge.snapshot.push.exception.InvalidPostbackKeyException; -import uk.ac.ic.wlgitbridge.util.Log; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Created by Winston on 04/12/14. - */ -public class FileServlet extends ResourceHandler { - - private final BridgeAPI writeLatexDataSource; - - public FileServlet(BridgeAPI writeLatexDataSource) { - this.writeLatexDataSource = writeLatexDataSource; - } - - @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - String method = baseRequest.getMethod(); - if (method.equals("GET")) { - HttpURI uri = baseRequest.getHttpURI(); - Log.info(method + " <- " + uri); - MultiMap multimap = new MultiMap(); - uri.decodeQueryTo(multimap); - String[] pathSections = uri.getPath().split("/"); - String key = multimap.getString("key"); - if (key == null || pathSections.length < 2) { - throw new ServletException(); - } - try { - writeLatexDataSource.checkPostbackKey(pathSections[1], key); - } catch (InvalidPostbackKeyException e) { - e.printStackTrace(); - throw new ServletException(); - } - super.handle(target, baseRequest, request, response); - } - } - -} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index f185a530f7..5df3037be2 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -2,8 +2,7 @@ package uk.ac.ic.wlgitbridge.server; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.HandlerCollection; -import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.server.handler.*; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; @@ -82,15 +81,25 @@ public class GitBridgeServer { } private void configureJettyServer(Config config) throws ServletException, InvalidRootDirectoryPathException { - HandlerCollection handlers = new HandlerCollection(); - handlers.setHandlers(new Handler[] { - initResourceHandler(), - new PostbackHandler(bridgeAPI), - initGitHandler(config) - }); + HandlerCollection handlers = new HandlerList(); + handlers.addHandler(initApiHandler()); + handlers.addHandler(initGitHandler(config)); jettyServer.setHandler(handlers); } + private Handler initApiHandler() { + ContextHandler api = new ContextHandler(); + api.setContextPath("/api"); + + HandlerCollection handlers = new HandlerList(); + handlers.addHandler(initResourceHandler()); + handlers.addHandler(new PostbackHandler(bridgeAPI)); + handlers.addHandler(new DefaultHandler()); + + api.setHandler(handlers); + return api; + } + private Handler initGitHandler(Config config) throws ServletException, InvalidRootDirectoryPathException { final ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); if (config.isUsingOauth2()) { @@ -107,9 +116,8 @@ public class GitBridgeServer { } private Handler initResourceHandler() { - ResourceHandler resourceHandler = new FileServlet(bridgeAPI); + ResourceHandler resourceHandler = new FileHandler(bridgeAPI); resourceHandler.setResourceBase(new File(rootGitDirectoryPath, ".wlgb/atts").getAbsolutePath()); return resourceHandler; } - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java index 6949df193f..540e1b5383 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java @@ -32,7 +32,7 @@ public class PostbackHandler extends AbstractHandler { if (request.getMethod().equals("POST") && target.endsWith("postback")) { response.setContentType("application/json"); String contents = Util.getContentsOfReader(request.getReader()); - String[] parts = request.getRequestURI().split("/"); + String[] parts = target.split("/"); if (parts.length < 4) { throw new ServletException(); }