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

amagyar 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 dcbba884a KNOX-2946 - Cookie Path Scoping doesn't work when using 
default topology URL (#786)
dcbba884a is described below

commit dcbba884a1f33215fd4aa38c2e87b2b48a0b802c
Author: Attila Magyar <[email protected]>
AuthorDate: Tue Sep 5 12:37:41 2023 +0200

    KNOX-2946 - Cookie Path Scoping doesn't work when using default topology 
URL (#786)
---
 .../gateway/filter/rewrite/api/CookieScopeServletFilter.java  | 11 +++++++++--
 .../filter/rewrite/impl/CookieScopeResponseWrapper.java       |  9 +++++++--
 .../filter/rewrite/impl/CookieScopeResponseWrapperTest.java   |  9 +++++++++
 .../apache/knox/gateway/filter/PortMappingHelperHandler.java  |  4 +++-
 .../org/apache/knox/gateway/filter/AbstractGatewayFilter.java |  3 ++-
 .../java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java |  3 +++
 6 files changed, 33 insertions(+), 6 deletions(-)

diff --git 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/CookieScopeServletFilter.java
 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/CookieScopeServletFilter.java
index cccd8c239..da3600773 100644
--- 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/CookieScopeServletFilter.java
+++ 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/CookieScopeServletFilter.java
@@ -27,9 +27,11 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.knox.gateway.filter.AbstractGatewayFilter;
 import org.apache.knox.gateway.filter.rewrite.impl.CookieScopeResponseWrapper;
+import org.apache.knox.gateway.i18n.GatewaySpiMessages;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
 
 public class CookieScopeServletFilter extends AbstractGatewayFilter {
-
+  private static final GatewaySpiMessages LOG = 
MessagesFactory.get(GatewaySpiMessages.class);
   private String gatewayPath;
   private String topologyName;
 
@@ -43,7 +45,12 @@ public class CookieScopeServletFilter extends 
AbstractGatewayFilter {
   @Override
   protected void doFilter( HttpServletRequest request, HttpServletResponse 
response, FilterChain chain )
       throws IOException, ServletException {
-    chain.doFilter(request, new CookieScopeResponseWrapper(response, 
gatewayPath, topologyName));
+    if 
(Boolean.parseBoolean((String)request.getAttribute(DEFAULT_TOPOLOGY_FORWARD_ATTRIBUTE_NAME)))
 {
+      LOG.ignoringCookiePathScopeForDefaultTopology();
+      chain.doFilter(request, response);
+    } else {
+      chain.doFilter(request, new CookieScopeResponseWrapper(response, 
gatewayPath, topologyName));
+    }
   }
 
 }
diff --git 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapper.java
 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapper.java
index 83114b56c..7618d2092 100644
--- 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapper.java
+++ 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapper.java
@@ -46,8 +46,8 @@ public class CookieScopeResponseWrapper extends 
GatewayResponseWrapper {
     public void addHeader(String name, String value) {
         if (SET_COOKIE.equals(name)) {
             String updatedCookie;
-            if (value.contains(COOKIE_PATH)) {
-                updatedCookie = value.replace(COOKIE_PATH, scopePath);
+            if (hasCookiePathAttribute(value)) {
+                updatedCookie = value.replaceAll("(?i)" + COOKIE_PATH, 
scopePath);
             } else {
                 // append the scope path
                 updatedCookie = String.format(Locale.ROOT, "%s %s;", value, 
scopePath);
@@ -58,6 +58,11 @@ public class CookieScopeResponseWrapper extends 
GatewayResponseWrapper {
         }
     }
 
+    private boolean hasCookiePathAttribute(String value) {
+        return value != null
+                && 
value.toLowerCase(Locale.ROOT).contains(COOKIE_PATH.toLowerCase(Locale.ROOT));
+    }
+
     @Override
     public OutputStream getRawOutputStream() throws IOException {
         return getResponse().getOutputStream();
diff --git 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapperTest.java
 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapperTest.java
index 80384cc40..d1dda582e 100644
--- 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapperTest.java
+++ 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/CookieScopeResponseWrapperTest.java
@@ -60,6 +60,15 @@ public class CookieScopeResponseWrapperTest {
     Assert.assertEquals("SESSIONID=jn0zexg59r1jo1n66hd7tg5anl; Path=/gw/; 
HttpOnly;", captureValue.getValue());
   }
 
+  @Test
+  public void testRootLowerCasePath() {
+    CookieScopeResponseWrapper underTest = new 
CookieScopeResponseWrapper(mock, "gw");
+    underTest.addHeader("Set-Cookie", "SESSIONID=jn0zexg59r1jo1n66hd7tg5anl; 
path=/; HttpOnly;");
+
+    Assert.assertEquals("Set-Cookie", captureKey.getValue());
+    Assert.assertEquals("SESSIONID=jn0zexg59r1jo1n66hd7tg5anl; Path=/gw/; 
HttpOnly;", captureValue.getValue());
+  }
+
   @Test
   public void testMultiSegmentPath() {
     CookieScopeResponseWrapper underTest = new 
CookieScopeResponseWrapper(mock, "some/path");
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/filter/PortMappingHelperHandler.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/filter/PortMappingHelperHandler.java
index 31de4903a..5f0a11b22 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/filter/PortMappingHelperHandler.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/filter/PortMappingHelperHandler.java
@@ -16,6 +16,8 @@
  */
 package org.apache.knox.gateway.filter;
 
+import static 
org.apache.knox.gateway.filter.AbstractGatewayFilter.DEFAULT_TOPOLOGY_FORWARD_ATTRIBUTE_NAME;
+
 import org.apache.knox.gateway.GatewayMessages;
 import org.apache.knox.gateway.config.GatewayConfig;
 import org.apache.knox.gateway.i18n.messages.MessagesFactory;
@@ -42,7 +44,6 @@ import java.util.Map;
  */
 public class PortMappingHelperHandler extends HandlerWrapper {
   private static final GatewayMessages LOG = 
MessagesFactory.get(GatewayMessages.class);
-
   private final GatewayConfig config;
   private final String defaultTopologyRedirectContext;
 
@@ -148,6 +149,7 @@ public class PortMappingHelperHandler extends 
HandlerWrapper {
 
     final String newTarget = defaultTopologyRedirectContext + target;
     LOG.defaultTopologyForward(target, newTarget);
+    request.setAttribute(DEFAULT_TOPOLOGY_FORWARD_ATTRIBUTE_NAME, "true");
     super.handle(newTarget, baseRequest, newRequest, response);
   }
 }
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/filter/AbstractGatewayFilter.java
 
b/gateway-spi/src/main/java/org/apache/knox/gateway/filter/AbstractGatewayFilter.java
index 59770c42b..4d8e0b1f9 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/filter/AbstractGatewayFilter.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/filter/AbstractGatewayFilter.java
@@ -37,7 +37,8 @@ public abstract class AbstractGatewayFilter implements Filter 
{
   public static final String TARGET_REQUEST_URL_ATTRIBUTE_NAME = 
"targetRequestUrl";
   public static final String SOURCE_REQUEST_CONTEXT_URL_ATTRIBUTE_NAME = 
"sourceRequestContextUrl";
   public static final String TARGET_SERVICE_ROLE = "targetServiceRole";
-//  public static final String RESPONSE_STREAMER_ATTRIBUTE_NAME = 
"responseStreamer";
+  public static final String DEFAULT_TOPOLOGY_FORWARD_ATTRIBUTE_NAME = 
"defaultTopologyForward";
+  //  public static final String RESPONSE_STREAMER_ATTRIBUTE_NAME = 
"responseStreamer";
   private static final GatewaySpiMessages LOG = MessagesFactory.get( 
GatewaySpiMessages.class );
 
   private FilterConfig config;
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
 
b/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
index b8593643f..e0559229e 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
@@ -90,4 +90,7 @@ public interface GatewaySpiMessages {
 
   @Message(level=MessageLevel.DEBUG, text="Creating impersonation provider in 
{0} / {1} with prefix {2} and config {3}")
   void createImpersonationProvider(String topology, String role, String 
prefix, String properties);
+
+  @Message(level=MessageLevel.DEBUG, text="Ignoring cookie path scope filter 
for default topology")
+  void ignoringCookiePathScopeForDefaultTopology();
 }

Reply via email to