This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-startupfilter.git
commit 60e23690d9fbd0fb0e73067c2ea3f25bbd4da8d0 Author: Bertrand Delacretaz <[email protected]> AuthorDate: Fri Sep 27 14:03:28 2013 +0000 SLING-3119 - handle path-based bypass in doFilter instead of using regexp git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1526908 13f79535-47bb-0310-9956-ffa450edef68 --- .../startupfilter/impl/StartupFilterImpl.java | 15 ++++++++-- .../startupfilter/impl/StartupFilterImplTest.java | 32 +++++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java b/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java index aeb88a2..1bfba9b 100644 --- a/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java +++ b/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java @@ -29,6 +29,7 @@ import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.felix.scr.annotations.Activate; @@ -95,6 +96,16 @@ public class StartupFilterImpl implements StartupFilter, Filter { return; } + // Bypass for the managerRoot path + if(request instanceof HttpServletRequest) { + final String pathInfo = ((HttpServletRequest)request).getPathInfo(); + if(managerRoot != null && managerRoot.length() > 0 && pathInfo.startsWith(managerRoot)) { + log.debug("Bypassing filter for path {} which starts with {}", pathInfo, managerRoot); + chain.doFilter(request, sr); + return; + } + } + updateProviders(); final StringBuilder sb = new StringBuilder(); @@ -165,7 +176,7 @@ public class StartupFilterImpl implements StartupFilter, Filter { if(defaultFilterActive) { enable(); } - log.info("Activated, enabled={}", isEnabled()); + log.info("Activated, enabled={}, managerRoot={}", isEnabled(), managerRoot); } @Deactivate @@ -179,7 +190,7 @@ public class StartupFilterImpl implements StartupFilter, Filter { public synchronized void enable() { if(filterServiceRegistration == null) { - final String pattern = "^(?!"+ managerRoot +")(.+)"; + final String pattern = "/"; final Hashtable<String, Object> params = new Hashtable<String, Object>(); params.put(Constants.SERVICE_RANKING, 0x9000); // run before RequestLoggerFilter (0x8000) params.put("filter.scope", "REQUEST"); diff --git a/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java b/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java index 9fd25c2..fb80d66 100644 --- a/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java +++ b/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java @@ -28,6 +28,8 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.Filter; import javax.servlet.FilterChain; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -121,6 +123,8 @@ public class StartupFilterImplTest { private StringWriter messageWriter; private AtomicInteger activeFilterCount; private ServiceRegistration serviceRegistration; + private String requestPath; + private static final String CONSOLE_ROOT = "/test/system/console"; @Before public void setup() { @@ -131,6 +135,7 @@ public class StartupFilterImplTest { chain = mockery.mock(FilterChain.class); serviceRegistration = mockery.mock(ServiceRegistration.class); filter = new TestFilterImpl(); + requestPath = "/NO_PATH_YET"; } private void setProvider(final TestProvider provider) throws Exception { @@ -170,7 +175,9 @@ public class StartupFilterImplTest { will(returnValue(providerRefs)); allowing(bundleContext).getService(with(any(ServiceReference.class))); will(returnValue(provider)); - allowing(bundleContext).getProperty(with(any(String.class))); + + allowing(bundleContext).getProperty(with("felix.webconsole.manager.root")); + will(returnValue(CONSOLE_ROOT)); allowing(bundleContext).registerService(with(Filter.class.getName()), with(any(Object.class)), with(any(Dictionary.class))); will(new DoAllAction( @@ -189,11 +196,20 @@ public class StartupFilterImplTest { allowing(serviceRegistration).unregister(); will(new ChangeInteger(activeFilterCount, false)); + + allowing(request).getPathInfo(); + will(returnValue(getRequestPath())); + + allowing(chain).doFilter(with(any(ServletRequest.class)), with(any(ServletResponse.class))); }}); filter.setup(componentContext); } + private String getRequestPath() { + return requestPath; + } + private void assertRequest(final int expectedStatus, final String expectedMessage) throws Exception { lastReturnedStatus = -1; @@ -216,6 +232,20 @@ public class StartupFilterImplTest { } @Test + public void testBypassRoot() throws Exception { + requestPath = CONSOLE_ROOT; + setProvider(null); + assertRequest(-1, ""); + } + + @Test + public void testBypassSubpath() throws Exception { + requestPath = CONSOLE_ROOT + "/something"; + setProvider(null); + assertRequest(-1, ""); + } + + @Test public void testDisabling() throws Exception { setProvider(null); assertEquals("Initially expecting one filter service", 1, activeFilterCount.get()); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
