Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / validator / Constraints / DateTimeValidator.php
index 29864b49c0aea8fe889386d2211dce1dc9d89b20..af956ee06b583fae9e8f466d9ece8881768babe4 100644 (file)
 
 namespace Symfony\Component\Validator\Constraints;
 
-use Symfony\Component\Validator\Context\ExecutionContextInterface;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 
 /**
  * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Diego Saint Esteben <diego@saintesteben.me>
  */
 class DateTimeValidator extends DateValidator
 {
+    /**
+     * @deprecated since version 3.1, to be removed in 4.0.
+     */
     const PATTERN = '/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/';
 
     /**
@@ -31,7 +34,7 @@ class DateTimeValidator extends DateValidator
             throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\DateTime');
         }
 
-        if (null === $value || '' === $value || $value instanceof \DateTime) {
+        if (null === $value || '' === $value || $value instanceof \DateTimeInterface) {
             return;
         }
 
@@ -41,46 +44,34 @@ class DateTimeValidator extends DateValidator
 
         $value = (string) $value;
 
-        if (!preg_match(static::PATTERN, $value, $matches)) {
-            if ($this->context instanceof ExecutionContextInterface) {
-                $this->context->buildViolation($constraint->message)
-                    ->setParameter('{{ value }}', $this->formatValue($value))
-                    ->setCode(DateTime::INVALID_FORMAT_ERROR)
-                    ->addViolation();
-            } else {
-                $this->buildViolation($constraint->message)
-                    ->setParameter('{{ value }}', $this->formatValue($value))
-                    ->setCode(DateTime::INVALID_FORMAT_ERROR)
-                    ->addViolation();
-            }
+        \DateTime::createFromFormat($constraint->format, $value);
+
+        $errors = \DateTime::getLastErrors();
+
+        if (0 < $errors['error_count']) {
+            $this->context->buildViolation($constraint->message)
+                ->setParameter('{{ value }}', $this->formatValue($value))
+                ->setCode(DateTime::INVALID_FORMAT_ERROR)
+                ->addViolation();
 
             return;
         }
 
-        if (!DateValidator::checkDate($matches[1], $matches[2], $matches[3])) {
-            if ($this->context instanceof ExecutionContextInterface) {
+        foreach ($errors['warnings'] as $warning) {
+            if ('The parsed date was invalid' === $warning) {
                 $this->context->buildViolation($constraint->message)
                     ->setParameter('{{ value }}', $this->formatValue($value))
                     ->setCode(DateTime::INVALID_DATE_ERROR)
                     ->addViolation();
-            } else {
-                $this->buildViolation($constraint->message)
-                    ->setParameter('{{ value }}', $this->formatValue($value))
-                    ->setCode(DateTime::INVALID_DATE_ERROR)
-                    ->addViolation();
-            }
-        }
-
-        if (!TimeValidator::checkTime($matches[4], $matches[5], $matches[6])) {
-            if ($this->context instanceof ExecutionContextInterface) {
+            } elseif ('The parsed time was invalid' === $warning) {
                 $this->context->buildViolation($constraint->message)
                     ->setParameter('{{ value }}', $this->formatValue($value))
                     ->setCode(DateTime::INVALID_TIME_ERROR)
                     ->addViolation();
             } else {
-                $this->buildViolation($constraint->message)
+                $this->context->buildViolation($constraint->message)
                     ->setParameter('{{ value }}', $this->formatValue($value))
-                    ->setCode(DateTime::INVALID_TIME_ERROR)
+                    ->setCode(DateTime::INVALID_FORMAT_ERROR)
                     ->addViolation();
             }
         }