From: markt Date: Sat, 9 Jan 2010 13:14:58 +0000 (+0000) Subject: Rename to fit expected naming convention X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=406636b0a05993f52a3c3f1a744fb8298c746885;p=tomcat7.0 Rename to fit expected naming convention git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@897442 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/test/org/apache/catalina/valves/RemoteIpValveTest.java b/test/org/apache/catalina/valves/RemoteIpValveTest.java deleted file mode 100644 index d1946f1c6..000000000 --- a/test/org/apache/catalina/valves/RemoteIpValveTest.java +++ /dev/null @@ -1,386 +0,0 @@ -/* - * 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 elements = Arrays.asList("element1", "element2", "element3"); - String actual = RemoteIpValve.listToCommaDelimitedString(elements); - assertEquals("element1, element2, element3", actual); - } - - public void testCommaDelimitedListToStringArrayEmptyList() { - List elements = new ArrayList(); - 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 e = new ArrayList(); - e.addAll(Arrays.asList(expected)); - List a = new ArrayList(); - a.addAll(Arrays.asList(actual)); - - for (String entry : e) { - assertTrue(a.remove(entry)); - } - assertTrue(a.isEmpty()); - } -} diff --git a/test/org/apache/catalina/valves/TestRemoteIpValve.java b/test/org/apache/catalina/valves/TestRemoteIpValve.java new file mode 100644 index 000000000..d3a4d9ab6 --- /dev/null +++ b/test/org/apache/catalina/valves/TestRemoteIpValve.java @@ -0,0 +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 TestRemoteIpValve 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 elements = Arrays.asList("element1", "element2", "element3"); + String actual = RemoteIpValve.listToCommaDelimitedString(elements); + assertEquals("element1, element2, element3", actual); + } + + public void testCommaDelimitedListToStringArrayEmptyList() { + List elements = new ArrayList(); + 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 e = new ArrayList(); + e.addAll(Arrays.asList(expected)); + List a = new ArrayList(); + a.addAll(Arrays.asList(actual)); + + for (String entry : e) { + assertTrue(a.remove(entry)); + } + assertTrue(a.isEmpty()); + } +}