This is an automated email from the ASF dual-hosted git repository.

enapps-enorman pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-extensions-webconsolesecurityprovider.git


The following commit(s) were added to refs/heads/master by this push:
     new 91a056d  SLING-13178 Logout link from the WebConsole UI fails to 
logout (#7)
91a056d is described below

commit 91a056ddf16cd747fadf69750b75262154f6d526
Author: Eric Norman <[email protected]>
AuthorDate: Tue May 5 12:52:09 2026 -0700

    SLING-13178 Logout link from the WebConsole UI fails to logout (#7)
---
 .../internal/ServicesListener.java                 | 33 +++++++++++++++++++++-
 .../internal/SlingWebConsoleSecurityProvider2.java | 19 +++++++++++--
 .../SlingWebConsoleSecurityProvider2Test.java      |  2 +-
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/ServicesListener.java
 
b/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/ServicesListener.java
index 5478849..3624fc5 100644
--- 
a/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/ServicesListener.java
+++ 
b/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/ServicesListener.java
@@ -18,10 +18,13 @@
  */
 package org.apache.sling.extensions.webconsolesecurityprovider.internal;
 
+import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.Objects;
 
 import org.apache.felix.webconsole.spi.SecurityProvider;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
@@ -30,6 +33,9 @@ import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ManagedService;
+import org.osgi.service.http.context.ServletContextHelper;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+import org.osgi.util.converter.Converters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -183,15 +189,40 @@ public class ServicesListener {
         }
     }
 
+    /**
+     * SLING-13178 resolves the context path of the "org.apache.sling" servlet 
context
+     *
+     * @return the resolved context path or empty string otherwise
+     */
+    private @NotNull String resolveSlingServletContextPath() {
+        Object value = null;
+        Collection<ServiceReference<ServletContextHelper>> serviceReferences;
+        try {
+            String filter =
+                    String.format("(%s=org.apache.sling)", 
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME);
+            serviceReferences = 
bundleContext.getServiceReferences(ServletContextHelper.class, filter);
+            value = serviceReferences.stream()
+                    .map(sr -> 
sr.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH))
+                    .filter(Objects::nonNull)
+                    .findFirst()
+                    .orElse(null);
+        } catch (InvalidSyntaxException e) {
+            // should never get here
+            logger.warn("Failed to get servlet context helper", e);
+        }
+        return 
Converters.standardConverter().convert(value).defaultValue("").to(String.class);
+    }
+
     private void registerProviderSling(final Object authSupport, final Object 
authenticator) {
         final Dictionary<String, Object> props = new Hashtable<>();
         props.put(Constants.SERVICE_PID, 
SlingWebConsoleSecurityProvider.class.getName());
         props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Web Console 
Security Provider 2");
         props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
         props.put("webconsole.security.provider.id", 
"org.apache.sling.extensions.webconsolesecurityprovider2");
+        final String slingServletContextPath = 
resolveSlingServletContextPath();
         this.provider2Reg = this.bundleContext.registerService(
                 new String[] {ManagedService.class.getName(), 
SecurityProvider.class.getName()},
-                new SlingWebConsoleSecurityProvider2(authSupport, 
authenticator),
+                new SlingWebConsoleSecurityProvider2(authSupport, 
authenticator, slingServletContextPath),
                 props);
     }
 
diff --git 
a/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2.java
 
b/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2.java
index bf8aaea..66307ce 100644
--- 
a/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2.java
+++ 
b/src/main/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2.java
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.Set;
 
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.felix.webconsole.spi.SecurityProvider;
 import org.apache.jackrabbit.api.JackrabbitSession;
@@ -74,9 +75,13 @@ public class SlingWebConsoleSecurityProvider2 implements 
SecurityProvider, Manag
 
     private final Authenticator authenticator;
 
-    public SlingWebConsoleSecurityProvider2(@NotNull final Object support, 
@NotNull final Object authenticator) {
+    private final String slingContextPath;
+
+    public SlingWebConsoleSecurityProvider2(
+            @NotNull final Object support, @NotNull final Object 
authenticator, @NotNull String slingContextPath) {
         this.authentiationSupport = (AuthenticationSupport) support;
         this.authenticator = (Authenticator) authenticator;
+        this.slingContextPath = slingContextPath;
     }
 
     /**
@@ -176,6 +181,16 @@ public class SlingWebConsoleSecurityProvider2 implements 
SecurityProvider, Manag
 
     @Override
     public void logout(@NotNull HttpServletRequest request, @NotNull 
HttpServletResponse response) {
-        this.authenticator.logout(request, response);
+        // SLING-13178 - we want the context path to be whatever was used to 
login
+        //   to ensure the sling.formauth cookie using the same "path" value 
when
+        //   clearing the cookie
+        HttpServletRequest wrappedRequest = new 
HttpServletRequestWrapper(request) {
+            @Override
+            public String getContextPath() {
+                return slingContextPath;
+            }
+        };
+
+        this.authenticator.logout(wrappedRequest, response);
     }
 }
diff --git 
a/src/test/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2Test.java
 
b/src/test/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2Test.java
index 6254cc0..175d721 100644
--- 
a/src/test/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2Test.java
+++ 
b/src/test/java/org/apache/sling/extensions/webconsolesecurityprovider/internal/SlingWebConsoleSecurityProvider2Test.java
@@ -67,7 +67,7 @@ public class SlingWebConsoleSecurityProvider2Test {
     public void before() {
         support = Mockito.mock(AuthenticationSupport.class);
         authenticator = Mockito.mock(Authenticator.class);
-        provider = new SlingWebConsoleSecurityProvider2(support, 
authenticator);
+        provider = new SlingWebConsoleSecurityProvider2(support, 
authenticator, "");
     }
 
     /**

Reply via email to