]> source.dussan.org Git - vaadin-framework.git/commitdiff
Decode filename before finding resource (#15407)
authorArtur Signell <artur@vaadin.com>
Thu, 15 Jan 2015 19:59:00 +0000 (21:59 +0200)
committerVaadin Code Review <review@vaadin.com>
Thu, 13 Aug 2015 06:41:19 +0000 (06:41 +0000)
Change-Id: Iede2deff19058ee65bfe06ee8abb918218a57924

WebContent/VAADIN/themes/tests-tickets/folder with space/resource with special $chars@.txt [new file with mode: 0644]
WebContent/VAADIN/themes/tests-tickets/ordinary.txt [new file with mode: 0644]
WebContent/VAADIN/themes/tests-tickets/percentagein%20name.txt [new file with mode: 0644]
server/src/com/vaadin/server/VaadinServlet.java
uitest/src/com/vaadin/tests/resources/SpecialCharsInThemeResources.java [new file with mode: 0644]

diff --git a/WebContent/VAADIN/themes/tests-tickets/folder with space/resource with special $chars@.txt b/WebContent/VAADIN/themes/tests-tickets/folder with space/resource with special $chars@.txt
new file mode 100644 (file)
index 0000000..dff31dd
--- /dev/null
@@ -0,0 +1 @@
+Just ordinary contents here
\ No newline at end of file
diff --git a/WebContent/VAADIN/themes/tests-tickets/ordinary.txt b/WebContent/VAADIN/themes/tests-tickets/ordinary.txt
new file mode 100644 (file)
index 0000000..dff31dd
--- /dev/null
@@ -0,0 +1 @@
+Just ordinary contents here
\ No newline at end of file
diff --git a/WebContent/VAADIN/themes/tests-tickets/percentagein%20name.txt b/WebContent/VAADIN/themes/tests-tickets/percentagein%20name.txt
new file mode 100644 (file)
index 0000000..dff31dd
--- /dev/null
@@ -0,0 +1 @@
+Just ordinary contents here
\ No newline at end of file
index 7aada2402d35a6e26678783bcb59ef76705c2041..61df02feaae7a1f9fd55e4c2c1cc57982de8406b 100644 (file)
@@ -28,6 +28,7 @@ import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -694,17 +695,20 @@ public class VaadinServlet extends HttpServlet implements Constants {
             return false;
         }
 
+        String decodedRequestURI = URLDecoder.decode(request.getRequestURI(),
+                "UTF-8");
         if ((request.getContextPath() != null)
-                && (request.getRequestURI().startsWith("/VAADIN/"))) {
-            serveStaticResourcesInVAADIN(request.getRequestURI(), request,
-                    response);
+                && (decodedRequestURI.startsWith("/VAADIN/"))) {
+            serveStaticResourcesInVAADIN(decodedRequestURI, request, response);
             return true;
-        } else if (request.getRequestURI().startsWith(
-                request.getContextPath() + "/VAADIN/")) {
+        }
+
+        String decodedContextPath = URLDecoder.decode(request.getContextPath(),
+                "UTF-8");
+        if (decodedRequestURI.startsWith(decodedContextPath + "/VAADIN/")) {
             serveStaticResourcesInVAADIN(
-                    request.getRequestURI().substring(
-                            request.getContextPath().length()), request,
-                    response);
+                    decodedRequestURI.substring(decodedContextPath.length()),
+                    request, response);
             return true;
         }
 
diff --git a/uitest/src/com/vaadin/tests/resources/SpecialCharsInThemeResources.java b/uitest/src/com/vaadin/tests/resources/SpecialCharsInThemeResources.java
new file mode 100644 (file)
index 0000000..e584ec7
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.resources;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class SpecialCharsInThemeResources extends SingleBrowserTest {
+
+    @Test
+    public void loadThemeResource() {
+        loadResource("/VAADIN/themes/tests-tickets/ordinary.txt");
+        checkSource();
+    }
+
+    @Test
+    public void loadThemeResourceWithPercentage() {
+        loadResource("/VAADIN/themes/tests-tickets/percentagein%2520name.txt");
+        checkSource();
+    }
+
+    @Test
+    public void loadThemeResourceWithSpecialChars() {
+        loadResource("/VAADIN/themes/tests-tickets/folder%20with%20space/resource%20with%20special%20$chars@.txt");
+        checkSource();
+    }
+
+    private void loadResource(String path) {
+        getDriver().get(getBaseURL() + path);
+    }
+
+    private void checkSource() {
+        String source = getDriver().getPageSource();
+        Assert.assertTrue("Incorrect contents (was: " + source + ")",
+                source.contains("Just ordinary contents here"));
+    }
+}