diff --git a/src/Core/Util/AdminHelpers.php b/src/Core/Util/AdminHelpers.php index 85cb27c7..fcd16950 100644 --- a/src/Core/Util/AdminHelpers.php +++ b/src/Core/Util/AdminHelpers.php @@ -359,12 +359,14 @@ class AdminHelpers { /** * Extract the page name (script basename) from a URL. * - * @param string $rURL URL to parse. - * @return string|null Lowercased page name, or null if $rURL is empty. + * @param string|null $rURL URL to parse. post.php passes its optional + * `referer` parameter, which the new-UI forms omit. + * @return string|null Lowercased page name, or null if $rURL is empty or has no path. */ - public static function getPageFromURL(string $rURL) { - if ($rURL) { - return strtolower(basename(ltrim(parse_url($rURL)['path'], '/'), '.php')); + public static function getPageFromURL(?string $rURL) { + $rPath = $rURL ? parse_url($rURL, PHP_URL_PATH) : null; + if (is_string($rPath) && trim($rPath, '/') !== '') { + return strtolower(basename(ltrim($rPath, '/'), '.php')); } return null; diff --git a/tests/Unit/AdminHelpersTest.php b/tests/Unit/AdminHelpersTest.php index fcefd5d5..b0f86f0a 100644 --- a/tests/Unit/AdminHelpersTest.php +++ b/tests/Unit/AdminHelpersTest.php @@ -64,6 +64,16 @@ final class AdminHelpersTest extends TestCase { $this->assertNull(AdminHelpers::getPageFromURL('')); } + /** + * post.php hands over its `referer` parameter, which the new-UI forms do not + * send: a null there must read as "no page", not end the request. + */ + public function testGetPageFromUrlWithoutAReferer() { + $this->assertNull(AdminHelpers::getPageFromURL(null)); + $this->assertSame('lines', AdminHelpers::getPageFromURL('lines?status=1')); + $this->assertNull(AdminHelpers::getPageFromURL('http://host')); + } + public function testProtocolDetectionFromServerVars() { $saved = $_SERVER;