V1.6.0 (#515)

* KNOX-2655 - Disallow Userinfo in KnoxSSO originalURL Query Param
diff --git a/gateway-applications/src/main/resources/applications/knoxauth/app/redirecting.jsp b/gateway-applications/src/main/resources/applications/knoxauth/app/redirecting.jsp
index 0b54c48..7a2b94c 100644
--- a/gateway-applications/src/main/resources/applications/knoxauth/app/redirecting.jsp
+++ b/gateway-applications/src/main/resources/applications/knoxauth/app/redirecting.jsp
@@ -14,9 +14,11 @@
 -->
 <%@ page import="java.util.Collection" %>
 <%@ page import="java.util.Map" %>
+<%@ page import="java.net.MalformedURLException" %>
 <%@ page import="org.apache.knox.gateway.topology.Topology" %>
 <%@ page import="org.apache.knox.gateway.topology.Service" %>
 <%@ page import="org.apache.knox.gateway.util.RegExUtils" %>
+<%@ page import="org.apache.knox.gateway.util.Urls" %>
 <%@ page import="org.apache.knox.gateway.util.WhitelistUtils" %>
 
 <!DOCTYPE html>
@@ -41,31 +43,43 @@
 
         <script type="text/javascript" src="js/knoxauth.js"></script>
     <%
+        boolean validRedirect = true;
         String originalUrl = request.getParameter("originalUrl");
-        Topology topology = (Topology)request.getSession().getServletContext().getAttribute("org.apache.knox.gateway.topology");
-        String whitelist = null;
-        Collection services = topology.getServices();
-        for (Object service : services) {
-          Service svc = (Service)service;
-          if (svc.getRole().equals("KNOXSSO")) {
-            Map<String, String> params = svc.getParams();
-            whitelist = params.get("knoxsso.redirect.whitelist.regex");
+        try {
+          if (Urls.containsUserInfo(originalUrl)) {
+            validRedirect = false;
           }
         }
-        if (whitelist == null) {
+        catch (MalformedURLException ex) {
+          // if not a well formed URL then not a valid redirect
+          validRedirect = false;
+        }
+        if (validRedirect) {
+	      Topology topology = (Topology)request.getSession().getServletContext().getAttribute("org.apache.knox.gateway.topology");
+          String whitelist = null;
+          Collection services = topology.getServices();
+          for (Object service : services) {
+            Service svc = (Service)service;
+            if (svc.getRole().equals("KNOXSSO")) {
+              Map<String, String> params = svc.getParams();
+              whitelist = params.get("knoxsso.redirect.whitelist.regex");
+            }
+          }
+          if (whitelist == null) {
             whitelist = WhitelistUtils.getDispatchWhitelist(request);
             if (whitelist == null) {
-                whitelist = "";
+              whitelist = "";
             }
+          }
+          validRedirect = RegExUtils.checkWhitelist(whitelist, originalUrl);
         }
-        boolean validRedirect = RegExUtils.checkWhitelist(whitelist, originalUrl);
         if (validRedirect) {
     %>
     <script>
     document.addEventListener("load", redirectOnLoad());
 
     function redirectOnLoad() {
-      var originalUrl = "<%= originalUrl %>";
+      var originalUrl = <%= originalUrl %>;
       if (originalUrl != null) {
         redirect(originalUrl);
       }
diff --git a/gateway-util-common/src/main/java/org/apache/knox/gateway/util/Urls.java b/gateway-util-common/src/main/java/org/apache/knox/gateway/util/Urls.java
index bb500a9..fa31ddf 100644
--- a/gateway-util-common/src/main/java/org/apache/knox/gateway/util/Urls.java
+++ b/gateway-util-common/src/main/java/org/apache/knox/gateway/util/Urls.java
@@ -72,6 +72,16 @@
   }
 
   /**
+   * Does the provided URL contain UserInfo
+   * @param url
+   * @return true if a URL contains userInfo else false
+   * @throws MalformedURLException
+   */
+  public static boolean containsUserInfo(String url) throws MalformedURLException {
+    return (new URL(url).getUserInfo() != null);
+  }
+
+  /**
    * Compute the domain name from an URL.
    *
    * @param url a given URL
diff --git a/gateway-util-common/src/test/java/org/apache/knox/gateway/util/UrlsTest.java b/gateway-util-common/src/test/java/org/apache/knox/gateway/util/UrlsTest.java
index ec1e331..0f15858 100644
--- a/gateway-util-common/src/test/java/org/apache/knox/gateway/util/UrlsTest.java
+++ b/gateway-util-common/src/test/java/org/apache/knox/gateway/util/UrlsTest.java
@@ -18,6 +18,8 @@
 package org.apache.knox.gateway.util;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -94,4 +96,9 @@
     assertEquals( "%3F", Urls.encode( "?" ) );
   }
 
+  @Test
+  public void testContainsUserInfo() throws Exception {
+    assertTrue(Urls.containsUserInfo( "https://www.local.com:8443aa@google.com"));
+    assertFalse(Urls.containsUserInfo( "https://www.local.com:8443/google.com"));
+  }
 }