You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2011/01/13 23:45:52 UTC

svn commit: r1058769 - in /wicket/trunk/wicket-core/src: main/java/org/apache/wicket/protocol/http/ main/java/org/apache/wicket/protocol/http/servlet/ test/java/org/apache/wicket/protocol/http/servlet/

Author: jdonnerstag
Date: Thu Jan 13 22:45:52 2011
New Revision: 1058769

URL: http://svn.apache.org/viewvc?rev=1058769&view=rev
Log:
As suggested by Igor I've added a simple FilterFactoryManager to manage "web filters"

Added:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java Thu Jan 13 22:45:52 2011
@@ -33,6 +33,8 @@ import org.apache.wicket.markup.html.pag
 import org.apache.wicket.markup.html.pages.InternalErrorPage;
 import org.apache.wicket.markup.html.pages.PageExpiredErrorPage;
 import org.apache.wicket.markup.resolver.AutoLinkResolver;
+import org.apache.wicket.protocol.http.servlet.AbstractRequestWrapperFactory;
+import org.apache.wicket.protocol.http.servlet.FilterFactoryManager;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.protocol.http.servlet.ServletWebResponse;
 import org.apache.wicket.request.IRequestHandler;
@@ -118,6 +120,8 @@ public abstract class WebApplication ext
 
 	private IContextProvider<AjaxRequestTarget, Page> ajaxRequestTargetProvider;
 
+	private FilterFactoryManager filterFactoryManager;
+
 	/**
 	 * Covariant override for easy getting the current {@link WebApplication} without having to cast
 	 * it.
@@ -364,9 +368,16 @@ public abstract class WebApplication ext
 	 *            the filter mapping read from web.xml
 	 * @return a WebRequest object
 	 */
-	protected WebRequest newWebRequest(final HttpServletRequest servletRequest,
-		final String filterPath)
+	protected WebRequest newWebRequest(HttpServletRequest servletRequest, final String filterPath)
 	{
+		if (hasFilterFactoryManager())
+		{
+			for (AbstractRequestWrapperFactory factory : getFilterFactoryManager())
+			{
+				servletRequest = factory.getWrapper(servletRequest);
+			}
+		}
+
 		return new ServletWebRequest(servletRequest, filterPath);
 	}
 
@@ -742,4 +753,24 @@ public abstract class WebApplication ext
 			return new AjaxRequestTarget(context);
 		}
 	}
+
+	/**
+	 * @return True if at least one filter factory has been added.
+	 */
+	public final boolean hasFilterFactoryManager()
+	{
+		return filterFactoryManager != null;
+	}
+
+	/**
+	 * @return The filter factory manager
+	 */
+	public final FilterFactoryManager getFilterFactoryManager()
+	{
+		if (filterFactoryManager == null)
+		{
+			filterFactoryManager = new FilterFactoryManager();
+		}
+		return filterFactoryManager;
+	}
 }

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java Thu Jan 13 22:45:52 2011
@@ -40,6 +40,13 @@ public abstract class AbstractRequestWra
 	private boolean enabled = true;
 
 	/**
+	 * Construct.
+	 */
+	public AbstractRequestWrapperFactory()
+	{
+	}
+
+	/**
 	 * 
 	 * @return True, if filter is enabled
 	 */

Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java?rev=1058769&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java Thu Jan 13 22:45:52 2011
@@ -0,0 +1,114 @@
+/*
+ * 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.protocol.http.servlet;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.FilterConfig;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.lang.Generics;
+
+/**
+ * A very simple manager for web filter (web filter factories to be exact).
+ * 
+ * @author Juergen Donnerstag
+ */
+public class FilterFactoryManager implements Iterable<AbstractRequestWrapperFactory>
+{
+	private List<AbstractRequestWrapperFactory> filters;
+
+	/**
+	 * Construct.
+	 */
+	public FilterFactoryManager()
+	{
+	}
+
+	/**
+	 * Add a filter factory
+	 * 
+	 * @param wrapperFactory
+	 * @return this
+	 */
+	public final FilterFactoryManager add(final AbstractRequestWrapperFactory wrapperFactory)
+	{
+		if (wrapperFactory != null)
+		{
+			if (filters == null)
+			{
+				filters = Generics.newArrayList(2);
+			}
+
+			filters.add(wrapperFactory);
+		}
+
+		return this;
+	}
+
+	/**
+	 * Add a X-Forwarded web filter factory
+	 * 
+	 * @param config
+	 *            If null, <code>WebApplication.get().getWicketFilter().getFilterConfig()</code>
+	 *            will be called to retrieve the config.
+	 * @return this
+	 */
+	public final FilterFactoryManager addXForwardedRequestWrapperFactory(FilterConfig config)
+	{
+		if (config == null)
+		{
+			config = WebApplication.get().getWicketFilter().getFilterConfig();
+		}
+
+		XForwardedRequestWrapperFactory factory = new XForwardedRequestWrapperFactory();
+		factory.init(config);
+
+		return add(factory);
+	}
+
+	/**
+	 * Add a Secure remote address web filter factory
+	 * 
+	 * @param config
+	 *            If null, <code>WebApplication.get().getWicketFilter().getFilterConfig()</code>
+	 *            will be called to retrieve the config.
+	 * @return this
+	 */
+	public final FilterFactoryManager addSecuredRemoteAddressRequestWrapperFactory(
+		FilterConfig config)
+	{
+		if (config == null)
+		{
+			config = WebApplication.get().getWicketFilter().getFilterConfig();
+		}
+
+		SecuredRemoteAddressRequestWrapperFactory factory = new SecuredRemoteAddressRequestWrapperFactory();
+		factory.init(config);
+
+		return add(factory);
+	}
+
+	/**
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<AbstractRequestWrapperFactory> iterator()
+	{
+		return filters.iterator();
+	}
+}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java Thu Jan 13 22:45:52 2011
@@ -123,6 +123,13 @@ public class SecuredRemoteAddressRequest
 	private Config config = new Config();
 
 	/**
+	 * Construct.
+	 */
+	public SecuredRemoteAddressRequestWrapperFactory()
+	{
+	}
+
+	/**
 	 * @return SecuredRemoteAddress and XForwarded filter specific config
 	 */
 	public final Config getConfig()
@@ -141,7 +148,7 @@ public class SecuredRemoteAddressRequest
 	}
 
 	/**
-	 * @see org.apache.wicket.protocol.http.servlet.AbstractRequestWrapperFactory#getWrapper(javax.servlet.http.HttpServletRequest)
+	 * {@inheritDoc}
 	 */
 	@Override
 	public HttpServletRequest getWrapper(final HttpServletRequest request)
