diff --git a/src/Illuminate/Validation/Concerns/FilterEmailValidation.php b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php index 88ca1546c5ee..83fa326974ed 100644 --- a/src/Illuminate/Validation/Concerns/FilterEmailValidation.php +++ b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php @@ -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. * @@ -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; } /** diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index d30d7b5d2ad4..75bc067401d2 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -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() diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index f5426a3e74b7..f696d8f166bd 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -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' => 'example@example.com'], ['x' => 'email:filter']); + $this->assertTrue($v->passes()); + + // Unicode characters are not allowed + $v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exämple@example.com'], ['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' => 'example@example.com'], ['x' => 'email:filter_unicode']); + $this->assertTrue($v->passes()); + + // Any unicode characters are allowed only in local-part + $v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'exämple@example.com'], ['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()); } /**