You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2013/03/15 00:09:18 UTC

[8/14] git commit: When requested checksum does not match actual, treat as a missing resource

When requested checksum does not match actual, treat as a missing resource


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/56a6aa32
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/56a6aa32
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/56a6aa32

Branch: refs/heads/master
Commit: 56a6aa322b5e6547c2f4f158358ca4c9a3ade9b7
Parents: 8fbbd59
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Thu Mar 7 16:34:32 2013 -0800
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Thu Mar 14 13:41:11 2013 -0700

----------------------------------------------------------------------
 .../internal/services/assets/ChecksumPath.java     |   62 ++++++++++-----
 .../assets/ClasspathAssetRequestHandler.java       |    8 ++-
 .../assets/ContextAssetRequestHandler.java         |   15 ++--
 .../tapestry5/services/assets/AssetsModule.java    |    6 +-
 .../assets/ContextAssetRequestHandlerTest.java     |   47 +++++++++--
 5 files changed, 99 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/56a6aa32/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ChecksumPath.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ChecksumPath.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ChecksumPath.java
index 8155a01..da6dc77 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ChecksumPath.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ChecksumPath.java
@@ -16,6 +16,7 @@ package org.apache.tapestry5.internal.services.assets;
 
 import org.apache.tapestry5.internal.services.ResourceStreamer;
 import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.services.assets.AssetChecksumGenerator;
 
 import java.io.IOException;
 
@@ -25,35 +26,56 @@ import java.io.IOException;
  *
  * @since 5.4
  */
