mirror of
https://github.com/egulias/EmailValidator.git
synced 2026-08-20 01:50:33 +00:00
Separation of tests to prepare for strictier domain validation
This commit is contained in:
+31
-20
@@ -41,6 +41,9 @@ class DomainPart extends Parser
|
||||
return $domainChecks;
|
||||
}
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_AT) {
|
||||
return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']);
|
||||
}
|
||||
$domain = $this->doParseDomainPart();
|
||||
if ($domain->isInvalid()) {
|
||||
return $domain;
|
||||
@@ -139,6 +142,7 @@ class DomainPart extends Parser
|
||||
protected function doParseDomainPart() : Result
|
||||
{
|
||||
$tldMissing = true;
|
||||
$hasComments = false;
|
||||
$domain = '';
|
||||
do {
|
||||
$prev = $this->lexer->getPrevious();
|
||||
@@ -150,6 +154,7 @@ class DomainPart extends Parser
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS ||
|
||||
$this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
|
||||
$hasComments = true;
|
||||
$commentsResult = $this->parseComments();
|
||||
|
||||
//Invalid comment parsing
|
||||
@@ -162,17 +167,16 @@ class DomainPart extends Parser
|
||||
if ($dotsResult->isInvalid()) {
|
||||
return $dotsResult;
|
||||
}
|
||||
$exceptionsResult = $this->checkDomainPartExceptions($prev);
|
||||
if ($exceptionsResult->isInvalid()) {
|
||||
return $exceptionsResult;
|
||||
}
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) {
|
||||
$literalResult = $this->parseDomainLiteral();
|
||||
|
||||
$this->addTLDWarnings($tldMissing);
|
||||
//Invalid literal parsing
|
||||
if($literalResult->isInvalid()) {
|
||||
return $literalResult;
|
||||
}
|
||||
//if($literalResult->isInvalid()) {
|
||||
// return $literalResult;
|
||||
//}
|
||||
return $literalResult;
|
||||
}
|
||||
|
||||
$this->checkLabelLength($prev);
|
||||
@@ -188,10 +192,14 @@ class DomainPart extends Parser
|
||||
$tldMissing = false;
|
||||
}
|
||||
|
||||
$this->lexer->moveNext();
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_SP) {
|
||||
return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']);
|
||||
$exceptionsResult = $this->checkDomainPartExceptions($prev, $hasComments);
|
||||
if ($exceptionsResult->isInvalid()) {
|
||||
return $exceptionsResult;
|
||||
}
|
||||
$this->lexer->moveNext();
|
||||
//if ($this->lexer->token['type'] === EmailLexer::S_SP) {
|
||||
// return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']);
|
||||
//}
|
||||
|
||||
} while (null !== $this->lexer->token['type']);
|
||||
|
||||
@@ -231,7 +239,7 @@ class DomainPart extends Parser
|
||||
/**
|
||||
* @return InvalidEmail|ValidEmail
|
||||
*/
|
||||
protected function checkDomainPartExceptions(array $prev) : Result
|
||||
protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result
|
||||
{
|
||||
$invalidDomainTokens = array(
|
||||
EmailLexer::S_DQUOTE => true,
|
||||
@@ -241,16 +249,15 @@ class DomainPart extends Parser
|
||||
EmailLexer::S_LOWERTHAN => true,
|
||||
);
|
||||
|
||||
if (isset($invalidDomainTokens[$this->lexer->token['type']])) {
|
||||
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), $this->lexer->token['value']);
|
||||
}
|
||||
$validDomainTokens = array(
|
||||
EmailLexer::GENERIC => true,
|
||||
EmailLexer::S_HYPHEN => true,
|
||||
EmailLexer::S_DOT => true,
|
||||
);
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_COMMA) {
|
||||
return new InvalidEmail(new CommaInDomain(), $this->lexer->token['value']);
|
||||
}
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_AT) {
|
||||
return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']);
|
||||
if ($hasComments) {
|
||||
$validDomainTokens[EmailLexer::S_OPENPARENTHESIS] = true;
|
||||
$validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true;
|
||||
}
|
||||
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) {
|
||||
@@ -266,6 +273,10 @@ class DomainPart extends Parser
|
||||
return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), $this->lexer->token['value']);
|
||||
}
|
||||
|
||||
if (!isset($validDomainTokens[$this->lexer->token['type']])) {
|
||||
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']);
|
||||
}
|
||||
|
||||
return new ValidEmail();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
<?php
|
||||
|
||||
namespace Egulias\EmailValidator\Tests\EmailValidator\Validation;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
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\Reason\DotAtStart;
|
||||
use Egulias\EmailValidator\Validation\RFCValidation;
|
||||
use Egulias\EmailValidator\Result\Reason\NoDomainPart;
|
||||
use Egulias\EmailValidator\Result\Reason\ConsecutiveAt;
|
||||
use Egulias\EmailValidator\Result\Reason\ConsecutiveDot;
|
||||
use Egulias\EmailValidator\Result\Reason\DomainHyphened;
|
||||
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
|
||||
use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT;
|
||||
use Egulias\EmailValidator\Result\Reason\UnOpenedComment;
|
||||
|
||||
|
||||
class RFCValidationDomainPartTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var RFCValidation
|
||||
*/
|
||||
protected $validator;
|
||||
|
||||
/**
|
||||
* @var EmailLexer
|
||||
*/
|
||||
protected $lexer;
|
||||
|
||||
protected function setUp() : void
|
||||
{
|
||||
$this->validator = new RFCValidation();
|
||||
$this->lexer = new EmailLexer();
|
||||
}
|
||||
|
||||
protected function tearDown() : void
|
||||
{
|
||||
$this->validator = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getValidEmails
|
||||
*/
|
||||
public function testValidEmails($email)
|
||||
{
|
||||
$this->assertTrue($this->validator->isValid($email, $this->lexer));
|
||||
}
|
||||
|
||||
public function getValidEmails()
|
||||
{
|
||||
return array(
|
||||
['fabien@symfony.com'],
|
||||
['example@example.co.uk'],
|
||||
['example@localhost'],
|
||||
['example@faked(fake).co.uk'],
|
||||
['инфо@письмо.рф'],
|
||||
['müller@möller.de'],
|
||||
['test@email*'],
|
||||
['test@email!'],
|
||||
['test@email&'],
|
||||
['test@email^'],
|
||||
['test@email%'],
|
||||
['test@email$'],
|
||||
["1500111@профи-инвест.рф"],
|
||||
['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'],
|
||||
['validipv4@[127.0.0.0]'],
|
||||
['validipv4@127.0.0.0'],
|
||||
['withhyphen@domain-exam.com'],
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getInvalidEmails
|
||||
*/
|
||||
public function testInvalidEmails($email)
|
||||
{
|
||||
$this->assertFalse($this->validator->isValid($email, $this->lexer));
|
||||
}
|
||||
|
||||
public function getInvalidEmails()
|
||||
{
|
||||
return [
|
||||
['test@example.com test'],
|
||||
['example@example@example.co.uk'],
|
||||
['test_exampel@example.fr]'],
|
||||
['example@local\host'],
|
||||
['example@localhost\\'],
|
||||
['example@localhost.'],
|
||||
['username@ example . com'],
|
||||
['example@(fake].com'],
|
||||
['example@(fake.com'],
|
||||
['username@example,com'],
|
||||
['test@' . chr(226) . '.org'],
|
||||
['test@iana.org \r\n'],
|
||||
['test@iana.org \r\n '],
|
||||
['test@iana.org \r\n \r\n'],
|
||||
['test@iana.org \r\n\r\n'],
|
||||
['test@iana.org \r\n\r\n '],
|
||||
['test@iana/icann.org'],
|
||||
['test@foo;bar.com'],
|
||||
['test@example..com'],
|
||||
["test@examp'le.com"],
|
||||
['email.email@email."'],
|
||||
['test@email>'],
|
||||
['test@email<'],
|
||||
['test@email{'],
|
||||
['username@examp,le.com'],
|
||||
['test@ '],
|
||||
['invalidipv4@[127.\0.0.0]'],
|
||||
['test@example.com []'],
|
||||
['test@example.com. []'],
|
||||
['test@test. example.com'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getInvalidEmailsWithErrors
|
||||
*/
|
||||
public function testInvalidEmailsWithErrorsCheck($error, $email)
|
||||
{
|
||||
$this->assertFalse($this->validator->isValid($email, $this->lexer));
|
||||
$this->assertEquals($error, $this->validator->getError());
|
||||
}
|
||||
|
||||
public function getInvalidEmailsWithErrors()
|
||||
{
|
||||
return [
|
||||
[new InvalidEmail(new NoDomainPart(), ''), 'example@'],
|
||||
[new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"],
|
||||
[new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'],
|
||||
[new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'],
|
||||
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'],
|
||||
[new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'],
|
||||
[new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'],
|
||||
[new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'],
|
||||
[new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'],
|
||||
[new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"],
|
||||
[new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"],
|
||||
[new InvalidEmail(new CRNoLF(), "["), "example@[\r]"],
|
||||
[new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ,'), ','), 'example@exam,ple.com'],
|
||||
[new InvalidEmail(new ExpectingATEXT("Invalid token in domain: '"), "'"), "test@example.com'"],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getValidEmailsWithWarnings
|
||||
*/
|
||||
public function testValidEmailsWithWarningsCheck($expectedWarnings, $email)
|
||||
{
|
||||
$this->assertTrue($this->validator->isValid($email, $this->lexer));
|
||||
$warnings = $this->validator->getWarnings();
|
||||
$this->assertCount(
|
||||
count($expectedWarnings), $warnings,
|
||||
"Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings)
|
||||
);
|
||||
|
||||
foreach ($warnings as $warning) {
|
||||
$this->assertArrayHasKey($warning->code(), $expectedWarnings);
|
||||
}
|
||||
}
|
||||
|
||||
public function getValidEmailsWithWarnings()
|
||||
{
|
||||
return [
|
||||
[[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]'],
|
||||
[[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'],
|
||||
[[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'],
|
||||
[[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'],
|
||||
[[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"],
|
||||
[[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'],
|
||||
[[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'],
|
||||
[
|
||||
[IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE],
|
||||
'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
|
||||
],
|
||||
[
|
||||
[AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE],
|
||||
'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
|
||||
],
|
||||
[
|
||||
[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'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -8,35 +8,18 @@ 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\Warning\IPV6ColonEnd;
|
||||
use Egulias\EmailValidator\Warning\LabelTooLong;
|
||||
use Egulias\EmailValidator\Warning\LocalTooLong;
|
||||
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\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\Validation\RFCValidation;
|
||||
use Egulias\EmailValidator\Result\Reason\NoLocalPart;
|
||||
use Egulias\EmailValidator\Result\Reason\AtextAfterCFWS;
|
||||
use Egulias\EmailValidator\Result\Reason\CommaInDomain;
|
||||
use Egulias\EmailValidator\Result\Reason\ConsecutiveAt;
|
||||
use Egulias\EmailValidator\Result\Reason\UnOpenedComment;
|
||||
use Egulias\EmailValidator\Result\Reason\UnclosedQuotedString;
|
||||
use Egulias\EmailValidator\Result\Reason\CRNoLF;
|
||||
use Egulias\EmailValidator\Result\Reason\DotAtEnd;
|
||||
use Egulias\EmailValidator\Result\Reason\DotAtStart;
|
||||
use Egulias\EmailValidator\Result\Reason\NoDomainPart;
|
||||
use Egulias\EmailValidator\Result\Reason\ConsecutiveDot;
|
||||
use Egulias\EmailValidator\Result\Reason\DomainHyphened;
|
||||
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
|
||||
use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT;
|
||||
use Egulias\EmailValidator\Result\Reason\UnclosedComment;
|
||||
use Egulias\EmailValidator\Warning\TLD;
|
||||
|
||||
@@ -78,11 +61,9 @@ class RFCValidationTest extends TestCase
|
||||
['fabien@symfony.com'],
|
||||
['example@example.co.uk'],
|
||||
['fabien_potencier@example.fr'],
|
||||
['example@localhost'],
|
||||
['fab\'ien@symfony.com'],
|
||||
['fab\ ien@symfony.com'],
|
||||
['example((example))@fakedfake.co.uk'],
|
||||
['example@faked(fake).co.uk'],
|
||||
['fabien+@symfony.com'],
|
||||
['инфо@письмо.рф'],
|
||||
['"username"@example.com'],
|
||||
@@ -95,18 +76,7 @@ class RFCValidationTest extends TestCase
|
||||
['""@iana.org'],
|
||||
['"\""@iana.org'],
|
||||
['müller@möller.de'],
|
||||
['test@email*'],
|
||||
['test@email!'],
|
||||
['test@email&'],
|
||||
['test@email^'],
|
||||
['test@email%'],
|
||||
['test@email$'],
|
||||
["1500111@профи-инвест.рф"],
|
||||
['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'],
|
||||
['validipv4@[127.0.0.0]'],
|
||||
['validipv4@127.0.0.0'],
|
||||
['withhyphen@domain-exam.com'],
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@@ -123,7 +93,14 @@ class RFCValidationTest extends TestCase
|
||||
{
|
||||
return [
|
||||
['a5aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com', [new LocalTooLong()]],
|
||||
['example@example', [new TLD()]]
|
||||
['example@example', [new TLD()]],
|
||||
['example @invalid.example.com', [new CFWSNearAt()]],
|
||||
['example(examplecomment)@invalid.example.com',[new Comment(), new CFWSNearAt()]],
|
||||
["\"\t\"@invalid.example.com", [new QuotedString("", '"'), new CFWSWithFWS(),]],
|
||||
["\"\r\"@invalid.example.com", [new QuotedString('', '"'), new CFWSWithFWS(),]],
|
||||
['"example"@invalid.example.com', [new QuotedString('', '"')]],
|
||||
['too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com',
|
||||
[new LocalTooLong()]],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -144,23 +121,15 @@ class RFCValidationTest extends TestCase
|
||||
public function getInvalidEmails()
|
||||
{
|
||||
return [
|
||||
['test@example.com test'],
|
||||
['user name@example.com'],
|
||||
['user name@example.com'],
|
||||
['example.@example.co.uk'],
|
||||
['example@example@example.co.uk'],
|
||||
['(test_exampel@example.fr]'],
|
||||
['(test_exampel@example.fr'],
|
||||
['example(example]example@example.co.uk'],
|
||||
['.example@localhost'],
|
||||
['ex\ample@localhost'],
|
||||
['example@local\host'],
|
||||
['example@localhost\\'],
|
||||
['example@localhost.'],
|
||||
['user name@example.com'],
|
||||
['username@ example . com'],
|
||||
['example@(fake].com'],
|
||||
['example@(fake.com'],
|
||||
['username@example,com'],
|
||||
['usern,ame@example.com'],
|
||||
['user[na]me@example.com'],
|
||||
['"""@iana.org'],
|
||||
@@ -172,32 +141,12 @@ class RFCValidationTest extends TestCase
|
||||
['"test"' . chr(0) . '@iana.org'],
|
||||
['"test\"@iana.org'],
|
||||
[chr(226) . '@iana.org'],
|
||||
['test@' . chr(226) . '.org'],
|
||||
['\r\ntest@iana.org'],
|
||||
['\r\n test@iana.org'],
|
||||
['\r\n \r\ntest@iana.org'],
|
||||
['\r\n \r\ntest@iana.org'],
|
||||
['\r\n \r\n test@iana.org'],
|
||||
['test@iana.org \r\n'],
|
||||
['test@iana.org \r\n '],
|
||||
['test@iana.org \r\n \r\n'],
|
||||
['test@iana.org \r\n\r\n'],
|
||||
['test@iana.org \r\n\r\n '],
|
||||
['test@iana/icann.org'],
|
||||
['test@foo;bar.com'],
|
||||
['test;123@foobar.com'],
|
||||
['test@example..com'],
|
||||
["test@examp'le.com"],
|
||||
['email.email@email."'],
|
||||
['test@email>'],
|
||||
['test@email<'],
|
||||
['test@email{'],
|
||||
['username@examp,le.com'],
|
||||
['test@ '],
|
||||
['validipv4@[127.\0.0.0]'],
|
||||
['test@example.com []'],
|
||||
['test@example.com. []'],
|
||||
['test@test. example.com'],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -214,17 +163,9 @@ class RFCValidationTest extends TestCase
|
||||
{
|
||||
return [
|
||||
[new InvalidEmail(new NoLocalPart(), "@"), '@example.co.uk'],
|
||||
[new InvalidEmail(new NoDomainPart(), ''), 'example@'],
|
||||
[new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"],
|
||||
[new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'],
|
||||
[new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'],
|
||||
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example..example@example.co.uk'],
|
||||
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'],
|
||||
[new InvalidEmail(new ExpectingATEXT('Invalid token found'), '<'), '<example_example>@example.fr'],
|
||||
[new InvalidEmail(new DotAtStart(), '.'), '.example@localhost'],
|
||||
[new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'],
|
||||
[new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'],
|
||||
[new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'],
|
||||
[new InvalidEmail(new DotAtEnd(), '.'), 'example.@example.co.uk'],
|
||||
[new InvalidEmail(new UnclosedComment(), '('), '(example@localhost'],
|
||||
[new InvalidEmail(new UnclosedQuotedString(), '"'), '"example@localhost'],
|
||||
@@ -236,93 +177,9 @@ class RFCValidationTest extends TestCase
|
||||
],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'comment)example@localhost'],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'example(comment))@localhost'],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'],
|
||||
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'],
|
||||
[new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'],
|
||||
//This was the original. But atext is not allowed after \n
|
||||
//array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\ne@example.co.uk"),
|
||||
[new InvalidEmail(new AtextAfterCFWS(), "\n"), "exampl\ne@example.co.uk"],
|
||||
[new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"],
|
||||
[new InvalidEmail(new AtextAfterCFWS(), "\t"), "exampl\te@example.co.uk"],
|
||||
[new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"],
|
||||
[new InvalidEmail(new CRNoLF(), "["), "example@[\r]"],
|
||||
[new InvalidEmail(new CRNoLF(), "\r"), "exam\rple@example.co.uk"],
|
||||
[new InvalidEmail(new CommaInDomain(), ','), 'example@exam,ple.com'],
|
||||
[new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), "'"), "test@example.com'"],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getInvalidEmailsWithWarnings
|
||||
*/
|
||||
public function testInvalidEmailsWithWarningsCheck($expectedWarnings, $email)
|
||||
{
|
||||
$this->assertTrue($this->validator->isValid($email, $this->lexer));
|
||||
$warnings = $this->validator->getWarnings();
|
||||
$this->assertCount(
|
||||
count($expectedWarnings), $warnings,
|
||||
"Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings)
|
||||
);
|
||||
|
||||
foreach ($warnings as $warning) {
|
||||
$this->assertArrayHasKey($warning->code(), $expectedWarnings);
|
||||
}
|
||||
}
|
||||
|
||||
public function getInvalidEmailsWithWarnings()
|
||||
{
|
||||
return [
|
||||
[[CFWSNearAt::CODE], 'example @invalid.example.com'],
|
||||
[[CFWSNearAt::CODE], 'example@ invalid.example.com'],
|
||||
[[Comment::CODE], 'example@invalid.example(examplecomment).com'],
|
||||
[[Comment::CODE,CFWSNearAt::CODE], 'example(examplecomment)@invalid.example.com'],
|
||||
[[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\t\"@invalid.example.com"],
|
||||
[[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\r\"@invalid.example.com"],
|
||||
[[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'],
|
||||
[[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'],
|
||||
[[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'],
|
||||
[[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'],
|
||||
[[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'],
|
||||
[[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"],
|
||||
[[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'],
|
||||
[[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'],
|
||||
[
|
||||
[IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE],
|
||||
'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
|
||||
],
|
||||
[
|
||||
[AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE],
|
||||
'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
|
||||
],
|
||||
[
|
||||
[AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE],
|
||||
'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]'
|
||||
],
|
||||
[[QuotedString::CODE,], '"example"@invalid.example.com'],
|
||||
[
|
||||
[LocalTooLong::CODE,],
|
||||
'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com'
|
||||
],
|
||||
[
|
||||
[LocalTooLong::CODE],
|
||||
'too_long_localpart_too_long_localpart_123_too_long_localpart_too_long_localpart@example.com'
|
||||
],
|
||||
[
|
||||
[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'
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user