summaryrefslogtreecommitdiffstats
path: root/tests/Inc/GetClientIpTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Inc/GetClientIpTest.php')
-rw-r--r--tests/Inc/GetClientIpTest.php89
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/Inc/GetClientIpTest.php b/tests/Inc/GetClientIpTest.php
new file mode 100644
index 00000000..22287ff3
--- /dev/null
+++ b/tests/Inc/GetClientIpTest.php
@@ -0,0 +1,89 @@
+<?php
+
+use PHPUnit\Framework\TestCase;
+
+class GetClientIpTest extends TestCase
+{
+ protected function setUp(): void
+ {
+ Property::reset();
+ unset($_SERVER['REMOTE_ADDR']);
+ unset($_SERVER['HTTP_X_FORWARDED_FOR']);
+ Util::getClientIp(true);
+ }
+
+
+ public function testGetClientIpDirect(): void
+ {
+ $_SERVER['REMOTE_ADDR'] = '1.2.3.4';
+ $this->assertSame('1.2.3.4', Util::getClientIp());
+ }
+
+ public function testGetClientIpTrustedProxy(): void
+ {
+ $_SERVER['REMOTE_ADDR'] = '10.0.0.1';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '1.2.3.4';
+ Property::$values['webinterface.proxies-trusted'] = json_encode(['10.0.0.1' => true]);
+
+ $this->assertSame('1.2.3.4', Util::getClientIp());
+ }
+
+ public function testGetClientIpUntrustedProxy(): void
+ {
+ $_SERVER['REMOTE_ADDR'] = '10.2'; // Not in trusted list
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '1.2.3.4';
+ Property::$values['webinterface.proxies-trusted'] = json_encode(['10.0.0.1' => true]);
+
+ $this->assertSame('10.0.0.2', Util::getClientIp());
+ }
+
+ public function testGetClientIpChain(): void
+ {
+ // Chain: Client (1.1.1.1) -> Proxy1 (2.2.2.2) -> Proxy2 (3.3.3.3) -> WebServer
+ $_SERVER['REMOTE_ADDR'] = '::ffff:3.3.3.3';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '1.1.1.1, 2.2.2.2';
+ Property::$values['webinterface.proxies-trusted'] = json_encode([
+ '3.3.3.3' => true,
+ '2.2.2.2' => true
+ ]);
+
+ // We want it to return '1.1.1.1'
+ $this->assertSame('1.1.1.1', Util::getClientIp());
+ }
+
+ public function testGetClientIpLongChain(): void
+ {
+ // Chain: Client (1.1.1.1) -> UntrustedProxy (4.4.4.4) -> Proxy1 (2.2.2.2) -> Proxy2 (3.3.3.3) -> WebServer
+ $_SERVER['REMOTE_ADDR'] = '3.3.3.3';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '9.9.9.9, 1.1.1.1, 4.4.4.4, ::ffff:2.2.2.2';
+ Property::$values['webinterface.proxies-trusted'] = json_encode([
+ '1.1.1.1' => true,
+ '3.3.3.3' => true,
+ '2.2.2.2' => true
+ ]);
+
+ // Should return 4.4.4.4 because it's the first untrusted from the right
+ $this->assertSame('4.4.4.4', Util::getClientIp());
+ }
+
+ public function testGetClientIpIpv6Mapping(): void
+ {
+ $_SERVER['REMOTE_ADDR'] = '::ffff:10.0.0.1';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '::ffff:1.2.3.4';
+ Property::$values['webinterface.proxies-trusted'] = json_encode(['10.0.0.1' => true]);
+
+ $this->assertSame('1.2.3.4', Util::getClientIp());
+ }
+
+ public function testGetClientIpIpv6MappingInChain(): void
+ {
+ $_SERVER['REMOTE_ADDR'] = '3.3.3.3';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '9.9.9.9, ::ffff:1.1.1.1, ::ffff:2.2.2.2';
+ Property::$values['webinterface.proxies-trusted'] = json_encode([
+ '3.3.3.3' => true,
+ '2.2.2.2' => true
+ ]);
+
+ $this->assertSame('1.1.1.1', Util::getClientIp());
+ }
+}