diff --git a/src/Domains/Validator/PublicDomain.php b/src/Domains/Validator/PublicDomain.php index 3bd96d3..c4c18d0 100644 --- a/src/Domains/Validator/PublicDomain.php +++ b/src/Domains/Validator/PublicDomain.php @@ -12,6 +12,10 @@ */ class PublicDomain extends Validator { + /** + * @var array + */ + protected static $allowedDomains = []; /** * Get Description * @@ -27,7 +31,7 @@ public function getDescription(): string /** * Is valid * - * Validation will pass when $value is a public domain + * Validation will pass when $value is either a known domain or in the list of allowed domains * * @param mixed $value * @return bool @@ -40,11 +44,8 @@ public function isValid($value): bool } $domain = new Domain($value); - if (!$domain->isKnown()) { - return false; - } - return true; + return $domain->isKnown() || in_array($domain->get(), self::$allowedDomains); } /** @@ -70,4 +71,16 @@ public function getType(): string { return self::TYPE_STRING; } + + /** + * Allow domains + * + * Add domains to the allowed domains array + * + * @param array $domains + */ + public static function allow(array $domains): void + { + self::$allowedDomains = array_merge(self::$allowedDomains, $domains); + } } diff --git a/tests/Validator/PublicDomainTest.php b/tests/Validator/PublicDomainTest.php index 9088c6c..20f5e2a 100644 --- a/tests/Validator/PublicDomainTest.php +++ b/tests/Validator/PublicDomainTest.php @@ -21,15 +21,20 @@ public function tearDown(): void public function testIsValid(): void { $this->assertEquals('Value must be a public domain', $this->domain->getDescription()); + // Known public domains $this->assertEquals(true, $this->domain->isValid('example.com')); $this->assertEquals(true, $this->domain->isValid('google.com')); $this->assertEquals(true, $this->domain->isValid('bbc.co.uk')); $this->assertEquals(true, $this->domain->isValid('appwrite.io')); $this->assertEquals(true, $this->domain->isValid('usa.gov')); $this->assertEquals(true, $this->domain->isValid('stanford.edu')); + + // URLs $this->assertEquals(true, $this->domain->isValid('http://google.com')); $this->assertEquals(true, $this->domain->isValid('http://www.google.com')); $this->assertEquals(true, $this->domain->isValid('https://example.com')); + + // Private domains $this->assertEquals(false, $this->domain->isValid('localhost')); $this->assertEquals(false, $this->domain->isValid('http://localhost')); $this->assertEquals(false, $this->domain->isValid('sub.demo.localhost')); @@ -39,4 +44,22 @@ public function testIsValid(): void $this->assertEquals(false, $this->domain->isValid('wiki.team.local')); $this->assertEquals(false, $this->domain->isValid('example.test')); } + + public function testAllowDomains(): void + { + // Adding localhost to allowed domains + PublicDomain::allow(['localhost']); + + // Now localhost should be valid + $this->assertEquals(true, $this->domain->isValid('localhost')); + $this->assertEquals(true, $this->domain->isValid('http://localhost')); + $this->assertEquals(false, $this->domain->isValid('test.app.internal')); + + // Adding more domains to allowed domains + PublicDomain::allow(['test.app.internal', 'home.local']); + + // Now these domains should be valid + $this->assertEquals(true, $this->domain->isValid('test.app.internal')); + $this->assertEquals(true, $this->domain->isValid('home.local')); + } }