diff --git a/src/Parser/DomainPart.php b/src/Parser/DomainPart.php index dbdcee4..2139395 100644 --- a/src/Parser/DomainPart.php +++ b/src/Parser/DomainPart.php @@ -15,17 +15,17 @@ use Egulias\EmailValidator\Result\Reason\ExpectingDomainLiteralClose; use Egulias\EmailValidator\Result\Result; use Egulias\EmailValidator\Result\ValidEmail; use Egulias\EmailValidator\Warning\DeprecatedComment; -use Egulias\EmailValidator\Warning\DomainLiteral; -use Egulias\EmailValidator\Warning\DomainTooLong; -use Egulias\EmailValidator\Warning\LabelTooLong; use Egulias\EmailValidator\Warning\TLD; use Egulias\EmailValidator\Parser\DomainLiteral as DomainLiteralParser; -use Egulias\EmailValidator\Result\Reason\CommaInDomain; use Egulias\EmailValidator\Result\Reason\CRLFAtTheEnd; +use Egulias\EmailValidator\Result\Reason\DomainTooLong; +use Egulias\EmailValidator\Result\Reason\LabelTooLong; class DomainPart extends Parser { - const DOMAIN_MAX_LENGTH = 254; + const DOMAIN_MAX_LENGTH = 253; + const LABEL_MAX_LENGTH = 63; + /** * @var string @@ -57,7 +57,8 @@ class DomainPart extends Parser } if ($length > self::DOMAIN_MAX_LENGTH) { - $this->warnings[DomainTooLong::CODE] = new DomainTooLong(); + //$this->warnings[DomainTooLong::CODE] = new DomainTooLong(); + return new InvalidEmail(new DomainTooLong(), $this->lexer->token['value']); } return new ValidEmail(); @@ -179,7 +180,10 @@ class DomainPart extends Parser return $literalResult; } - $this->checkLabelLength($prev); + $labelCheck = $this->checkLabelLength($prev); + if ($labelCheck->isInvalid()) { + return $labelCheck; + } $FwsResult = $this->parseFWS(); if($FwsResult->isInvalid()) { @@ -280,14 +284,16 @@ class DomainPart extends Parser return new ValidEmail(); } - protected function checkLabelLength(array $prev) : void + protected function checkLabelLength(array $prev) : Result { if ($this->lexer->token['type'] === EmailLexer::S_DOT && $prev['type'] === EmailLexer::GENERIC && - strlen($prev['value']) > 63 + strlen($prev['value']) > self::LABEL_MAX_LENGTH ) { - $this->warnings[LabelTooLong::CODE] = new LabelTooLong(); + //$this->warnings[LabelTooLong::CODE] = new LabelTooLong(); + return new InvalidEmail(new LabelTooLong(), $this->lexer->token['value']); } + return new ValidEmail(); } private function addTLDWarnings(bool $isTLDMissing) : void diff --git a/src/Result/Reason/DomainTooLong.php b/src/Result/Reason/DomainTooLong.php new file mode 100644 index 0000000..fa17213 --- /dev/null +++ b/src/Result/Reason/DomainTooLong.php @@ -0,0 +1,16 @@ +message = 'Domain is too long, exceeds 255 chars'; - $this->rfcNumber = 5322; - } -} diff --git a/src/Warning/LabelTooLong.php b/src/Warning/LabelTooLong.php deleted file mode 100644 index daf07f4..0000000 --- a/src/Warning/LabelTooLong.php +++ /dev/null @@ -1,14 +0,0 @@ -message = 'Label too long'; - $this->rfcNumber = 5322; - } -} diff --git a/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php b/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php index cfc6530..8e6eb2c 100644 --- a/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php +++ b/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php @@ -3,29 +3,23 @@ namespace Egulias\EmailValidator\Tests\EmailValidator\Validation; use PHPUnit\Framework\TestCase; +use Egulias\EmailValidator\Validation\RFCValidation; use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\Warning\TLD; use Egulias\EmailValidator\Warning\Comment; -use Egulias\EmailValidator\Warning\CFWSNearAt; -use Egulias\EmailValidator\Result\InvalidEmail; -use Egulias\EmailValidator\Warning\CFWSWithFWS; use Egulias\EmailValidator\Warning\IPV6BadChar; -use Egulias\EmailValidator\Result\Reason\CRNoLF; use Egulias\EmailValidator\Warning\IPV6ColonEnd; -use Egulias\EmailValidator\Warning\LabelTooLong; -use Egulias\EmailValidator\Warning\QuotedString; use Egulias\EmailValidator\Warning\DomainLiteral; -use Egulias\EmailValidator\Warning\DomainTooLong; use Egulias\EmailValidator\Warning\IPV6MaxGroups; use Egulias\EmailValidator\Warning\ObsoleteDTEXT; -use Egulias\EmailValidator\Result\Reason\DotAtEnd; use Egulias\EmailValidator\Warning\AddressLiteral; use Egulias\EmailValidator\Warning\IPV6ColonStart; use Egulias\EmailValidator\Warning\IPV6Deprecated; use Egulias\EmailValidator\Warning\IPV6GroupCount; use Egulias\EmailValidator\Warning\IPV6DoubleColon; +use Egulias\EmailValidator\Result\InvalidEmail; use Egulias\EmailValidator\Result\Reason\DotAtStart; -use Egulias\EmailValidator\Validation\RFCValidation; +use Egulias\EmailValidator\Result\Reason\DotAtEnd; use Egulias\EmailValidator\Result\Reason\NoDomainPart; use Egulias\EmailValidator\Result\Reason\ConsecutiveAt; use Egulias\EmailValidator\Result\Reason\ConsecutiveDot; @@ -33,6 +27,7 @@ use Egulias\EmailValidator\Result\Reason\DomainHyphened; use Egulias\EmailValidator\Result\Reason\ExpectingATEXT; use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT; use Egulias\EmailValidator\Result\Reason\UnOpenedComment; +use Egulias\EmailValidator\Result\Reason\CRNoLF; class RFCValidationDomainPartTest extends TestCase @@ -107,6 +102,7 @@ class RFCValidationDomainPartTest extends TestCase ['example@localhost\\'], ['example@localhost.'], ['username@ example . com'], + ['username@ example.com'], ['example@(fake].com'], ['example@(fake.com'], ['username@example,com'], @@ -130,6 +126,12 @@ class RFCValidationDomainPartTest extends TestCase ['test@example.com []'], ['test@example.com. []'], ['test@test. example.com'], + ['example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. + 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. + 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar'], + ['example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'], + ['example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.test.co.uk'], + ['example@test.toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'], ]; } @@ -184,7 +186,8 @@ class RFCValidationDomainPartTest extends TestCase public function getValidEmailsWithWarnings() { return [ - [[CFWSNearAt::CODE], 'example@ invalid.example.com'], + //Check if this is actually possible + //[[CFWSNearAt::CODE], 'example@ invalid.example.com'], [[Comment::CODE], 'example@invalid.example(examplecomment).com'], [[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'], [[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'], @@ -206,22 +209,6 @@ class RFCValidationDomainPartTest extends TestCase [AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]' ], - [ - [LabelTooLong::CODE,], - 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk' - ], - [ - [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], - 'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. - 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. - 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart' - ], - [ - [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], - 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. - 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. - 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar' - ], ]; }