From c467a9357527abb1d59bfdb5082c3e4e61c4fc8d Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Wed, 3 May 2017 14:59:33 +0000
Subject: [PATCH] =?UTF-8?q?Ticket=20#3914=20:=20Pour=20le=20calcul=20de=20?=
 =?UTF-8?q?la=20date=20dans=20les=20formulaires=20de=20datages,=20=C3=A9vi?=
 =?UTF-8?q?ter=20diff=C3=A9rents=20probl=C3=A8mes=20:=20-=20lorsqu'on=20sa?=
 =?UTF-8?q?isit=20une=20date=20inexistante=20(31/02/2017),=20retourner=20u?=
 =?UTF-8?q?ne=20erreur,=20plut=C3=B4t=20que=20d'arbitrairement=20calculer?=
 =?UTF-8?q?=20une=20date=20sur=20le=20mois=20suivant=20avec=20les=20jours?=
 =?UTF-8?q?=20en=20trop=20-=20lorsqu'on=20saisit=20une=20heure=20erron?=
 =?UTF-8?q?=C3=A9e=20(25:00=20ou=2012:78),=20retourner=20une=20erreur=20?=
 =?UTF-8?q?=C3=A9galement,=20sinon=20l'enregistrement=20SQL=20echoue=20ens?=
 =?UTF-8?q?uite.=20-=20il=20manquait=20les=20cha=C3=AEnes=20de=20langues?=
 =?UTF-8?q?=20des=20erreurs,=20depuis=20l'introduction=20de=20ce=20formula?=
 =?UTF-8?q?ire=20en=20r16420?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/lang/spip_fr.php     |  2 ++
 prive/formulaires/dater.php | 19 +++++++++++--------
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ecrire/lang/spip_fr.php b/ecrire/lang/spip_fr.php
index dadf5d12e6..0fc418cf93 100644
--- a/ecrire/lang/spip_fr.php
+++ b/ecrire/lang/spip_fr.php
@@ -288,6 +288,8 @@ le site "@nom_site_spip@" (@adresse_login@) :',
 	'form_prop_non_enregistre' => 'Votre proposition n’a pas été enregistrée.',
 	'form_prop_sujet' => 'Sujet',
 	'form_prop_url_site' => 'Adresse URL du site',
+	'format_date_incorrecte' => 'La date ou son format est incorrect',
+	'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
 	'forum_non_inscrit' => 'Vous n’êtes pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
 	'forum_par_auteur' => 'par @auteur@',
 	'forum_titre_erreur' => 'Erreur...',
diff --git a/prive/formulaires/dater.php b/prive/formulaires/dater.php
index 8e44e55a42..2aa1e40e24 100644
--- a/prive/formulaires/dater.php
+++ b/prive/formulaires/dater.php
@@ -318,11 +318,11 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour = '', $option
 }
 
 /**
- * Récupérer annee,mois,jour sur la date saisie
+ * Récupérer annee, mois, jour sur la date saisie
  *
  * @param string $post
  * @param string $quoi
- * @return array
+ * @return array|string Chaîne vide si date invalide, tableau (année, mois, jour) sinon.
  */
 function dater_recuperer_date_saisie($post, $quoi = 'date') {
 	if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs)) {
@@ -335,13 +335,13 @@ function dater_recuperer_date_saisie($post, $quoi = 'date') {
 
 		return array($regs[3], $regs[2], $regs[1]);
 	} else {
-		$t = mktime(0, 0, 0, $regs[2], $regs[1], $regs[3]);
-		// si la date n'est pas valide selon mktime, la refuser
-		if (!$t) {
-			return '';
+		if (
+			checkdate(intval($regs[2]), intval($regs[1]), intval($regs[3]))
+			and $t = mktime(0, 0, 0, $regs[2], $regs[1], $regs[3])
+		) {
+			return array(date('Y', $t), date('m', $t), date('d', $t));
 		}
-
-		return array(date('Y', $t), date('m', $t), date('d', $t));
+		return '';
 	}
 }
 
@@ -355,6 +355,9 @@ function dater_recuperer_heure_saisie($post) {
 	if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs)) {
 		return '';
 	}
+	if ($regs[1] >= 23 or $regs[2] >= 59) {
+		return '';
+	}
 
 	return array($regs[1], $regs[2]);
 }
-- 
GitLab