Skip to content

Commit

Permalink
Support for FILTER_FLAG_EMAIL_UNICODE via "email:filter_unicode"
Browse files Browse the repository at this point in the history
  • Loading branch information
mpyw committed May 7, 2020
1 parent 25730a8 commit 1a9d6a7
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
27 changes: 26 additions & 1 deletion src/Illuminate/Validation/Concerns/FilterEmailValidation.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,31 @@

class FilterEmailValidation implements EmailValidation
{
/**
* @var int
*/
protected $flags;

/**
* Create a new instance which allows any unicode characters in local-part.
*
* @return static
*/
public static function unicode()
{
return new static(FILTER_FLAG_EMAIL_UNICODE);
}

/**
* FilterEmailValidation constructor.
*
* @param int $flags
*/
public function __construct($flags = 0)
{
$this->flags = $flags;
}

/**
* Returns true if the given email is valid.
*
Expand All @@ -16,7 +41,7 @@ class FilterEmailValidation implements EmailValidation
*/
public function isValid($email, EmailLexer $emailLexer)
{
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
return filter_var($email, FILTER_VALIDATE_EMAIL, $this->flags) !== false;
}

/**
Expand Down
2 changes: 2 additions & 0 deletions src/Illuminate/Validation/Concerns/ValidatesAttributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,8 @@ public function validateEmail($attribute, $value, $parameters)
return new SpoofCheckValidation();
} elseif ($validation === 'filter') {
return new FilterEmailValidation();
} elseif ($validation === 'filter_unicode') {
return FilterEmailValidation::unicode();
}
})
->values()
Expand Down
26 changes: 26 additions & 0 deletions tests/Validation/ValidationValidatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2353,6 +2353,32 @@ public function testValidateEmailWithFilterCheck()
{
$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'foo@bar'], ['x' => 'email:filter']);
$this->assertFalse($v->passes());

$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => '[email protected]'], ['x' => 'email:filter']);
$this->assertTrue($v->passes());

// Unicode characters are not allowed
$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exä[email protected]'], ['x' => 'email:filter']);
$this->assertFalse($v->passes());

$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exämple@exämple.com'], ['x' => 'email:filter']);
$this->assertFalse($v->passes());
}

public function testValidateEmailWithFilterUnicodeCheck()
{
$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'foo@bar'], ['x' => 'email:filter_unicode']);
$this->assertFalse($v->passes());

$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => '[email protected]'], ['x' => 'email:filter_unicode']);
$this->assertTrue($v->passes());

// Any unicode characters are allowed only in local-part
$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exä[email protected]'], ['x' => 'email:filter_unicode']);
$this->assertTrue($v->passes());

$v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exämple@exämple.com'], ['x' => 'email:filter_unicode']);
$this->assertFalse($v->passes());
}

/**
Expand Down

0 comments on commit 1a9d6a7

Please sign in to comment.