Updated Branches: refs/heads/master 7b31effcb -> 7428323ac
WICKET-4865 Page parameters not working with CryptoMapper Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/7428323a Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/7428323a Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/7428323a Branch: refs/heads/master Commit: 7428323acc6c90b615f8967faed1d051a71d2493 Parents: 7b31eff Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Nov 15 10:18:57 2012 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Nov 15 10:18:57 2012 +0200 ---------------------------------------------------------------------- .../handler/RequestSettingRequestHandler.java | 91 +++++++++++++++ .../wicket/core/request/mapper/CryptoMapper.java | 40 +++++- .../core/request/mapper/CryptoMapperTest.java | 22 +++- .../org/apache/wicket/request/IRequestCycle.java | 11 ++- .../java/org/apache/wicket/request/Request.java | 2 +- 5 files changed, 155 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java new file mode 100644 index 0000000..06ee9aa --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.wicket.core.request.handler; + +import org.apache.wicket.request.IRequestCycle; +import org.apache.wicket.request.IRequestHandler; +import org.apache.wicket.request.IRequestHandlerDelegate; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.util.lang.Args; + +/** + * A {@link IRequestHandler} that sets the current {@link Request} before delegating the responding + * to a wrapped request handler. This is useful when the request received from the browser is not the same + * request used to respond, like when the request mapper clones the request with a new URL. + * + * @author Jesse Long + */ +public class RequestSettingRequestHandler implements IRequestHandlerDelegate +{ + private final Request request; + private final IRequestHandler delegate; + + /** + * Creates a new instance + * @param request + * The request to use when responding + * @param delegate + * The request handler to delegate responding to + */ + public RequestSettingRequestHandler(Request request, IRequestHandler delegate) + { + this.request = Args.notNull(request, "request"); + this.delegate = Args.notNull(delegate,"delegate"); + } + + /** + * Returns the request that will be set before responding. + * @return the request that will be set before responding. + */ + public Request getRequest() + { + return request; + } + + /** + * Returns the request handler to which responding will be delegated. + * @return the request handler to which responding will be delegated. + */ + @Override + public IRequestHandler getDelegateHandler() + { + return delegate; + } + + @Override + public void respond(IRequestCycle requestCycle) + { + RequestCycle cycle = (RequestCycle) requestCycle; + Request originalRequest = cycle.getRequest(); + try + { + cycle.setRequest(request); + delegate.respond(requestCycle); + } + finally + { + cycle.setRequest(originalRequest); + } + } + + @Override + public void detach(IRequestCycle requestCycle) + { + delegate.detach(requestCycle); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java index 03abefa..86c551a 100755 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java @@ -19,6 +19,7 @@ package org.apache.wicket.core.request.mapper; import java.util.List; import org.apache.wicket.Application; +import org.apache.wicket.core.request.handler.RequestSettingRequestHandler; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.IRequestMapper; import org.apache.wicket.request.Request; @@ -110,7 +111,16 @@ public class CryptoMapper implements IRequestMapper return wrappedMapper.mapRequest(request); } - return wrappedMapper.mapRequest(request.cloneWithUrl(url)); + Request decryptedRequest = request.cloneWithUrl(url); + + IRequestHandler handler = wrappedMapper.mapRequest(decryptedRequest); + + if (handler != null) + { + handler = new RequestSettingRequestHandler(decryptedRequest, handler); + } + + return handler; } /** @@ -132,7 +142,7 @@ public class CryptoMapper implements IRequestMapper private Url encryptUrl(final Url url) { - if (url.getSegments().isEmpty() && url.getQueryParameters().isEmpty()) + if (url.getSegments().isEmpty()) { return url; } @@ -152,20 +162,24 @@ public class CryptoMapper implements IRequestMapper private Url decryptUrl(final Request request, final Url encryptedUrl) { + /* + * If the encrypted URL has no segments it is the home page URL, + * and does not need decrypting. + */ if (encryptedUrl.getSegments().isEmpty()) { return encryptedUrl; } List<String> encryptedSegments = encryptedUrl.getSegments(); - if (encryptedSegments.size() < 1) - { - return null; - } Url url = new Url(request.getCharset()); try { + /* + * The first encrypted segment contains an encrypted version of the + * entire plain text url. + */ String encryptedUrlString = encryptedSegments.get(0); if (Strings.isEmpty(encryptedUrlString)) { @@ -195,12 +209,24 @@ public class CryptoMapper implements IRequestMapper String encryptedSegment = encryptedSegments.get(segNo); if (!next.equals(encryptedSegment)) { + /* + * This segment received from the browser is not the same as the + * expected segment generated by the HashSegmentGenerator. Hence it, + * and all subsequent segments are considered plain text siblings of the + * original encrypted url. + */ break; } - // unmodified segment + /* + * This segments matches the expected checksum, so we add the corresponding + * segment from the original URL. + */ url.getSegments().add(originalUrl.getSegments().get(segNo - 1)); } + /* + * Add all remaining segments from the encrypted url as plain text segments. + */ for (; segNo < encryptedNumberOfSegments; segNo++) { // modified or additional segment http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java index 83a6d7c..da8e80de8 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java @@ -18,6 +18,7 @@ package org.apache.wicket.core.request.mapper; import org.apache.wicket.core.request.handler.PageProvider; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; +import org.apache.wicket.core.request.handler.RequestSettingRequestHandler; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.Request; @@ -97,6 +98,8 @@ public class CryptoMapperTest extends AbstractMapperTest { Request request = getRequest(Url.parse(ENCRYPTED_URL)); IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof RenderPageRequestHandler); RenderPageRequestHandler handler = (RenderPageRequestHandler)requestHandler; @@ -112,6 +115,8 @@ public class CryptoMapperTest extends AbstractMapperTest { Request request = getRequest(Url.parse("?named1=value1")); IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof RenderPageRequestHandler); RenderPageRequestHandler handler = (RenderPageRequestHandler)requestHandler; @@ -154,6 +159,8 @@ public class CryptoMapperTest extends AbstractMapperTest Request request = getRequest(url); IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof RenderPageRequestHandler); RenderPageRequestHandler handler = (RenderPageRequestHandler)requestHandler; @@ -163,12 +170,13 @@ public class CryptoMapperTest extends AbstractMapperTest } /** - * https://issues.apache.org/jira/browse/WICKET-3926 + * When the home page url is requested, with parameters, the url will contain only page parameters. + * It should not be encrypted, otherwise we get needless redirects. */ @Test public void homePageWithParameters() { - String expectedEncrypted = "0lhSFdMIt3yZUNwbtLuXgDePMclxSbks"; + String expectedEncrypted = "?namedKey1=namedValue1"; PageParameters expectedParameters = new PageParameters(); expectedParameters.add("namedKey1", "namedValue1"); @@ -179,6 +187,8 @@ public class CryptoMapperTest extends AbstractMapperTest Request request = getRequest(url); IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof RenderPageRequestHandler); RenderPageRequestHandler handler = (RenderPageRequestHandler)requestHandler; @@ -201,6 +211,8 @@ public class CryptoMapperTest extends AbstractMapperTest IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof ResourceReferenceRequestHandler); ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler; @@ -224,6 +236,8 @@ public class CryptoMapperTest extends AbstractMapperTest IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof ResourceReferenceRequestHandler); ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler; @@ -248,6 +262,8 @@ public class CryptoMapperTest extends AbstractMapperTest IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof ResourceReferenceRequestHandler); ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler; @@ -272,6 +288,8 @@ public class CryptoMapperTest extends AbstractMapperTest IRequestHandler requestHandler = mapper.mapRequest(request); + assertTrue(requestHandler instanceof RequestSettingRequestHandler); + requestHandler = ((RequestSettingRequestHandler)requestHandler).getDelegateHandler(); assertTrue(requestHandler instanceof ResourceReferenceRequestHandler); ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler; http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java b/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java index 3b3870d..1aebc47 100755 --- a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java @@ -29,7 +29,7 @@ public interface IRequestCycle Response getResponse(); /** - * Replaces current {@link Response} with new {@link Response} instance. The original response + * Replaces the current {@link Response} with new {@link Response} instance. The original response * is always restored after the {@link IRequestHandler#respond(IRequestCycle)} method is * finished. * @@ -39,6 +39,15 @@ public interface IRequestCycle Response setResponse(Response response); /** + * TODO Wicket 7 + * Add the following method to the API: + * + * Replaces the current {@link Request} with a new one. + * @return the previous request + */ +// Request setRequest(Request request); + + /** * @return the request that originated this cycle */ Request getRequest(); http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-request/src/main/java/org/apache/wicket/request/Request.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/Request.java b/wicket-request/src/main/java/org/apache/wicket/request/Request.java index 67fe851..95d24cc 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/Request.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/Request.java @@ -187,7 +187,7 @@ public abstract class Request @Override public Url getClientUrl() { - return getUrl(); + return Request.this.getClientUrl(); } @Override
