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]>.

Reply via email to