From 741bd5e2556ff30e9c3da6ed880a5d154302b15b Mon Sep 17 00:00:00 2001 From: Suven-p Date: Wed, 12 Apr 2023 09:58:57 +0545 Subject: [PATCH 1/3] Add support for wildcard and exception --- src/Domains/Domain.php | 43 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Domains/Domain.php b/src/Domains/Domain.php index e503508..3f7d088 100644 --- a/src/Domains/Domain.php +++ b/src/Domains/Domain.php @@ -46,6 +46,13 @@ class Domain */ protected $sub = ''; + /** + * PSL rule matching suffix + * + * @var string + */ + protected $rule = ''; + /** * Domain Parts * @@ -105,11 +112,29 @@ public function getSuffix(): string return $this->suffix; } - for ($i = 3; $i > 0; $i--) { - $joined = \implode('.', \array_slice($this->parts, $i * -1)); + for ($i = 0; $i < count($this->parts); $i++) { + $joined = \implode('.', \array_slice($this->parts, $i)); + $next = \implode('.', \array_slice($this->parts, $i + 1)); + $exception = '!'.$joined; + $wildcard = '*.'.$next; + + if (\array_key_exists($exception, self::$list)) { + $this->suffix = $next; + $this->rule = $exception; + + return $next; + } if (\array_key_exists($joined, self::$list)) { $this->suffix = $joined; + $this->rule = $joined; + + return $joined; + } + + if (\array_key_exists($wildcard, self::$list)) { + $this->suffix = $joined; + $this->rule = $wildcard; return $joined; } @@ -118,6 +143,14 @@ public function getSuffix(): string return ''; } + public function getRule(): string + { + if (! $this->rule) { + $this->getSuffix(); + } + return $this->rule; + } + /** * Returns registerable domain name */ @@ -176,7 +209,7 @@ public function getSub(): string */ public function isKnown(): bool { - if (\array_key_exists($this->getSuffix(), self::$list)) { + if (\array_key_exists($this->getRule(), self::$list)) { return true; } @@ -188,7 +221,7 @@ public function isKnown(): bool */ public function isICANN(): bool { - if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'ICANN') { + if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'ICANN') { return true; } @@ -200,7 +233,7 @@ public function isICANN(): bool */ public function isPrivate(): bool { - if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'PRIVATE') { + if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'PRIVATE') { return true; } From 4723ec0248632c4405d9af138e1d063682c1551c Mon Sep 17 00:00:00 2001 From: Suven-p Date: Wed, 19 Apr 2023 20:23:01 +0545 Subject: [PATCH 2/3] Add tests for wildcard and exception rules --- tests/DomainTest.php | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 9cebcfb..c773985 100755 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -211,4 +211,68 @@ public function testHTTPSException2(): void new Domain('https://facbook.com'); } + + public function testExampleExampleCk(): void + { + $domain = new Domain('example.example.ck'); + + $this->assertEquals('example.example.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('example.ck', $domain->getSuffix()); + $this->assertEquals('example.example.ck', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testSubSubExampleExampleCk(): void + { + $domain = new Domain('subsub.demo.example.example.ck'); + + $this->assertEquals('subsub.demo.example.example.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('example.ck', $domain->getSuffix()); + $this->assertEquals('example.example.ck', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('subsub.demo', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWwwCk(): void + { + $domain = new Domain('www.ck'); + + $this->assertEquals('www.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('ck', $domain->getSuffix()); + $this->assertEquals('www.ck', $domain->getRegisterable()); + $this->assertEquals('www', $domain->getName()); + $this->assertEquals('', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testSubSubWwwCk(): void + { + $domain = new Domain('subsub.demo.www.ck'); + + $this->assertEquals('subsub.demo.www.ck', $domain->get()); + $this->assertEquals('ck', $domain->getTLD()); + $this->assertEquals('ck', $domain->getSuffix()); + $this->assertEquals('www.ck', $domain->getRegisterable()); + $this->assertEquals('www', $domain->getName()); + $this->assertEquals('subsub.demo', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } } From 32d8d7d68c947fa6c035a879b429d605b9834796 Mon Sep 17 00:00:00 2001 From: Suven-p Date: Wed, 19 Jul 2023 22:00:05 +0545 Subject: [PATCH 3/3] Add requested additional tests --- tests/DomainTest.php | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/tests/DomainTest.php b/tests/DomainTest.php index c773985..28e3f59 100755 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -275,4 +275,84 @@ public function testSubSubWwwCk(): void $this->assertEquals(false, $domain->isPrivate()); $this->assertEquals(false, $domain->isTest()); } + + public function testWildcardNomBr(): void + { + $domain = new Domain('sub.example.com.nom.br'); + + $this->assertEquals('sub.example.com.nom.br', $domain->get()); + $this->assertEquals('br', $domain->getTLD()); + $this->assertEquals('com.nom.br', $domain->getSuffix()); + $this->assertEquals('example.com.nom.br', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWildcardKawasakiJp(): void + { + $domain = new Domain('sub.example.com.kawasaki.jp'); + + $this->assertEquals('sub.example.com.kawasaki.jp', $domain->get()); + $this->assertEquals('jp', $domain->getTLD()); + $this->assertEquals('com.kawasaki.jp', $domain->getSuffix()); + $this->assertEquals('example.com.kawasaki.jp', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testExceptionKawasakiJp(): void + { + $domain = new Domain('sub.city.kawasaki.jp'); + + $this->assertEquals('sub.city.kawasaki.jp', $domain->get()); + $this->assertEquals('jp', $domain->getTLD()); + $this->assertEquals('kawasaki.jp', $domain->getSuffix()); + $this->assertEquals('city.kawasaki.jp', $domain->getRegisterable()); + $this->assertEquals('city', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(true, $domain->isICANN()); + $this->assertEquals(false, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testWildcardPrivateDomain(): void + { + $domain = new Domain('sub.example.com.dev.adobeaemcloud.com'); + + $this->assertEquals('sub.example.com.dev.adobeaemcloud.com', $domain->get()); + $this->assertEquals('com', $domain->getTLD()); + $this->assertEquals('com.dev.adobeaemcloud.com', $domain->getSuffix()); + $this->assertEquals('example.com.dev.adobeaemcloud.com', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(false, $domain->isICANN()); + $this->assertEquals(true, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } + + public function testPrivateDomain(): void + { + $domain = new Domain('sub.example.adobeaemcloud.net'); + + $this->assertEquals('sub.example.adobeaemcloud.net', $domain->get()); + $this->assertEquals('net', $domain->getTLD()); + $this->assertEquals('adobeaemcloud.net', $domain->getSuffix()); + $this->assertEquals('example.adobeaemcloud.net', $domain->getRegisterable()); + $this->assertEquals('example', $domain->getName()); + $this->assertEquals('sub', $domain->getSub()); + $this->assertEquals(true, $domain->isKnown()); + $this->assertEquals(false, $domain->isICANN()); + $this->assertEquals(true, $domain->isPrivate()); + $this->assertEquals(false, $domain->isTest()); + } }