-public class ChecksumPath {
-  public final String checksum;
+public class ChecksumPath
+{
+    public final String checksum;
 
-  public final String resourcePath;
+    public final String resourcePath;
 
-  private final ResourceStreamer streamer;
+    private final ResourceStreamer streamer;
 
-  public ChecksumPath(ResourceStreamer streamer, String baseFolder, String extraPath) {
-    this.streamer = streamer;
-    int slashx = extraPath.indexOf('/');
+    private final AssetChecksumGenerator assetChecksumGenerator;
 
-    checksum = extraPath.substring(0, slashx);
+    public ChecksumPath(ResourceStreamer streamer, AssetChecksumGenerator assetChecksumGenerator, String baseFolder, String extraPath)
+    {
+        this.streamer = streamer;
+        this.assetChecksumGenerator = assetChecksumGenerator;
+        int slashx = extraPath.indexOf('/');
 
-    String morePath = extraPath.substring(slashx + 1);
+        checksum = extraPath.substring(0, slashx);
 
-    resourcePath = baseFolder == null
-        ? morePath
-        : baseFolder + "/" + morePath;
-  }
+        String morePath = extraPath.substring(slashx + 1);
 
-  public boolean stream(Resource resource) throws IOException {
-    if (resource == null) {
-      return false;
+        resourcePath = baseFolder == null
+                ? morePath
+                : baseFolder + "/" + morePath;
     }
 
-    // TODO: Handle incorrect checksum ... maybe with a redirect?
+    /**
+     * If the resource exists and the checksum is correct, stream it to the client and return true. Otherwise,
+     * return false.
+     *
+     * @param resource
+     *         to stream
+     * @return true if streamed, false otherwise
+     * @throws IOException
+     */
+    public boolean stream(Resource resource) throws IOException
+    {
+        if (resource == null || !resource.exists())
+        {
+            return false;
+        }
 
-    streamer.streamResource(resource);
+        String actualChecksum = assetChecksumGenerator.generateChecksum(resource);
 
-    return true;
-  }
+        if (!actualChecksum.equals(checksum))
+        {
+            return false;
+        }
+
+        streamer.streamResource(resource);
+
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/56a6aa32/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ClasspathAssetRequestHandler.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ClasspathAssetRequestHandler.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ClasspathAssetRequestHandler.java
index 1441010..d1c3656 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ClasspathAssetRequestHandler.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ClasspathAssetRequestHandler.java
@@ -19,6 +19,7 @@ import org.apache.tapestry5.internal.services.ResourceStreamer;
 import org.apache.tapestry5.services.ClasspathAssetAliasManager;
 import org.apache.tapestry5.services.Request;
 import org.apache.tapestry5.services.Response;
+import org.apache.tapestry5.services.assets.AssetChecksumGenerator;
 import org.apache.tapestry5.services.assets.AssetRequestHandler;
 
 import java.io.IOException;
@@ -35,19 +36,22 @@ public class ClasspathAssetRequestHandler implements AssetRequestHandler
 
     private final AssetResourceLocator assetResourceLocator;
 
+    private final AssetChecksumGenerator checksumGenerator;
+
     private final String baseFolder;
 
     public ClasspathAssetRequestHandler(ResourceStreamer streamer, AssetResourceLocator assetResourceLocator,
-                                        String baseFolder)
+                                        AssetChecksumGenerator checksumGenerator, String baseFolder)
     {
         this.streamer = streamer;
         this.assetResourceLocator = assetResourceLocator;
+        this.checksumGenerator = checksumGenerator;
         this.baseFolder = baseFolder;
     }
 
     public boolean handleAssetRequest(Request request, Response response, String extraPath) throws IOException
     {
-        ChecksumPath path = new ChecksumPath(streamer, baseFolder, extraPath);
+        ChecksumPath path = new ChecksumPath(streamer, checksumGenerator, baseFolder, extraPath);
 
         return path.stream(assetResourceLocator.findClasspathResourceForPath(path.resourcePath));
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/56a6aa32/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandler.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandler.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandler.java
index 824c824..72a634c 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandler.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandler.java
@@ -14,38 +14,41 @@
 
 package org.apache.tapestry5.internal.services.assets;
 
-import java.io.IOException;
-import java.util.regex.Pattern;
-
 import org.apache.tapestry5.internal.services.ResourceStreamer;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.services.Request;
 import org.apache.tapestry5.services.Response;
+import org.apache.tapestry5.services.assets.AssetChecksumGenerator;
 import org.apache.tapestry5.services.assets.AssetRequestHandler;
 
+import java.io.IOException;
+import java.util.regex.Pattern;
+
 /**
  * Handles requests for context assets, screening out attempt to
  * access anything under WEB-INF or META-INF.
- * 
+ *
  * @since 5.2.0
  */
 public class ContextAssetRequestHandler implements AssetRequestHandler
 {
     private final ResourceStreamer resourceStreamer;
 
+    private final AssetChecksumGenerator checksumGenerator;
     private final Resource rootContextResource;
 
     private final Pattern illegal = Pattern.compile("^(((web|meta)-inf.*)|(.*\\.tml$))", Pattern.CASE_INSENSITIVE);
 
-    public ContextAssetRequestHandler(ResourceStreamer resourceStreamer, Resource rootContextResource)
+    public ContextAssetRequestHandler(ResourceStreamer resourceStreamer, AssetChecksumGenerator checksumGenerator, Resource rootContextResource)
     {
         this.resourceStreamer = resourceStreamer;
+        this.checksumGenerator = checksumGenerator;
         this.rootContextResource = rootContextResource;
     }
 
     public boolean handleAssetRequest(Request request, Response response, String extraPath) throws IOException
     {
-        ChecksumPath path = new ChecksumPath(resourceStreamer, null, extraPath);
+        ChecksumPath path = new ChecksumPath(resourceStreamer, checksumGenerator, null, extraPath);
 
         if (illegal.matcher(path.resourcePath).matches())
         {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/56a6aa32/tapestry-core/src/main/java/org/apache/tapestry5/services/assets/AssetsModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/assets/AssetsModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/assets/AssetsModule.java
index 14cd162..d78e925 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/assets/AssetsModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/assets/AssetsModule.java
@@ -219,6 +219,8 @@ public class AssetsModule
                                                       @Autobuild
                                                       StackAssetRequestHandler stackAssetRequestHandler,
 
+                                                      AssetChecksumGenerator assetChecksumGenerator,
+
                                                       ClasspathAssetAliasManager classpathAssetAliasManager, ResourceStreamer streamer,
                                                       AssetResourceLocator assetResourceLocator)
     {
@@ -228,11 +230,11 @@ public class AssetsModule
         {
             String path = mappings.get(folder);
 
-            configuration.add(folder, new ClasspathAssetRequestHandler(streamer, assetResourceLocator, path));
+            configuration.add(folder, new ClasspathAssetRequestHandler(streamer, assetResourceLocator, assetChecksumGenerator, path));
         }
 
         configuration.add(RequestConstants.CONTEXT_FOLDER,
-                new ContextAssetRequestHandler(streamer, contextAssetFactory.getRootResource()));
+                new ContextAssetRequestHandler(streamer, assetChecksumGenerator, contextAssetFactory.getRootResource()));
 
         configuration.add(RequestConstants.STACK_FOLDER, stackAssetRequestHandler);
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/56a6aa32/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandlerTest.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandlerTest.java b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandlerTest.java
index e343b2b..bdb745c 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandlerTest.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/assets/ContextAssetRequestHandlerTest.java
@@ -14,31 +14,60 @@
 
 package org.apache.tapestry5.internal.services.assets;
 
-import java.io.IOException;
-
+import org.apache.tapestry5.internal.services.ResourceStreamer;
+import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.test.TestBase;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.Response;
+import org.apache.tapestry5.services.assets.AssetChecksumGenerator;
+import org.apache.tapestry5.services.assets.AssetRequestHandler;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import java.io.IOException;
+
 public class ContextAssetRequestHandlerTest extends TestBase
 {
     @DataProvider
     public Object[][] invalid_paths()
     {
         return new Object[][]
-        {
-        { "web-Inf/classes/hibernate.cfg.xml" },
-        { "Meta-Inf/MANIFEST.mf" },
-        { "Index.tml" },
-        { "folder/FolderIndex.TML" } };
+                {
+                        {"web-Inf/classes/hibernate.cfg.xml"},
+                        {"Meta-Inf/MANIFEST.mf"},
+                        {"Index.tml"},
+                        {"folder/FolderIndex.TML"}};
     }
 
     @Test(dataProvider = "invalid_paths")
     public void ensure_assets_are_rejected(String path) throws IOException
     {
-        ContextAssetRequestHandler handler = new ContextAssetRequestHandler(null, null);
+        ContextAssetRequestHandler handler = new ContextAssetRequestHandler(null, null, null);
 
         assertFalse(handler.handleAssetRequest(null, null, "fake-checksum/" + path),
-            "Handler should return false for invalid path.");
+                "Handler should return false for invalid path.");
+    }
+
+    @Test
+    public void invalid_checksums_are_treated_as_if_missing() throws IOException
+    {
+        ResourceStreamer streamer = newMock(ResourceStreamer.class);
+        AssetChecksumGenerator gen = newMock(AssetChecksumGenerator.class);
+        Resource root = newMock(Resource.class);
+        Resource r = newMock(Resource.class);
+        Request req = newMock(Request.class);
+        Response res = newMock(Response.class);
+
+        expect(root.forFile("folder/icon.png")).andReturn(r);
+        expect(r.exists()).andReturn(true);
+        expect(gen.generateChecksum(r)).andReturn("def");
+
+        replay();
+
+        AssetRequestHandler h = new ContextAssetRequestHandler(streamer, gen, root);
+
+        assertFalse(h.handleAssetRequest(req, res, "abc/folder/icon.png"));
+
+        verify();
     }
 }