Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

#1581 - Strict in Email constraint and use of Egulias\EmailValidator

  • Loading branch information...
commit 3368630482c0f5f5c0ebaf08e64347ae68e3e733 1 parent e0de958
Eduardo Gulias Davis egulias authored fabpot committed
28 UPGRADE-2.5.md
View
@@ -44,3 +44,31 @@ Form
public function getErrors($deep = false, $flatten = true)
{
```
+
+Validator
+---------
+
+ * EmailValidator has changed to allow `non-strict` and `strict` email validation
+
+ Before:
+
+ Email validation was done with php's `filter_var()`
+
+ After:
+
+ Default email validation is now done via a simple regex which may cause invalid emails (not RFC compilant) to be
+ valid. This is the default behaviour.
+
+ Strict email validation has to be explicitly activated in the configuration file by adding
+ ```
+ framework_bundle:
+ //...
+ validation:
+ strict_email: true
+ //...
+
+ ```
+ Also you have to add to your composer.json:
+ ```
+ "egulias/email-validator": "1.1.*"
+ ```
3  composer.json
View
@@ -73,7 +73,8 @@
"monolog/monolog": "~1.3",
"propel/propel1": "1.6.*",
"ircmaxell/password-compat": "1.0.*",
- "ocramius/proxy-manager": ">=0.3.1,<0.6-dev"
+ "ocramius/proxy-manager": ">=0.3.1,<0.6-dev",
+ "egulias/email-validator": "1.1.0"
},
"autoload": {
"psr-0": { "Symfony\\": "src/" },
1  src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
View
@@ -445,6 +445,7 @@ private function addValidationSection(ArrayNodeDefinition $rootNode)
->scalarNode('cache')->end()
->booleanNode('enable_annotations')->defaultFalse()->end()
->scalarNode('translation_domain')->defaultValue('validators')->end()
+ ->booleanNode('strict_email')->defaultFalse()->end()
->end()
->end()
->end()
3  src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
View
@@ -678,6 +678,9 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
$container->setParameter('validator.mapping.loader.xml_files_loader.mapping_files', $this->getValidatorXmlMappingFiles($container));
$container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $this->getValidatorYamlMappingFiles($container));
+ $definition = $container->findDefinition('validator.email');
+ $definition->replaceArgument(0, $config['strict_email']);
+
if (array_key_exists('enable_annotations', $config) && $config['enable_annotations']) {
$loaderChain = $container->getDefinition('validator.mapping.loader.loader_chain');
$arguments = $loaderChain->getArguments();
6 src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.xml
View
@@ -18,6 +18,7 @@
<parameter key="validator.mapping.loader.xml_files_loader.mapping_files" type="collection" />
<parameter key="validator.mapping.loader.yaml_files_loader.mapping_files" type="collection" />
<parameter key="validator.expression.class">Symfony\Component\Validator\Constraints\ExpressionValidator</parameter>
+ <parameter key="validator.email.class">Symfony\Component\Validator\Constraints\EmailValidator</parameter>
</parameters>
<services>
@@ -69,5 +70,10 @@
<argument type="service" id="property_accessor" />
<tag name="validator.constraint_validator" alias="validator.expression" />
</service>
+
+ <service id="validator.email" class="%validator.email.class%">
+ <argument></argument>
+ <tag name="validator.constraint_validator" alias="validator.email" />
+ </service>
</services>
</container>
1  src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
View
@@ -127,6 +127,7 @@ protected static function getBundleDefaultConfig()
'enabled' => false,
'enable_annotations' => false,
'translation_domain' => 'validators',
+ 'strict_email' => false,
),
'annotations' => array(
'cache' => 'file',
9 src/Symfony/Component/Validator/Constraints/Email.php
View
@@ -25,4 +25,13 @@ class Email extends Constraint
public $message = 'This value is not a valid email address.';
public $checkMX = false;
public $checkHost = false;
+ public $strict = null;
+
+ /**
+ * {@inheritDoc}
+ */
+ public function validatedBy()
+ {
+ return 'validator.email';
+ }
}
28 src/Symfony/Component/Validator/Constraints/EmailValidator.php
View
@@ -14,6 +14,7 @@
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+use Egulias\EmailValidator\EmailValidator as StrictEmailValidator;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
@@ -23,6 +24,18 @@
class EmailValidator extends ConstraintValidator
{
/**
+ * isStrict
+ *
+ * @var Boolean
+ */
+ private $isStrict;
+
+ public function __construct($strict = false)
+ {
+ $this->isStrict = $strict;
+ }
+
+ /**
* {@inheritDoc}
*/
public function validate($value, Constraint $constraint)
@@ -40,12 +53,23 @@ public function validate($value, Constraint $constraint)
}
$value = (string) $value;
- $valid = filter_var($value, FILTER_VALIDATE_EMAIL);
+ if (null === $constraint->strict) {
+ $constraint->strict = $this->isStrict;
+ }
+
+ if ($constraint->strict && class_exists('\Egulias\EmailValidator\EmailValidator')) {
+ $strictValidator = new StrictEmailValidator();
+ $valid = $strictValidator->isValid($value, false);
+ } elseif ($constraint->strict === true) {
+ throw new \RuntimeException('Strict email validation requires egulias/email-validator');
+ } else {
+ $valid = preg_match('/.+\@.+\..+/', $value);
+ }
if ($valid) {
$host = substr($value, strpos($value, '@') + 1);
-
// Check for host DNS resource records
+
if ($valid && $constraint->checkMX) {
$valid = $this->checkMX($host);
} elseif ($valid && $constraint->checkHost) {
11 src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php
View
@@ -22,7 +22,7 @@ class EmailValidatorTest extends \PHPUnit_Framework_TestCase
protected function setUp()
{
$this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
- $this->validator = new EmailValidator();
+ $this->validator = new EmailValidator(false);
$this->validator->initialize($this->context);
}
@@ -100,7 +100,14 @@ public function getInvalidEmails()
array('example'),
array('example@'),
array('example@localhost'),
- array('example@example.com@example.com'),
);
}
+
+ public function testStrict()
+ {
+ $this->context->expects($this->never())
+ ->method('addViolation');
+
+ $this->validator->validate('example@localhost', new Email(array('strict' => true)));
+ }
}
6 src/Symfony/Component/Validator/composer.json
View
@@ -26,7 +26,8 @@
"symfony/yaml": "~2.0",
"symfony/config": "~2.2",
"doctrine/annotations": "~1.0",
- "doctrine/cache": "~1.0"
+ "doctrine/cache": "~1.0",
+ "egulias/email-validator": "~1.0"
},
"suggest": {
"doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
@@ -34,7 +35,8 @@
"symfony/http-foundation": "",
"symfony/intl": "",
"symfony/yaml": "",
- "symfony/config": ""
+ "symfony/config": "",
+ "egulias/email-validator": "Strict (RFC compliant) email validation"
},
"autoload": {
"psr-0": { "Symfony\\Component\\Validator\\": "" }
Please sign in to comment.
Something went wrong with that request. Please try again.