@@ -159,9 +166,7 @@ public class SecuredRemoteAddressRequest
 	}
 
 	/**
-	 * 
-	 * @param request
-	 * @return True, if a wrapper is needed
+	 * {@inheritDoc}
 	 */
 	@Override
 	public boolean needsWrapper(final HttpServletRequest request)

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java Thu Jan 13 22:45:52 2011
@@ -604,6 +604,13 @@ public class XForwardedRequestWrapperFac
 	private Config config = new Config();
 
 	/**
+	 * Construct.
+	 */
+	public XForwardedRequestWrapperFactory()
+	{
+	}
+
+	/**
 	 * @return XForwarded filter specific config
 	 */
 	public final Config getConfig()
@@ -622,9 +629,7 @@ public class XForwardedRequestWrapperFac
 	}
 
 	/**
-	 * 
-	 * @param request
-	 * @return True, if a wrapper is needed
+	 * {@inheritDoc}
 	 */
 	@Override
 	public boolean needsWrapper(final HttpServletRequest request)
@@ -655,9 +660,10 @@ public class XForwardedRequestWrapperFac
 		LinkedList<String> proxiesHeaderValue = new LinkedList<String>();
 
 		String[] remoteIPHeaderValue = commaDelimitedListToStringArray(request.getHeader(config.remoteIPHeader));
-		int idx;
+
 		// loop on remoteIPHeaderValue to find the first trusted remote ip and to build the
 		// proxies chain
+		int idx;
 		for (idx = remoteIPHeaderValue.length - 1; idx >= 0; idx--)
 		{
 			String currentRemoteIp = remoteIPHeaderValue[idx];
@@ -676,6 +682,7 @@ public class XForwardedRequestWrapperFac
 				break;
 			}
 		}
+
 		// continue to loop on remoteIPHeaderValue to build the new value of the remoteIPHeader
 		LinkedList<String> newRemoteIpHeaderValue = new LinkedList<String>();
 		for (; idx >= 0; idx--)

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java Thu Jan 13 22:45:52 2011
@@ -23,7 +23,6 @@ import org.apache.wicket.markup.html.bas
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
 import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
-import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.tester.WicketTester;
 
 /**
@@ -159,10 +158,10 @@ public class XForwardedRequestWrapperTes
 
 	private class MyApplication extends MockApplication
 	{
-		public XForwardedRequestWrapperFactory factory;
+		XForwardedRequestWrapperFactory factory;
 
 		/**
-		 * @see org.apache.wicket.protocol.http.WebApplication#init()
+		 * {@inheritDoc}
 		 */
 		@Override
 		protected void init()
@@ -171,17 +170,8 @@ public class XForwardedRequestWrapperTes
 
 			factory = new XForwardedRequestWrapperFactory();
 			factory.init(getWicketFilter().getFilterConfig());
-		}
 
-		/**
-		 * @see org.apache.wicket.protocol.http.WebApplication#newWebRequest(javax.servlet.http.HttpServletRequest,
-		 *      java.lang.String)
-		 */
-		@Override
-		protected WebRequest newWebRequest(HttpServletRequest request, String filterPath)
-		{
-			HttpServletRequest xRequest = factory.getWrapper(request);
-			return super.newWebRequest(xRequest, filterPath);
+			getFilterFactoryManager().add(factory);
 		}
 	}