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

krisden 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 e90beea  KNOX-1919 - Taking gateway.path into consideration when 
processing redirectToUrl provider param with the OOTB knoxsso.xml sample (#113)
e90beea is described below

commit e90beeaa4624129de936991284f3caa6f67ac652
Author: Sandor Molnar <[email protected]>
AuthorDate: Wed Jul 10 18:44:55 2019 +0200

    KNOX-1919 - Taking gateway.path into consideration when processing 
redirectToUrl provider param with the OOTB knoxsso.xml sample (#113)
---
 .../knox/gateway/filter/RedirectToUrlFilter.java   | 22 ++++++--
 .../gateway/filter/RedirectToUrlFilterTest.java    | 61 ++++++++++++++++++++++
 gateway-release/home/conf/topologies/knoxsso.xml   |  2 +-
 3 files changed, 79 insertions(+), 6 deletions(-)

diff --git 
a/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
 
b/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
index f97984f..f0f14b3 100644
--- 
a/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
+++ 
b/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
@@ -18,35 +18,47 @@
 
 package org.apache.knox.gateway.filter;
 
+import java.io.IOException;
+import java.util.regex.Pattern;
+
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.apache.knox.gateway.config.GatewayConfig;
 
 public class RedirectToUrlFilter extends AbstractGatewayFilter {
   public static final String REDIRECT_TO_URL = "redirectToUrl";
+  private static final String GATEWAY_PATH_PLACEHOLDER = "${GATEWAY_PATH}";
 
-  protected String redirectUrl;
+  private String redirectUrl;
 
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
     super.init(filterConfig);
     redirectUrl = filterConfig.getInitParameter(REDIRECT_TO_URL);
+    if (redirectUrl != null && redirectUrl.contains(GATEWAY_PATH_PLACEHOLDER)) 
{
+      final GatewayConfig gatewayConfig = (GatewayConfig) 
filterConfig.getServletContext().getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE);
+      redirectUrl = 
redirectUrl.replaceAll(Pattern.quote(GATEWAY_PATH_PLACEHOLDER), 
gatewayConfig.getGatewayPath());
+    }
   }
 
   @Override
-  protected void doFilter( HttpServletRequest request,
-      HttpServletResponse response, FilterChain chain ) throws IOException, 
ServletException {
+  protected void doFilter(HttpServletRequest request, HttpServletResponse 
response, FilterChain chain) throws IOException, ServletException {
     if (redirectUrl != null && request.getHeader("Authorization") == null) {
       response.sendRedirect(redirectUrl + getOriginalQueryString(request));
     }
-    chain.doFilter( request, response );
+    chain.doFilter(request, response);
   }
 
   private String getOriginalQueryString(HttpServletRequest request) {
     String originalQueryString = request.getQueryString();
     return (originalQueryString == null) ? "" : "?" + originalQueryString;
   }
+
+  String getRedirectUrl() {
+    return redirectUrl;
+  }
 }
diff --git 
a/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
 
b/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
new file mode 100644
index 0000000..efa2d78
--- /dev/null
+++ 
b/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.filter;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+public class RedirectToUrlFilterTest {
+
+  private static final String OUT_OF_THE_BOX_REDIRECT_TO_URL = 
"/${GATEWAY_PATH}/knoxsso/knoxauth/login.html";
+  private static final String CUSTOM_REDIRECT_URL = 
"/route/to/my/web/app/login/page";
+
+  @Test
+  public void shouldReplaceGatewayPathInRedirectUrl() throws Exception {
+    final String customGatewayPath = "customGatewayPath";
+    final RedirectToUrlFilter filter = new RedirectToUrlFilter();
+    
filter.init(buildFilterConfigAndSetOtherMockExpectations(OUT_OF_THE_BOX_REDIRECT_TO_URL,
 customGatewayPath));
+    assertEquals("/" + customGatewayPath + "/knoxsso/knoxauth/login.html", 
filter.getRedirectUrl());
+  }
+
+  @Test
+  public void shouldNotTouchAlreadyCustomizedRedirectUrl() throws Exception {
+    final RedirectToUrlFilter filter = new RedirectToUrlFilter();
+    
filter.init(buildFilterConfigAndSetOtherMockExpectations(CUSTOM_REDIRECT_URL, 
""));
+    assertEquals(CUSTOM_REDIRECT_URL, filter.getRedirectUrl());
+  }
+
+  private FilterConfig buildFilterConfigAndSetOtherMockExpectations(String 
redirectUrl, String customGatewayPath) {
+    final FilterConfig filterConfig = 
EasyMock.createNiceMock(FilterConfig.class);
+    
EasyMock.expect(filterConfig.getInitParameter(RedirectToUrlFilter.REDIRECT_TO_URL)).andReturn(redirectUrl);
+    final ServletContext servletContext = 
EasyMock.createNiceMock(ServletContext.class);
+    
EasyMock.expect(filterConfig.getServletContext()).andReturn(servletContext);
+    final GatewayConfig gatewayConfig = 
EasyMock.createNiceMock(GatewayConfig.class);
+    
EasyMock.expect(servletContext.getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE)).andReturn(gatewayConfig);
+    
EasyMock.expect(gatewayConfig.getGatewayPath()).andReturn(customGatewayPath);
+
+    EasyMock.replay(filterConfig, servletContext, gatewayConfig);
+    return filterConfig;
+  }
+}
diff --git a/gateway-release/home/conf/topologies/knoxsso.xml 
b/gateway-release/home/conf/topologies/knoxsso.xml
index b4ac7b1..a679600 100644
--- a/gateway-release/home/conf/topologies/knoxsso.xml
+++ b/gateway-release/home/conf/topologies/knoxsso.xml
@@ -39,7 +39,7 @@
             </param>
             <param>
                 <name>redirectToUrl</name>
-                <value>/gateway/knoxsso/knoxauth/login.html</value>
+                <value>/${GATEWAY_PATH}/knoxsso/knoxauth/login.html</value>
             </param>
             <param>
                 <name>restrictedCookies</name>

Reply via email to