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

smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new ad0ea7d4c KNOX-2972 - Session resource can generate application logout 
URL with profile/topologies query parameters (#808)
ad0ea7d4c is described below

commit ad0ea7d4c7fafb5ecc4fa348aabb35f1221fbd19
Author: Sandor Molnar <[email protected]>
AuthorDate: Tue Oct 24 19:21:06 2023 +0200

    KNOX-2972 - Session resource can generate application logout URL with 
profile/topologies query parameters (#808)
---
 .../resources/applications/knoxauth/app/logout.jsp |  1 +
 .../gateway/service/session/SessionResource.java   | 33 ++++++++++++++++------
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git 
a/gateway-applications/src/main/resources/applications/knoxauth/app/logout.jsp 
b/gateway-applications/src/main/resources/applications/knoxauth/app/logout.jsp
index 9dea1d366..27ddc9602 100644
--- 
a/gateway-applications/src/main/resources/applications/knoxauth/app/logout.jsp
+++ 
b/gateway-applications/src/main/resources/applications/knoxauth/app/logout.jsp
@@ -59,6 +59,7 @@
 
     <%
         String originalUrl = request.getParameter("originalUrl");
+        originalUrl = originalUrl.replaceAll("&", "%26");
         Topology topology = 
(Topology)request.getSession().getServletContext().getAttribute("org.apache.knox.gateway.topology");
         String whitelist = null;
         String cookieName = null;
diff --git 
a/gateway-service-session/src/main/java/org/apache/knox/gateway/service/session/SessionResource.java
 
b/gateway-service-session/src/main/java/org/apache/knox/gateway/service/session/SessionResource.java
index 40dda8e81..2a2cd8602 100644
--- 
a/gateway-service-session/src/main/java/org/apache/knox/gateway/service/session/SessionResource.java
+++ 
b/gateway-service-session/src/main/java/org/apache/knox/gateway/service/session/SessionResource.java
@@ -24,10 +24,14 @@ import static javax.ws.rs.core.MediaType.APPLICATION_XML;
 import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
+
+import org.apache.commons.lang3.StringUtils;
 import org.apache.knox.gateway.config.GatewayConfig;
 import org.apache.knox.gateway.i18n.messages.MessagesFactory;
 import org.apache.knox.gateway.security.SubjectUtils;
@@ -44,10 +48,13 @@ public class SessionResource {
   @Context
   ServletContext context;
 
+  private String baseLogoutPageUrl;
+
   @GET
   @Produces({ APPLICATION_JSON, APPLICATION_XML })
   @Path("sessioninfo")
-  public SessionInformation getSessionInformation() {
+  public SessionInformation 
getSessionInformation(@QueryParam("logoutPageProfile") @DefaultValue("") String 
logoutPageProfile,
+      @QueryParam("logoutPageTopologies") @DefaultValue("") String 
logoutPageTopologies) {
     final SessionInformation sessionInfo = new SessionInformation();
     final String user = SubjectUtils.getCurrentEffectivePrincipalName();
     sessionInfo.setUser(user);
@@ -56,7 +63,7 @@ public class SessionResource {
       String logoutUrl = getBaseGatewayUrl(config) + 
"/homepage/knoxssout/api/v1/webssout";
       LOG.homePageLogoutEnabled(logoutUrl);
       sessionInfo.setLogoutUrl(logoutUrl);
-      sessionInfo.setLogoutPageUrl(getLogoutPageUrl(config));
+      sessionInfo.setLogoutPageUrl(getLogoutPageUrl(config, logoutPageProfile, 
logoutPageTopologies));
       sessionInfo.setGlobalLogoutPageUrl(getGlobalLogoutPageUrl(config));
     }
     sessionInfo.setCanSeeAllTokens(config != null ? 
config.canSeeAllTokens(user) : false);
@@ -66,15 +73,23 @@ public class SessionResource {
   }
 
   private String getBaseGatewayUrl(GatewayConfig config) {
-    return request.getRequestURL().substring(0,
-        request.getRequestURL().length() - request.getRequestURI().length()) +
-        "/" + config.getGatewayPath();
+    return request.getRequestURL().substring(0, 
request.getRequestURL().length() - request.getRequestURI().length()) + "/" + 
config.getGatewayPath();
   }
 
-  private String getLogoutPageUrl(GatewayConfig config) {
-    return getBaseGatewayUrl(config) +
-        "/knoxsso/knoxauth/logout.jsp?originalUrl=" + 
getBaseGatewayUrl(config) +
-        "/homepage/home";
+  private String getLogoutPageUrl(GatewayConfig config, String 
logoutPageProfile, String logoutPageTopologies) {
+    if (baseLogoutPageUrl == null) {
+      baseLogoutPageUrl = getBaseGatewayUrl(config) + 
"/knoxsso/knoxauth/logout.jsp?originalUrl=" + getBaseGatewayUrl(config) + 
"/homepage/home";
+    }
+    final StringBuilder logoutPageUrlBuilder = new 
StringBuilder(baseLogoutPageUrl);
+    String delimiter = "%3F"; //'?'
+    if (StringUtils.isNotBlank(logoutPageProfile)) {
+      
logoutPageUrlBuilder.append(delimiter).append("profile=").append(logoutPageProfile);
+      delimiter = "%26";  // '&'
+    }
+    if (StringUtils.isNotBlank(logoutPageTopologies)) {
+      
logoutPageUrlBuilder.append(delimiter).append("topologies=").append(logoutPageTopologies);
+    }
+    return logoutPageUrlBuilder.toString();
   }
 
   private String getGlobalLogoutPageUrl(GatewayConfig config) {

Reply via email to