. * */ namespace Ampache\Config; use PHPUnit\Framework\TestCase; class CheckHttpRefererTest extends TestCase { public function testAcceptsAMatchingNonStandardPort(): void { self::assertTrue($this->check('https://ampache.example.com:8443', 'https://ampache.example.com:8443/albums.php')); } public function testAcceptsAnExactOriginMatch(): void { self::assertTrue($this->check('https://ampache.example.com', 'https://ampache.example.com/albums.php')); } public function testAllowsAMissingRefererAndWebPathAsTheCliTestsCase(): void { self::assertTrue($this->check('', null)); } public function testRejectsAMismatchedPort(): void { self::assertFalse($this->check('https://ampache.example.com', 'https://ampache.example.com:8443/')); } public function testRejectsAMismatchedScheme(): void { self::assertFalse($this->check('https://ampache.example.com', 'http://ampache.example.com/')); } public function testRejectsAMissingRefererWhenWebPathIsConfigured(): void { self::assertFalse($this->check('https://ampache.example.com', null)); } public function testRejectsAnOriginEmbeddedAsASubdomainPrefix(): void { self::assertFalse($this->check( 'https://ampache.example.com', 'https://ampache.example.com.attacker.example/' )); } public function testRejectsAnOriginEmbeddedInAQueryParameter(): void { self::assertFalse($this->check( 'https://ampache.example.com', 'http://attacker.example/click?next=https://ampache.example.com' )); } protected function tearDown(): void { unset($_SERVER['HTTP_REFERER']); AmpConfig::set('web_path', '', true); } private function check(string $webPath, ?string $referer): bool { AmpConfig::set('web_path', $webPath, true); if ($referer === null) { unset($_SERVER['HTTP_REFERER']); } else { $_SERVER['HTTP_REFERER'] = $referer; } return check_http_referer(); } }