From 5aa7c18756633d6ec421731f814676679ddd6db9 Mon Sep 17 00:00:00 2001
From: Patrick Radtke <patrick@cirrusidentity.com>
Date: Wed, 20 Jan 2021 09:58:28 -0800
Subject: [PATCH] Ignore invalid hook names

Sometimes we patch or edit a hook to meet our specific needs.
Somtimes this leaves behind a file like FILENAME.orig. The hook
detection login still runs these other files, making for confusing
debugging issues. Use a stricter match on what makes a valid hook name
to avoid these issues.
---
 lib/SimpleSAML/Module.php                     |  2 +-
 tests/lib/SimpleSAML/ModuleTest.php           | 22 +++++++++++++++++++
 tests/modules/unittest/README.md              |  1 +
 .../unittest/hooks/hook_invalid.php.orig      |  3 +++
 tests/modules/unittest/hooks/hook_valid.php   | 14 ++++++++++++
 .../unittest/hooks/invalid_hook_prefix.php    |  3 +++
 6 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 tests/modules/unittest/README.md
 create mode 100644 tests/modules/unittest/hooks/hook_invalid.php.orig
 create mode 100644 tests/modules/unittest/hooks/hook_valid.php
 create mode 100644 tests/modules/unittest/hooks/invalid_hook_prefix.php

diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php
index ef6222319..425eb13b9 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 0a4b69941..543e30709 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 000000000..52b5ff5a2
--- /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 000000000..d09ba0cd5
--- /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 000000000..b45dcd25e
--- /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 000000000..d09ba0cd5
--- /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
-- 
GitLab