diff options
| author | Michael Peter Christen <mc@yacy.net> | 2026-07-12 17:16:24 +0200 |
|---|---|---|
| committer | Michael Peter Christen <mc@yacy.net> | 2026-07-12 17:16:24 +0200 |
| commit | ece7985d9435843989c36395c6dd2db2f0b9e933 (patch) | |
| tree | b54c2eb1f273a4c716470b5aa90ab67b83b35a4b /test | |
| parent | 92e0b111a0ce98964e4de3600d1a81643313ed7e (diff) | |
proper IP recognition using header X-Real-IP when YaCy is behind a
reverse proxy
Diffstat (limited to 'test')
| -rw-r--r-- | test/java/net/yacy/http/Jetty12HttpServerTest.java | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/test/java/net/yacy/http/Jetty12HttpServerTest.java b/test/java/net/yacy/http/Jetty12HttpServerTest.java index 457eaa8ae..f591db7b9 100644 --- a/test/java/net/yacy/http/Jetty12HttpServerTest.java +++ b/test/java/net/yacy/http/Jetty12HttpServerTest.java @@ -10,6 +10,7 @@ import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.Proxy; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicBoolean; @@ -42,6 +43,7 @@ import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import net.yacy.cora.order.Digest; +import net.yacy.cora.protocol.RequestHeader; import net.yacy.search.SwitchboardConstants; /** @@ -115,6 +117,47 @@ public class Jetty12HttpServerTest { } @Test + public void tracksForwardedClientOnlyForTrustedReverseProxy() { + final HttpServletRequest trustedProxyRequest = requestWithRemoteAddress( + "127.0.0.1", "198.51.100.23"); + assertEquals("198.51.100.23", + Jetty12HttpServer.AdminSecurityHandler.resolveTrackingClientIp( + trustedProxyRequest, + SwitchboardConstants.SERVER_REVERSE_PROXY_TRUSTED_DEFAULT)); + + final HttpServletRequest spoofedDirectRequest = requestWithRemoteAddress( + "203.0.113.10", "127.0.0.1"); + assertEquals("203.0.113.10", + Jetty12HttpServer.AdminSecurityHandler.resolveTrackingClientIp( + spoofedDirectRequest, + SwitchboardConstants.SERVER_REVERSE_PROXY_TRUSTED_DEFAULT)); + + final HttpServletRequest invalidForwardedAddress = requestWithRemoteAddress( + "127.0.0.1", "unknown, 198.51.100.23"); + assertEquals("127.0.0.1", + Jetty12HttpServer.AdminSecurityHandler.resolveTrackingClientIp( + invalidForwardedAddress, + SwitchboardConstants.SERVER_REVERSE_PROXY_TRUSTED_DEFAULT)); + } + + private static HttpServletRequest requestWithRemoteAddress(final String socketRemoteIp, + final String forwardedRemoteIp) { + return (HttpServletRequest) Proxy.newProxyInstance( + Jetty12HttpServerTest.class.getClassLoader(), + new Class<?>[]{HttpServletRequest.class}, + (proxy, method, args) -> { + if ("getRemoteAddr".equals(method.getName())) { + return socketRemoteIp; + } + if ("getHeader".equals(method.getName()) + && RequestHeader.X_Real_IP.equals(args[0])) { + return forwardedRemoteIp; + } + return null; + }); + } + + @Test public void preservesJetty9SvgCompressionContract() { final GzipHandler compression = Jetty12HttpServer.createGzipHandler(null, true); assertTrue(compression.isMimeTypeDeflatable("image/svg+xml")); |
