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, "");
}
/**