From 3f47a3e9acadfd7cccbc4267629b775848bf1add Mon Sep 17 00:00:00 2001
From: elvill <elias.villiger@uzh.ch>
Date: Thu, 8 Feb 2018 09:11:05 +0100
Subject: [PATCH] Feature #5064 - Throw user form exception on invalid date.

---
 extension/qfq/qfq/Constants.php           |  1 +
 extension/qfq/qfq/store/FillStoreForm.php | 10 +++++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/extension/qfq/qfq/Constants.php b/extension/qfq/qfq/Constants.php
index 5c1af9171..397e7dc73 100644
--- a/extension/qfq/qfq/Constants.php
+++ b/extension/qfq/qfq/Constants.php
@@ -187,6 +187,7 @@ const ERROR_MAX_FILE_SIZE_TOO_BIG = 1082;
 const ERROR_SMALLER_THAN_MIN = 1083;
 const ERROR_LARGER_THAN_MAX = 1084;
 const ERROR_INVALID_DECIMAL_FORMAT = 1085;
+const ERROR_INVALID_DATE = 1086;
 
 // Subrecord
 const ERROR_SUBRECORD_MISSING_COLUMN_ID = 1100;
diff --git a/extension/qfq/qfq/store/FillStoreForm.php b/extension/qfq/qfq/store/FillStoreForm.php
index a4a6c9f4f..bd36ddc28 100644
--- a/extension/qfq/qfq/store/FillStoreForm.php
+++ b/extension/qfq/qfq/store/FillStoreForm.php
@@ -319,9 +319,17 @@ class FillStoreForm {
             throw new UserFormException("DateTime format not recognized: $placeholder / $value ", ERROR_DATE_TIME_FORMAT_NOT_RECOGNISED);
         }
 
-        $showTime = $formElement[FE_TYPE] == 'date' ? '0' : '1';
+        $showTime = $formElement[FE_TYPE] == FE_TYPE_DATE ? '0' : '1';
         $value = Support::convertDateTime($value, FORMAT_DATE_INTERNATIONAL, '1', $showTime, $formElement[FE_SHOW_SECONDS]);
 
+        if ($formElement[FE_TYPE] !== FE_TYPE_TIME) {
+            // Validate date (e.g. 2010-02-31)
+            $dateValue = explode(' ', $value)[0];
+            $dateParts = explode('-', $dateValue);
+            if (!checkdate($dateParts[1], $dateParts[2], $dateParts[0]))
+                throw new UserFormException("$dateValue is not a valid date.", ERROR_INVALID_DATE);
+        }
+
         return $value;
     }
 }
\ No newline at end of file
-- 
GitLab