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();
}
}