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()); } }