Author: svenmeier
Date: Thu Jul 28 18:02:09 2011
New Revision: 1151942
URL: http://svn.apache.org/viewvc?rev=1151942&view=rev
Log:
WICKET-3514 more tests, simplified CryptoMapper implementation
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
(with props)
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
(with props)
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
(with props)
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
(with props)
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java?rev=1151942&r1=1151941&r2=1151942&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
Thu Jul 28 18:02:09 2011
@@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory;
*
* @author igor.vaynberg
* @author Jesse Long
+ * @author svenmeier
*/
public class CryptoMapper implements IRequestMapper
{
@@ -125,22 +126,10 @@ public class CryptoMapper implements IRe
encryptedUrl.getSegments().add(encryptedUrlString);
int numberOfSegments = url.getSegments().size();
- char[] encryptedChars = encryptedUrlString.toCharArray();
- int hash = 0;
+ HashedSegmentGenerator generator = new
HashedSegmentGenerator(encryptedUrlString);
for (int segNo = 0; segNo < numberOfSegments; segNo++)
{
- char a = encryptedChars[Math.abs(hash %
encryptedChars.length)];
- hash++;
- char b = encryptedChars[Math.abs(hash %
encryptedChars.length)];
- hash++;
- char c = encryptedChars[Math.abs(hash %
encryptedChars.length)];
-
- String segment = "" + a + b + c;
- hash = hashString(segment);
-
- segment += String.format("%02x", Math.abs(hash % 256));
- encryptedUrl.getSegments().add(segment);
- hash = hashString(segment);
+ encryptedUrl.getSegments().add(generator.next());
}
return encryptedUrl;
}
@@ -152,8 +141,8 @@ public class CryptoMapper implements IRe
return encryptedUrl;
}
- List<String> segments = encryptedUrl.getSegments();
- if (segments.size() < 1)
+ List<String> encryptedSegments = encryptedUrl.getSegments();
+ if (encryptedSegments.size() < 1)
{
return null;
}
@@ -161,7 +150,7 @@ public class CryptoMapper implements IRe
Url url = new Url(request.getCharset());
try
{
- String encryptedUrlString = segments.get(0);
+ String encryptedUrlString = encryptedSegments.get(0);
if (Strings.isEmpty(encryptedUrlString))
{
return null;
@@ -171,41 +160,25 @@ public class CryptoMapper implements IRe
Url originalUrl = Url.parse(decryptedUrl,
request.getCharset());
int originalNumberOfSegments =
originalUrl.getSegments().size();
- int numberOfSegments =
encryptedUrl.getSegments().size();
-
- char[] encryptedChars =
encryptedUrlString.toCharArray();
- int hash = 0;
+ int encryptedNumberOfSegments =
encryptedUrl.getSegments().size();
- int segNo;
- for (segNo = 1; segNo < numberOfSegments && segNo <
originalNumberOfSegments + 1; segNo++)
+ HashedSegmentGenerator generator = new
HashedSegmentGenerator(encryptedUrlString);
+ int segNo = 1;
+ for (; segNo < encryptedNumberOfSegments; segNo++)
{
- char a = encryptedChars[Math.abs(hash %
encryptedChars.length)];
- hash++;
- char b = encryptedChars[Math.abs(hash %
encryptedChars.length)];
- hash++;
- char c = encryptedChars[Math.abs(hash %
encryptedChars.length)];
-
- String segment = "" + a + b + c;
- hash = hashString(segment);
-
- segment += String.format("%02x", Math.abs(hash
% 256));
- hash = hashString(segment);
-
- if (segment.equals(segments.get(segNo)) &&
- originalUrl.getSegments().size() >=
segNo)
- {
-
url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
- }
- else
+ if (segNo > originalNumberOfSegments ||
+
!generator.next().equals(encryptedSegments.get(segNo)))
{
- // append new segments from browser
- while (segNo < numberOfSegments)
- {
-
url.getSegments().add(encryptedUrl.getSegments().get(segNo));
- segNo++;
- }
break;
}
+
+ // unmodified segment
+
url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
+ }
+ for (; segNo < encryptedNumberOfSegments; segNo++)
+ {
+ // modified or additional segment
+
url.getSegments().add(encryptedUrl.getSegments().get(segNo));
}
url.getQueryParameters().addAll(originalUrl.getQueryParameters());
@@ -219,19 +192,6 @@ public class CryptoMapper implements IRe
return url;
}
- private int hashString(final String str)
- {
- int hash = 97;
-
- for (char c : str.toCharArray())
- {
- int i = c;
- hash = 47 * hash + i;
- }
-
- return hash;
- }
-
private static class ApplicationCryptProvider implements
IProvider<ICrypt>
{
private final Application application;
@@ -247,4 +207,53 @@ public class CryptoMapper implements IRe
}
}
-}
+ /**
+ * A generator of hashed segments.
+ */
+ private static class HashedSegmentGenerator
+ {
+ private char[] characters;
+
+ private int hash = 0;
+
+ public HashedSegmentGenerator(String string)
+ {
+ characters = string.toCharArray();
+ }
+
+ /**
+ * Generate the next segment
+ *
+ * @return segment
+ */
+ public String next()
+ {
+ char a = characters[Math.abs(hash % characters.length)];
+ hash++;
+ char b = characters[Math.abs(hash % characters.length)];
+ hash++;
+ char c = characters[Math.abs(hash % characters.length)];
+
+ String segment = "" + a + b + c;
+ hash = hashString(segment);
+
+ segment += String.format("%02x", Math.abs(hash % 256));
+ hash = hashString(segment);
+
+ return segment;
+ }
+
+ private int hashString(final String str)
+ {
+ int hash = 97;
+
+ for (char c : str.toCharArray())
+ {
+ int i = c;
+ hash = 47 * hash + i;
+ }
+
+ return hash;
+ }
+ }
+}
\ No newline at end of file
Modified:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java?rev=1151942&r1=1151941&r2=1151942&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
Thu Jul 28 18:02:09 2011
@@ -148,11 +148,11 @@ public class CryptoMapperTest extends Ab
}
/**
- * Test resources appended via CSS, WICKET-3514
+ * Relative ResourceReferences, WICKET-3514
*/
- public void testCSSResource()
+ public void testResourceReference()
{
- String encrypted =
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPIRVhLnwK6Xt2SsvC5G0ygfWLeZ9Qr1gPztSHdUoNloddRxz1zXnW4JHmqip6HVj10wfCyvF7GzNwI7oJfqdt5GjpprCHL1dEe89Ef8QXhwD-ag1NTrt8in9/X5E87/1dEa1/qipf7/10w47/base-tree-images.png";
+ String encrypted =
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/mG5fa";
Request request = getRequest(Url.parse(encrypted));
@@ -161,8 +161,61 @@ public class CryptoMapperTest extends Ab
assertTrue(requestHandler instanceof
ResourceReferenceRequestHandler);
ResourceReferenceRequestHandler handler =
(ResourceReferenceRequestHandler)requestHandler;
- assertEquals(org.apache.wicket.markup.html.tree.BaseTree.class,
- handler.getResourceReference().getScope());
- assertEquals("res/base-tree-images.png",
handler.getResourceReference().getName());
+ assertEquals(getClass(),
handler.getResourceReference().getScope());
+ assertEquals("crypt/crypt.txt",
handler.getResourceReference().getName());
+ }
+
+ /**
+ * Relative ResourceReferences, WICKET-3514
+ */
+ public void testResourceReferenceWithModifiedSegments()
+ {
+ String encrypted =
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/modified-crypt.txt";
+
+ Request request = getRequest(Url.parse(encrypted));
+
+ IRequestHandler requestHandler = mapper.mapRequest(request);
+
+ assertTrue(requestHandler instanceof
ResourceReferenceRequestHandler);
+ ResourceReferenceRequestHandler handler =
(ResourceReferenceRequestHandler)requestHandler;
+
+ assertEquals(getClass(),
handler.getResourceReference().getScope());
+ assertEquals("crypt/modified-crypt.txt",
handler.getResourceReference().getName());
+ }
+
+ /**
+ * Relative ResourceReferences, WICKET-3514
+ */
+ public void testResourceReferenceWithMoreSegments()
+ {
+ String encrypted =
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/more/crypt.txt";
+
+ Request request = getRequest(Url.parse(encrypted));
+
+ IRequestHandler requestHandler = mapper.mapRequest(request);
+
+ assertTrue(requestHandler instanceof
ResourceReferenceRequestHandler);
+ ResourceReferenceRequestHandler handler =
(ResourceReferenceRequestHandler)requestHandler;
+
+ assertEquals(getClass(),
handler.getResourceReference().getScope());
+ assertEquals("crypt/more/crypt.txt",
handler.getResourceReference().getName());
+ }
+
+ /**
+ * Relative ResourceReferences, WICKET-3514
+ */
+ public void testResourceReferenceWithLessSegments()
+ {
+ String encrypted =
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/less-crypt.txt";
+
+ Request request = getRequest(Url.parse(encrypted));
+
+ IRequestHandler requestHandler = mapper.mapRequest(request);
+
+ assertTrue(requestHandler instanceof
ResourceReferenceRequestHandler);
+ ResourceReferenceRequestHandler handler =
(ResourceReferenceRequestHandler)requestHandler;
+
+ assertEquals(getClass(),
handler.getResourceReference().getScope());
+ assertEquals("less-crypt.txt",
handler.getResourceReference().getName());
}
}
\ No newline at end of file
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt?rev=1151942&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReference()
\ No newline at end of file
Propchange:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt?rev=1151942&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithModifiedSegments()
\ No newline at end of file
Propchange:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt?rev=1151942&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithMoreSegments()
\ No newline at end of file
Propchange:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt?rev=1151942&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithLessSegments()
\ No newline at end of file
Propchange:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain