diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php index ef622231928f0f06fd34f642633748108f529175..425eb13b9a659465b44cd2ac9d44e68dc4b0cf63 100644 --- a/lib/SimpleSAML/Module.php +++ b/lib/SimpleSAML/Module.php @@ -496,7 +496,7 @@ class Module continue; } - if (!preg_match('/hook_(\w+)\.php/', $file, $matches)) { + if (!preg_match('/^hook_(\w+)\.php$/', $file, $matches)) { continue; } $hook_name = $matches[1]; diff --git a/tests/lib/SimpleSAML/ModuleTest.php b/tests/lib/SimpleSAML/ModuleTest.php index 0a4b69941e628d1bacc03d13662ed6915c442dc6..543e3070905468c636a33380fbf9aa201ad51a21 100644 --- a/tests/lib/SimpleSAML/ModuleTest.php +++ b/tests/lib/SimpleSAML/ModuleTest.php @@ -112,4 +112,26 @@ class ModuleTest extends TestCase '\SimpleSAML\Auth\ProcessingFilter' )); } + + /** + * Test for SimpleSAML\Module::getModuleHooks(). It covers happy path. + */ + public function testGetModuleHooks(): void + { + $hooks = Module::getModuleHooks('saml'); + $this->assertArrayHasKey('metadata_hosted', $hooks); + $this->assertEquals('saml_hook_metadata_hosted', $hooks['metadata_hosted']['func']); + $expectedFile = dirname(__DIR__, 3) . '/modules/saml/hooks/hook_metadata_hosted.php'; + $this->assertEquals($expectedFile, $hooks['metadata_hosted']['file']); + } + + /** + * Test for SimpleSAML\Module::getModuleHooks(). It covers invalid hook names + */ + public function testGetModuleHooksIgnoresInvalidHooks(): void + { + $hooks = Module::getModuleHooks('../tests/modules/unittest'); + $this->assertArrayHasKey('valid', $hooks, 'hooks=' . var_export($hooks, true)); + $this->assertCount(1, $hooks, "Invalid hooks should be ignored"); + } } diff --git a/tests/modules/unittest/README.md b/tests/modules/unittest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..52b5ff5a2fcf33a12173a6da26846b8a2d139f4c --- /dev/null +++ b/tests/modules/unittest/README.md @@ -0,0 +1 @@ +For some unit tests we need a module that has a specific setup or issues. diff --git a/tests/modules/unittest/hooks/hook_invalid.php.orig b/tests/modules/unittest/hooks/hook_invalid.php.orig new file mode 100644 index 0000000000000000000000000000000000000000..d09ba0cd5deaff7120e1f23bc52abac2ae8927c2 --- /dev/null +++ b/tests/modules/unittest/hooks/hook_invalid.php.orig @@ -0,0 +1,3 @@ +<?php + +// Hook detection should not load this file since it does not conform to the hook naming scheme diff --git a/tests/modules/unittest/hooks/hook_valid.php b/tests/modules/unittest/hooks/hook_valid.php new file mode 100644 index 0000000000000000000000000000000000000000..b45dcd25ea7611ac8506ab175f76157e0a603172 --- /dev/null +++ b/tests/modules/unittest/hooks/hook_valid.php @@ -0,0 +1,14 @@ +<?php + +use SimpleSAML\Assert\Assert; +use SimpleSAML\Auth; + +/** + * Hook to for use with unit tests + * + * @param array &$data Some data + */ +function unittest_hook_valid(array &$data) +{ + $data['summary'][] = 'success'; +} diff --git a/tests/modules/unittest/hooks/invalid_hook_prefix.php b/tests/modules/unittest/hooks/invalid_hook_prefix.php new file mode 100644 index 0000000000000000000000000000000000000000..d09ba0cd5deaff7120e1f23bc52abac2ae8927c2 --- /dev/null +++ b/tests/modules/unittest/hooks/invalid_hook_prefix.php @@ -0,0 +1,3 @@ +<?php + +// Hook detection should not load this file since it does not conform to the hook naming scheme