Modified: tomcat/trunk/test/org/apache/catalina/valves/RemoteIpValveTest.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/valves/RemoteIpValveTest.java?rev=833300&r1=833299&r2=833300&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/valves/RemoteIpValveTest.java
(original)
+++ tomcat/trunk/test/org/apache/catalina/valves/RemoteIpValveTest.java Fri Nov
6 05:12:50 2009
@@ -1,386 +1,386 @@
-/*
- * 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.catalina.valves;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.servlet.ServletException;
-
-import junit.framework.TestCase;
-
-import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
-import org.apache.catalina.valves.ValveBase;
-
-/**
- * {...@link RemoteIpValve} Tests
- */
-public class RemoteIpValveTest extends TestCase {
-
- static class RemoteAddrAndHostTrackerValve extends ValveBase {
- private String remoteAddr;
- private String remoteHost;
-
- public String getRemoteAddr() {
- return remoteAddr;
- }
-
- public String getRemoteHost() {
- return remoteHost;
- }
-
- @Override
- public void invoke(Request request, Response response) throws
IOException, ServletException {
- this.remoteHost = request.getRemoteHost();
- this.remoteAddr = request.getRemoteAddr();
- }
- }
-
- public void testCommaDelimitedListToStringArray() {
- List<String> elements = Arrays.asList("element1", "element2",
"element3");
- String actual = RemoteIpValve.listToCommaDelimitedString(elements);
- assertEquals("element1, element2, element3", actual);
- }
-
- public void testCommaDelimitedListToStringArrayEmptyList() {
- List<String> elements = new ArrayList<String>();
- String actual = RemoteIpValve.listToCommaDelimitedString(elements);
- assertEquals("", actual);
- }
-
- public void testCommaDelimitedListToStringArrayNullList() {
- String actual = RemoteIpValve.listToCommaDelimitedString(null);
- assertEquals("", actual);
- }
-
- public void testInvokeAllowedRemoteAddrWithNullRemoteIpHeader() throws
Exception {
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertNull("x-forwarded-for must be null", actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertNull("x-forwarded-by must be null", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "192.168.0.10", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "remote-host-original-value",
actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
-
- }
-
- public void testInvokeAllProxiesAreTrusted() throws Exception {
-
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
-
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
- }
-
- public void testInvokeAllProxiesAreTrustedOrInternal() throws Exception {
-
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
- request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for")
- .setString("140.211.11.130, proxy1, proxy2, 192.168.0.10,
192.168.0.11");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
- }
-
- public void testInvokeAllProxiesAreInternal() throws Exception {
-
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
-
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
192.168.0.10, 192.168.0.11");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertNull("all proxies are internal, x-forwarded-for must be null",
actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertNull("all proxies are internal, x-forwarded-by must be null",
actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
- }
-
- public void testInvokeAllProxiesAreTrustedAndRemoteAddrMatchRegexp()
throws Exception {
-
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("127\\.0\\.0\\.1, 192\\.168\\..*,
another-internal-proxy");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
-
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
- }
-
- public void testInvokeNotAllowedRemoteAddr() throws Exception {
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1,proxy2,proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("not-allowed-internal-proxy");
- request.setRemoteHost("not-allowed-internal-proxy-host");
-
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertEquals("x-forwarded-for must be unchanged", "140.211.11.130,
proxy1, proxy2", actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertNull("x-forwarded-by must be null", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "not-allowed-internal-proxy",
actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "not-allowed-internal-proxy-host",
actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "not-allowed-internal-proxy",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr",
"not-allowed-internal-proxy-host", actualPostInvokeRemoteHost);
- }
-
- public void testInvokeUntrustedProxyInTheChain() throws Exception {
- // PREPARE
- RemoteIpValve remoteIpValve = new RemoteIpValve();
- remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
- remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
- remoteIpValve.setRemoteIpHeader("x-forwarded-for");
- remoteIpValve.setProxiesHeader("x-forwarded-by");
- RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
- remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
-
- Request request = new Request();
- request.setCoyoteRequest(new org.apache.coyote.Request());
- request.setRemoteAddr("192.168.0.10");
- request.setRemoteHost("remote-host-original-value");
- request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for")
- .setString("140.211.11.130, proxy1, untrusted-proxy, proxy2");
-
- // TEST
- remoteIpValve.invoke(request, null);
-
- // VERIFY
- String actualXForwardedFor = request.getHeader("x-forwarded-for");
- assertEquals("ip/host before untrusted-proxy must appear in
x-forwarded-for", "140.211.11.130, proxy1", actualXForwardedFor);
-
- String actualXForwardedBy = request.getHeader("x-forwarded-by");
- assertEquals("ip/host after untrusted-proxy must appear in
x-forwarded-by", "proxy2", actualXForwardedBy);
-
- String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
- assertEquals("remoteAddr", "untrusted-proxy", actualRemoteAddr);
-
- String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
- assertEquals("remoteHost", "untrusted-proxy", actualRemoteHost);
-
- String actualPostInvokeRemoteAddr = request.getRemoteAddr();
- assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
-
- String actualPostInvokeRemoteHost = request.getRemoteHost();
- assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
- }
-
- public void testListToCommaDelimitedString() {
- String[] actual =
RemoteIpValve.commaDelimitedListToStringArray("element1, element2, element3");
- String[] expected = new String[] {
- "element1", "element2", "element3"
- };
- assertArrayEquals(expected, actual);
- }
-
- public void testListToCommaDelimitedStringMixedSpaceChars() {
- String[] actual =
RemoteIpValve.commaDelimitedListToStringArray("element1 , element2,\t
element3");
- String[] expected = new String[] {
- "element1", "element2", "element3"
- };
- assertArrayEquals(expected, actual);
- }
-
- private void assertArrayEquals(String[] expected, String[] actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.length, actual.length);
- List<String> e = new ArrayList<String>();
- e.addAll(Arrays.asList(expected));
- List<String> a = new ArrayList<String>();
- a.addAll(Arrays.asList(actual));
-
- for (String entry : e) {
- assertTrue(a.remove(entry));
- }
- assertTrue(a.isEmpty());
- }
-}
+/*
+ * 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.catalina.valves;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.servlet.ServletException;
+
+import junit.framework.TestCase;
+
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.valves.ValveBase;
+
+/**
+ * {...@link RemoteIpValve} Tests
+ */
+public class RemoteIpValveTest extends TestCase {
+
+ static class RemoteAddrAndHostTrackerValve extends ValveBase {
+ private String remoteAddr;
+ private String remoteHost;
+
+ public String getRemoteAddr() {
+ return remoteAddr;
+ }
+
+ public String getRemoteHost() {
+ return remoteHost;
+ }
+
+ @Override
+ public void invoke(Request request, Response response) throws
IOException, ServletException {
+ this.remoteHost = request.getRemoteHost();
+ this.remoteAddr = request.getRemoteAddr();
+ }
+ }
+
+ public void testCommaDelimitedListToStringArray() {
+ List<String> elements = Arrays.asList("element1", "element2",
"element3");
+ String actual = RemoteIpValve.listToCommaDelimitedString(elements);
+ assertEquals("element1, element2, element3", actual);
+ }
+
+ public void testCommaDelimitedListToStringArrayEmptyList() {
+ List<String> elements = new ArrayList<String>();
+ String actual = RemoteIpValve.listToCommaDelimitedString(elements);
+ assertEquals("", actual);
+ }
+
+ public void testCommaDelimitedListToStringArrayNullList() {
+ String actual = RemoteIpValve.listToCommaDelimitedString(null);
+ assertEquals("", actual);
+ }
+
+ public void testInvokeAllowedRemoteAddrWithNullRemoteIpHeader() throws
Exception {
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertNull("x-forwarded-for must be null", actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertNull("x-forwarded-by must be null", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "192.168.0.10", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "remote-host-original-value",
actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+
+ }
+
+ public void testInvokeAllProxiesAreTrusted() throws Exception {
+
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+ }
+
+ public void testInvokeAllProxiesAreTrustedOrInternal() throws Exception {
+
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+ request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for")
+ .setString("140.211.11.130, proxy1, proxy2, 192.168.0.10,
192.168.0.11");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+ }
+
+ public void testInvokeAllProxiesAreInternal() throws Exception {
+
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
192.168.0.10, 192.168.0.11");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertNull("all proxies are internal, x-forwarded-for must be null",
actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertNull("all proxies are internal, x-forwarded-by must be null",
actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+ }
+
+ public void testInvokeAllProxiesAreTrustedAndRemoteAddrMatchRegexp()
throws Exception {
+
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("127\\.0\\.0\\.1, 192\\.168\\..*,
another-internal-proxy");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertNull("all proxies are trusted, x-forwarded-for must be null",
actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertEquals("all proxies are trusted, they must appear in
x-forwarded-by", "proxy1, proxy2", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "140.211.11.130", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "140.211.11.130", actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+ }
+
+ public void testInvokeNotAllowedRemoteAddr() throws Exception {
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1,proxy2,proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("not-allowed-internal-proxy");
+ request.setRemoteHost("not-allowed-internal-proxy-host");
+
request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for").setString("140.211.11.130,
proxy1, proxy2");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertEquals("x-forwarded-for must be unchanged", "140.211.11.130,
proxy1, proxy2", actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertNull("x-forwarded-by must be null", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "not-allowed-internal-proxy",
actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "not-allowed-internal-proxy-host",
actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "not-allowed-internal-proxy",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr",
"not-allowed-internal-proxy-host", actualPostInvokeRemoteHost);
+ }
+
+ public void testInvokeUntrustedProxyInTheChain() throws Exception {
+ // PREPARE
+ RemoteIpValve remoteIpValve = new RemoteIpValve();
+ remoteIpValve.setInternalProxies("192\\.168\\.0\\.10,
192\\.168\\.0\\.11");
+ remoteIpValve.setTrustedProxies("proxy1, proxy2, proxy3");
+ remoteIpValve.setRemoteIpHeader("x-forwarded-for");
+ remoteIpValve.setProxiesHeader("x-forwarded-by");
+ RemoteAddrAndHostTrackerValve remoteAddrAndHostTrackerValve = new
RemoteAddrAndHostTrackerValve();
+ remoteIpValve.setNext(remoteAddrAndHostTrackerValve);
+
+ Request request = new Request();
+ request.setCoyoteRequest(new org.apache.coyote.Request());
+ request.setRemoteAddr("192.168.0.10");
+ request.setRemoteHost("remote-host-original-value");
+ request.getCoyoteRequest().getMimeHeaders().addValue("x-forwarded-for")
+ .setString("140.211.11.130, proxy1, untrusted-proxy, proxy2");
+
+ // TEST
+ remoteIpValve.invoke(request, null);
+
+ // VERIFY
+ String actualXForwardedFor = request.getHeader("x-forwarded-for");
+ assertEquals("ip/host before untrusted-proxy must appear in
x-forwarded-for", "140.211.11.130, proxy1", actualXForwardedFor);
+
+ String actualXForwardedBy = request.getHeader("x-forwarded-by");
+ assertEquals("ip/host after untrusted-proxy must appear in
x-forwarded-by", "proxy2", actualXForwardedBy);
+
+ String actualRemoteAddr =
remoteAddrAndHostTrackerValve.getRemoteAddr();
+ assertEquals("remoteAddr", "untrusted-proxy", actualRemoteAddr);
+
+ String actualRemoteHost =
remoteAddrAndHostTrackerValve.getRemoteHost();
+ assertEquals("remoteHost", "untrusted-proxy", actualRemoteHost);
+
+ String actualPostInvokeRemoteAddr = request.getRemoteAddr();
+ assertEquals("postInvoke remoteAddr", "192.168.0.10",
actualPostInvokeRemoteAddr);
+
+ String actualPostInvokeRemoteHost = request.getRemoteHost();
+ assertEquals("postInvoke remoteAddr", "remote-host-original-value",
actualPostInvokeRemoteHost);
+ }
+
+ public void testListToCommaDelimitedString() {
+ String[] actual =
RemoteIpValve.commaDelimitedListToStringArray("element1, element2, element3");
+ String[] expected = new String[] {
+ "element1", "element2", "element3"
+ };
+ assertArrayEquals(expected, actual);
+ }
+
+ public void testListToCommaDelimitedStringMixedSpaceChars() {
+ String[] actual =
RemoteIpValve.commaDelimitedListToStringArray("element1 , element2,\t
element3");
+ String[] expected = new String[] {
+ "element1", "element2", "element3"
+ };
+ assertArrayEquals(expected, actual);
+ }
+
+ private void assertArrayEquals(String[] expected, String[] actual) {
+ if (expected == null) {
+ assertNull(actual);
+ return;
+ }
+ assertNotNull(actual);
+ assertEquals(expected.length, actual.length);
+ List<String> e = new ArrayList<String>();
+ e.addAll(Arrays.asList(expected));
+ List<String> a = new ArrayList<String>();
+ a.addAll(Arrays.asList(actual));
+
+ for (String entry : e) {
+ assertTrue(a.remove(entry));
+ }
+ assertTrue(a.isEmpty());
+ }
+}
Propchange: tomcat/trunk/test/org/apache/catalina/valves/RemoteIpValveTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/test/org/apache/tomcat/util/http/CookiesBaseTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDefaultSysProps.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesNoFwdStrictSysProps.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesNoStrictNamingSysProps.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesStrictSysProps.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesSwitchSysProps.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]