diff --git a/src/Helpers/NetworkHelper.php b/src/Helpers/NetworkHelper.php new file mode 100644 index 0000000..41b33c6 --- /dev/null +++ b/src/Helpers/NetworkHelper.php @@ -0,0 +1,61 @@ +renderFromStringTemplate($template, [ 'question' => $question, - 'hostname' => gethostbyaddr(Toolbox::getRemoteIpAddress()), + 'hostname' => gethostbyaddr(NetworkHelper::getRemoteIpAddress()), ]); } diff --git a/src/Model/QuestionType/IpAddressQuestion.php b/src/Model/QuestionType/IpAddressQuestion.php index fc228cd..4374f0c 100644 --- a/src/Model/QuestionType/IpAddressQuestion.php +++ b/src/Model/QuestionType/IpAddressQuestion.php @@ -38,10 +38,10 @@ use Glpi\Form\Question; use Glpi\Form\QuestionType\AbstractQuestionType; use Glpi\Form\QuestionType\QuestionTypeCategoryInterface; +use GlpiPlugin\Advancedforms\Helpers\NetworkHelper; use GlpiPlugin\Advancedforms\Model\Config\ConfigurableItemInterface; use GlpiPlugin\Advancedforms\Model\Mapper\FormcreatorIpTypeMapper; use Override; -use Toolbox; /** * Legacy question type from the formcreator plugin @@ -108,7 +108,7 @@ public function renderEndUserTemplate(Question|null $question): string $twig = TemplateRenderer::getInstance(); return $twig->renderFromStringTemplate($template, [ 'question' => $question, - 'ip' => Toolbox::getRemoteIpAddress(), + 'ip' => NetworkHelper::getRemoteIpAddress(), ]); } diff --git a/tests/Helpers/NetworkHelperTest.php b/tests/Helpers/NetworkHelperTest.php new file mode 100644 index 0000000..9f65eae --- /dev/null +++ b/tests/Helpers/NetworkHelperTest.php @@ -0,0 +1,157 @@ + [ + 'http_x_forwarded_for' => '192.168.1.100', + 'remote_addr_env' => '10.0.0.1', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '192.168.1.100', + ]; + + // Test X-Forwarded-For header with multiple IPs (should use first one) + yield 'X-Forwarded-For with multiple IPs' => [ + 'http_x_forwarded_for' => '192.168.1.100, 10.0.0.5, 172.16.0.1', + 'remote_addr_env' => '10.0.0.1', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '192.168.1.100', + ]; + + // Test X-Forwarded-For header with spaces + yield 'X-Forwarded-For with spaces' => [ + 'http_x_forwarded_for' => ' 192.168.1.200 ', + 'remote_addr_env' => '10.0.0.1', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '192.168.1.200', + ]; + + // Test fallback to REMOTE_ADDR from getenv + yield 'Fallback to REMOTE_ADDR from getenv' => [ + 'http_x_forwarded_for' => '', + 'remote_addr_env' => '123.123.123.123', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '123.123.123.123', + ]; + + // Test fallback to $_SERVER['REMOTE_ADDR'] + yield 'Fallback to $_SERVER REMOTE_ADDR' => [ + 'http_x_forwarded_for' => '', + 'remote_addr_env' => '', + 'remote_addr_server' => '99.99.99.99', + 'expected' => '99.99.99.99', + ]; + + // Test no IP available at all + yield 'No IP available' => [ + 'http_x_forwarded_for' => '', + 'remote_addr_env' => '', + 'remote_addr_server' => null, + 'expected' => '', + ]; + + // Test IPv6 address in X-Forwarded-For + yield 'IPv6 in X-Forwarded-For' => [ + 'http_x_forwarded_for' => '2001:0db8:85a3:0000:0000:8a2e:0370:7334', + 'remote_addr_env' => '10.0.0.1', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '2001:0db8:85a3:0000:0000:8a2e:0370:7334', + ]; + + // Test IPv6 address in REMOTE_ADDR + yield 'IPv6 in REMOTE_ADDR' => [ + 'http_x_forwarded_for' => '', + 'remote_addr_env' => '2001:0db8:85a3::8a2e:0370:7334', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '2001:0db8:85a3::8a2e:0370:7334', + ]; + + // Test X-Forwarded-For with comma separated IPs without spaces + yield 'X-Forwarded-For comma separated without spaces' => [ + 'http_x_forwarded_for' => '192.168.1.50,10.0.0.5', + 'remote_addr_env' => '10.0.0.1', + 'remote_addr_server' => '10.0.0.1', + 'expected' => '192.168.1.50', + ]; + } + + #[DataProvider('getRemoteIpAddressProvider')] + public function testGetIPAddress( + string $http_x_forwarded_for, + string $remote_addr_env, + ?string $remote_addr_server, + string $expected, + ): void { + // Save values + $saveServer = $_SERVER; + + // Setup environment + if ($http_x_forwarded_for !== '') { + putenv("HTTP_X_FORWARDED_FOR={$http_x_forwarded_for}"); + } else { + putenv("HTTP_X_FORWARDED_FOR="); + } + + if ($remote_addr_env !== '') { + putenv("REMOTE_ADDR={$remote_addr_env}"); + } else { + putenv("REMOTE_ADDR="); + } + + if ($remote_addr_server !== null) { + $_SERVER['REMOTE_ADDR'] = $remote_addr_server; + } else { + unset($_SERVER['REMOTE_ADDR']); + } + + // Test + $ip = NetworkHelper::getRemoteIpAddress(); + $this->assertEquals($expected, $ip); + + // Clean up environment variables + putenv("HTTP_X_FORWARDED_FOR"); + putenv("REMOTE_ADDR"); + + // Restore values + $_SERVER = $saveServer; + } +}