]> source.dussan.org Git - vaadin-framework.git/commitdiff
Don't let /APP requests continue to the BootstrapHandler (#9553) 29/129/3 7.0.0.beta5
authorLeif Åstrand <leif@vaadin.com>
Tue, 16 Oct 2012 13:46:45 +0000 (16:46 +0300)
committerLeif Åstrand <leif@vaadin.com>
Tue, 16 Oct 2012 13:46:45 +0000 (16:46 +0300)
* Change ApplicationConstants.APP_REQUEST_PATH to not include an ending
slash so it can be used by the new check as well.

Change-Id: If613e339b0e1ef4fd9e4f07d7567cd381678b912

server/src/com/vaadin/server/ConnectorResourceHandler.java
server/src/com/vaadin/server/GlobalResourceHandler.java
server/src/com/vaadin/server/ResourceReference.java
server/src/com/vaadin/server/ServletPortletHelper.java
shared/src/com/vaadin/shared/ApplicationConstants.java
uitest/src/com/vaadin/tests/requesthandlers/AppResource404.html
uitest/src/com/vaadin/tests/requesthandlers/AppResource404.java

index 6d375aaa501ecb2e4c6806967940a1a78259f575..dc112a2d5b95387111cfee6f3969b912ea3df486 100644 (file)
@@ -14,7 +14,7 @@ import com.vaadin.ui.UI;
 public class ConnectorResourceHandler implements RequestHandler {
     // APP/connector/[uiid]/[cid]/[filename.xyz]
     private static final Pattern CONNECTOR_RESOURCE_PATTERN = Pattern
-            .compile("^/?" + ApplicationConstants.APP_REQUEST_PATH
+            .compile("^/?" + ApplicationConstants.APP_REQUEST_PATH + '/'
                     + ConnectorResource.CONNECTOR_REQUEST_PATH
                     + "(\\d+)/(\\d+)/(.*)");
 
@@ -62,6 +62,15 @@ public class ConnectorResourceHandler implements RequestHandler {
             }
 
             return true;
+        } else if (requestPath.matches('/'
+                + ApplicationConstants.APP_REQUEST_PATH + "(/.*)?")) {
+            /*
+             * This should be the last request handler before we get to
+             * bootstrap logic. Prevent /APP requests from reaching bootstrap
+             * handlers to help protect the /APP name space for framework usage.
+             */
+            return error(request, response,
+                    "Returning 404 for /APP request not yet handled.");
         } else {
             return false;
         }
index ad276dc77aa5501c4881b198b47afab09f332671..5b89408d017fef73e90a47be118c11960eda3a90 100644 (file)
@@ -60,7 +60,7 @@ public class GlobalResourceHandler implements RequestHandler {
 
     // APP/global/[uiid]/[type]/[id]
     private static final Matcher matcher = Pattern.compile(
-            "^/?" + ApplicationConstants.APP_REQUEST_PATH
+            "^/?" + ApplicationConstants.APP_REQUEST_PATH + '/'
                     + RESOURCE_REQUEST_PATH + "(\\d+)/(([^/]+)(/.*))").matcher(
             "");
 
@@ -188,7 +188,7 @@ public class GlobalResourceHandler implements RequestHandler {
         String uri = legacyResourceKeys.get(resource);
         if (uri != null && !uri.isEmpty()) {
             return ApplicationConstants.APP_PROTOCOL_PREFIX
-                    + ApplicationConstants.APP_REQUEST_PATH
+                    + ApplicationConstants.APP_REQUEST_PATH + '/'
                     + RESOURCE_REQUEST_PATH + connector.getUI().getUIId() + '/'
                     + uri;
         } else {
index 815cbee275e9c1c2fdbea8ce4cb865b8cce3c832..b6a0cfda92291edfb21a5fb0aa3c926e01e72c16 100644 (file)
@@ -103,7 +103,7 @@ public class ResourceReference extends URLReference {
     private static String getConnectorResourceBase(String filename,
             ClientConnector connector) {
         String uri = ApplicationConstants.APP_PROTOCOL_PREFIX
-                + ApplicationConstants.APP_REQUEST_PATH
+                + ApplicationConstants.APP_REQUEST_PATH + '/'
                 + ConnectorResource.CONNECTOR_REQUEST_PATH
                 + connector.getUI().getUIId() + '/'
                 + connector.getConnectorId() + '/' + encodeFileName(filename);
index 59c0b382c9fb522442ed49c1f33dfa624fff880c..15c3e1895916a9423d421b5eece57479b32aa4c4 100644 (file)
@@ -111,7 +111,8 @@ class ServletPortletHelper implements Serializable {
     }
 
     public static boolean isAppRequest(VaadinRequest request) {
-        return hasPathPrefix(request, ApplicationConstants.APP_REQUEST_PATH);
+        return hasPathPrefix(request,
+                ApplicationConstants.APP_REQUEST_PATH + '/');
     }
 
     public static boolean isHeartbeatRequest(VaadinRequest request) {
index 61b57687bda93f8c892942b7f78b0221bc67ed77..80b05d6021253ff373d28b7d69f0aee365cc2a96 100644 (file)
@@ -20,14 +20,14 @@ public class ApplicationConstants {
     // This indicates the whole page is generated by us (not embedded)
     public static final String GENERATED_BODY_CLASSNAME = "v-generated-body";
 
-    public static final String APP_REQUEST_PATH = "APP/";
+    public static final String APP_REQUEST_PATH = "APP";
 
     public static final String UIDL_REQUEST_PATH = "UIDL/";
 
     public static final String HEARTBEAT_REQUEST_PATH = "HEARTBEAT/";
 
     public static final String DEPENDENCY_RESOURCE_PREFIX = APP_REQUEST_PATH
-            + "DEPENDENCY";
+            + '/' + "DEPENDENCY";
 
     public static final String APP_PROTOCOL_PREFIX = "app://";
     public static final String DEPENDENCY_PROTOCOL_NAME = "dependency";
index da050b3aaae7f1e67db59c738e408a6875b48860..16f3db6a1ae9d4ce55239ea65104e40dd8b8654e 100644 (file)
@@ -38,7 +38,7 @@
 </tr>
 <tr>
        <td>assertTextPresent</td>
-       <td>RequestURI=/run/com.vaadin.tests.requesthandlers.AppResource404/APP/12341234/</td>
+       <td>/APP/connector/0/4/asdfasdf can not be found</td>
        <td></td>
 </tr>
 <tr>
        <td></td>
 </tr>
 <tr>
-       <td>click</td>
-       <td>vaadin=runcomvaadintestsrequesthandlersAppResource404::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
+       <td>mouseClickAndWait</td>
+       <td>vaadin=runcomvaadintestsrequesthandlersAppResource404::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[2]/VLink[0]/domChild[0]/domChild[0]</td>
+       <td>97,5</td>
+</tr>
+<tr>
+       <td>assertTextPresent</td>
+       <td>/APP can not be found</td>
+       <td></td>
+</tr>
+<tr>
+       <td>open</td>
+       <td>/run/com.vaadin.tests.requesthandlers.AppResource404</td>
        <td></td>
 </tr>
 <tr>
        <td>mouseClickAndWait</td>
-       <td>vaadin=runcomvaadintestsrequesthandlersAppResource404::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VLink[0]/domChild[0]/domChild[0]</td>
-       <td>47,9</td>
+       <td>vaadin=runcomvaadintestsrequesthandlersAppResource404::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VLink[0]/domChild[0]/domChild[0]</td>
+       <td>99,7</td>
 </tr>
 <tr>
-       <td>assertTextPresent</td>
-       <td>RequestURI=/run/com.vaadin.tests.requesthandlers.AppResource404/APP/1//com/vaadin/tests/integration/se.gif</td>
+       <td>assertTextNotPresent</td>
+       <td>can not be found</td>
        <td></td>
 </tr>
 </tbody></table>
index ebccba74fbde70994f310b185ca076ba27122074..dfd664c9cfe62e532e40dc06bfbfef32daf5c468 100644 (file)
@@ -1,6 +1,9 @@
 package com.vaadin.tests.requesthandlers;
 
+import javax.servlet.http.HttpServletRequest;
+
 import com.vaadin.server.ExternalResource;
+import com.vaadin.server.VaadinServletService;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.tests.integration.FlagSeResource;
 import com.vaadin.ui.Link;
@@ -13,9 +16,17 @@ public class AppResource404 extends TestBase {
         final FlagSeResource resource = new FlagSeResource();
         resource.setCacheTime(0);
 
+        HttpServletRequest request = VaadinServletService
+                .getCurrentServletRequest();
+        String baseUrl = request.getContextPath() + request.getServletPath();
+
         addComponent(new Link("Existing resource", resource));
         addComponent(new Link("Non-existing resource", new ExternalResource(
-                getURL().toString() + "APP/12341234/")));
+                baseUrl + "/APP/connector/0/4/asdfasdf")));
+        addComponent(new Link("/APP url that should give 404",
+                new ExternalResource(baseUrl + "/APP")));
+        addComponent(new Link("/APPLE url that should go to UI providers",
+                new ExternalResource(baseUrl + "/APPLE")));
     }
 
     @Override