From 6ae49c5a1bbca54dda8a39805b5ca85e2c42c0b0 Mon Sep 17 00:00:00 2001
From: "maieul@maieul.net" <>
Date: Sun, 11 Dec 2016 13:18:35 +0000
Subject: [PATCH] =?UTF-8?q?d=C3=A9but=20de=20v=C3=A9rification=20de=20fich?=
 =?UTF-8?q?iers,=20pour=20le=20moment=20v=C3=A9rifier=20mime=5Ftype=20pr?=
 =?UTF-8?q?=C3=A9cis?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes        |  1 +
 lang/verifier_fr.php  |  8 +++---
 verifier/fichiers.php | 67 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 4 deletions(-)
 create mode 100755 verifier/fichiers.php

diff --git a/.gitattributes b/.gitattributes
index 542cd0d..973d888 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -46,6 +46,7 @@ verifier/email.php -text
 verifier/email.yaml -text
 verifier/entier.php -text
 verifier/entier.yaml -text
+verifier/fichiers.php -text
 verifier/id_document.php -text
 verifier/id_document.yaml -text
 verifier/id_objet.php -text
diff --git a/lang/verifier_fr.php b/lang/verifier_fr.php
index 71bdc8a..4fd1d57 100644
--- a/lang/verifier_fr.php
+++ b/lang/verifier_fr.php
@@ -20,7 +20,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'erreur_date_format' => 'Le format de la date n’est pas accepté.',
 	'erreur_decimal' => 'La valeur doit être un nombre décimal.',
 	'erreur_decimal_nb_decimales' => 'Le nombre ne doit pas avoir plus de @nb_decimales@ chiffres après la virgule.',
-	'erreur_dimension_image' => 'Le fichier @name@ est trop grand : @taille@ (maximum @taille_max@).',
+	'erreur_dimension_image' => 'Le fichier «&nbsp;@name@&nbsp;» est trop grand : @taille@ (maximum @taille_max@).',
 	'erreur_email' => 'L’adresse de courriel <em>@email@</em> n’a pas un format valide.',
 	'erreur_email_nondispo' => 'L’adresse de courriel <em>@email@</em> est déjà utilisée.',
 	'erreur_entier' => 'La valeur doit être un entier.',
@@ -46,12 +46,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'erreur_siret' => 'Le numéro de SIRET n’est pas valide.',
 	'erreur_taille_egal' => 'La valeur doit comprendre exactement @egal@ caractères (actuellement @nb@).',
 	'erreur_taille_entre' => 'La valeur doit comprendre entre @min@ et @max@ caractères (actuellement @nb@).',
-	'erreur_taille_image' => 'Le fichier @name@ est trop lourd : @taille@ (maximum @taille_max@).',
+	'erreur_taille_image' => 'Le fichier «&nbsp;@name@&nbsp;» est trop lourd : @taille@ (maximum @taille_max@).',
 	'erreur_taille_max' => 'La valeur doit comprendre au maximum @max@ caractères (actuellement @nb@).',
 	'erreur_taille_min' => 'La valeur doit comprendre au minimum @min@ caractères (actuellement @nb@).',
 	'erreur_telephone' => 'Le numéro n’est pas valide.',
-	'erreur_type_image' => 'Le fichier @name@ n’est pas une image.',
-	'erreur_type_non_autorise' => 'Le fichier @name@ n’est pas d’un type autorisé.',
+	'erreur_type_image' => 'Le fichier «&nbsp;@name@&nbsp;» n\'est pas une image.',
+	'erreur_type_non_autorise' => 'Le fichier «&nbsp;@name@&nbsp;» n\'est pas d\'un type autorisé.',
 	'erreur_url' => 'L’adresse <em>@url@</em> n’est pas valide.',
 	'erreur_url_protocole' => 'L’adresse saisie <em>(@url@)</em> doit commencer par @protocole@.',
 	'erreur_url_protocole_exact' => 'L’adresse saisie <em>(@url@)</em> ne commence pas par un protocole valide (http:// par exemple).',
diff --git a/verifier/fichiers.php b/verifier/fichiers.php
new file mode 100755
index 0000000..661f4fd
--- /dev/null
+++ b/verifier/fichiers.php
@@ -0,0 +1,67 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) {
+	return;
+}
+
+/**
+ * Vérifier une saisie d'envoi de fichiers
+ *
+ * @param array $valeur
+ *   Le sous tableau de $_FILES à vérifier, $_FILES['logo'] par exemple
+ *   Doit être un champ avec un ou plusieurs upload
+ * @param array $options
+ *   Options à vérifier :
+ *   - mime au choix 'image','tous_spip','specifique'
+ *   - mime_specifique (si l'option 'mime_specifique' est choisi ci-dessus)
+ *   - taille_max (en Kio)
+ *   - largeur_max (en px)
+ *   - hauteur_max (en px)
+ * @param array &$erreurs_par_fichier
+ *   Un tableau, passé par référence, qui contient le détail des erreurs fichier de $_FILES['fichier'] par fichier
+ * @return string
+ */
+function verifier_fichiers_dist($valeur, $options, &$erreurs_par_fichier) {
+	if (!is_array($valeur['tmp_name'])){//si on reçoit une info de type fichier unique, on bascule comme si on était fichier multiple
+		$old_valeur = $valeur;
+		$valeur = array();
+		foreach ($old_valeur as $propriete=>$val){
+			$valeur[$propriete][0] = $val;
+		}
+	}
+	
+	foreach ($valeur['tmp_name'] as $cle=>$tmp_name){//On parcourt tous les fichiers
+		if ($valeur['error'][$cle]!=0){//On vérifie uniquement les fichiers bien expediés
+			continue;	
+		}
+		if ($erreur=verifier_fichier_mime($valeur,$cle,$options)){// On commence par vérifier le type
+			$erreurs_par_fichier[$cle] = $erreur;
+		}
+	}
+	if (!empty($erreurs_par_fichier)){
+		return implode($erreurs_par_fichier,"<br />"); 
+	}
+	return '';
+}
+
+/**
+ * Vérifier le mime type d'une saisie d'envoi de fichiers
+ *
+ * @param array $valeur
+ *   Le sous tableau de $_FILES à vérifier, $_FILES['logo'] par exemple
+ *   Doit être un champ plusieurs uploads
+ * @param int $cle
+ *   La clé du tableau qu'on vérifie
+ * @param array $options
+ *   Les options tels que passés à verifier_fichiers()
+ * @return string
+ */
+function verifier_fichier_mime($valeur,$cle,$options){
+	if ($options['mime'] == 'specifique'){
+		if (!in_array($valeur['type'][$cle],$options['mime_specifique'])){
+			return _T('verifier:erreur_type_non_autorise',array('name'=>$valeur['name'][$cle]));
+		}	
+	}	
+	return '';
+}
-- 
GitLab