getEnv('cors_regex', 'ALLOWED_FRONTEND_HOSTS', fn () => $hosts); } /** رجکس ساخته‌شده با delimiter نلمیو (`#`) کامپایل و روی origin تست می‌شود. */ private function originMatches(string $regex, string $origin): bool { return (bool) preg_match('#' . $regex . '#i', $origin); } public function testAllowsListedHostsHttpsAndSubdomains(): void { $regex = $this->regexFor('yasuj-nobat.ir,nobat724.com'); $this->assertTrue($this->originMatches($regex, 'https://yasuj-nobat.ir')); $this->assertTrue($this->originMatches($regex, 'https://www.nobat724.com')); } public function testAllowsHttpAndPortForLocalDev(): void { $regex = $this->regexFor('localhost,yazd-nobat.localhost'); $this->assertTrue($this->originMatches($regex, 'http://yazd-nobat.localhost:3000')); $this->assertTrue($this->originMatches($regex, 'http://localhost:8080')); } public function testRejectsUnlistedAndLookalikeHosts(): void { $regex = $this->regexFor('yasuj-nobat.ir'); $this->assertFalse($this->originMatches($regex, 'https://evil.com')); // انکورِ انتها: دامنه‌ای که با هاست مجاز شروع/تمام نشود نباید مچ شود. $this->assertFalse($this->originMatches($regex, 'https://yasuj-nobat.ir.evil.com')); $this->assertFalse($this->originMatches($regex, 'https://notyasuj-nobat.ir')); } public function testDotIsEscapedNotWildcard(): void { $regex = $this->regexFor('nobat724.com'); // نقطه نباید به‌عنوان wildcard عمل کند. $this->assertFalse($this->originMatches($regex, 'https://nobat724xcom')); } public function testEmptyListMatchesNothing(): void { $regex = $this->regexFor(''); $this->assertFalse($this->originMatches($regex, 'https://yasuj-nobat.ir')); $this->assertFalse($this->originMatches($regex, 'https://anything.com')); } public function testProvidedType(): void { $this->assertSame(['cors_regex' => 'string'], CorsRegexEnvProcessor::getProvidedTypes()); } }