Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / datetime / src / Plugin / Validation / Constraint / DateTimeFormatConstraintValidator.php
diff --git a/web/core/modules/datetime/src/Plugin/Validation/Constraint/DateTimeFormatConstraintValidator.php b/web/core/modules/datetime/src/Plugin/Validation/Constraint/DateTimeFormatConstraintValidator.php
new file mode 100644 (file)
index 0000000..a027a82
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\datetime\Plugin\Validation\Constraint;
+
+use Drupal\Component\Datetime\DateTimePlus;
+use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Constraint validator for DateTime items to ensure the format is correct.
+ */
+class DateTimeFormatConstraintValidator extends ConstraintValidator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($item, Constraint $constraint) {
+    /* @var $item \Drupal\datetime\Plugin\Field\FieldType\DateTimeItem */
+    if (isset($item)) {
+      $value = $item->getValue()['value'];
+      if (!is_string($value)) {
+        $this->context->addViolation($constraint->badType);
+      }
+      else {
+        $datetime_type = $item->getFieldDefinition()->getSetting('datetime_type');
+        $format = $datetime_type === DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT;
+        $date = NULL;
+        try {
+          $date = DateTimePlus::createFromFormat($format, $value, new \DateTimeZone(DATETIME_STORAGE_TIMEZONE));
+        }
+        catch (\InvalidArgumentException $e) {
+          $this->context->addViolation($constraint->badFormat, [
+            '@value' => $value,
+            '@format' => $format,
+          ]);
+          return;
+        }
+        catch (\UnexpectedValueException $e) {
+          $this->context->addViolation($constraint->badValue, [
+            '@value' => $value,
+            '@format' => $format,
+          ]);
+          return;
+        }
+        if ($date === NULL || $date->hasErrors()) {
+          $this->context->addViolation($constraint->badFormat, [
+            '@value' => $value,
+            '@format' => $format,
+          ]);
+        }
+      }
+    }
+  }
+
+}