From 93f53367cf59a12cc47a10dc251578997317f9ab Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 23 Sep 2021 10:06:11 +0200
Subject: [PATCH] Sortir dans une fonction joindre_trouver_http_post_files() la
 lecture/remise en forme de $_FILES plutot que chaque plugin la duplique a
 l'infini

(cherry picked from commit fd47205547b23188c7b3975b68cc08a93465c2c2)
---
 inc/joindre_document.php | 102 ++++++++++++++++++++++++---------------
 1 file changed, 64 insertions(+), 38 deletions(-)

diff --git a/inc/joindre_document.php b/inc/joindre_document.php
index b129cf87..d38ea00f 100644
--- a/inc/joindre_document.php
+++ b/inc/joindre_document.php
@@ -33,44 +33,20 @@ function joindre_trouver_fichier_envoye() {
 	}
 
 	if (_request('joindre_upload')) {
-		$post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
-		$files = array();
-		if (is_array($post)) {
-			include_spip('action/ajouter_documents');
-			foreach ($post as $file) {
-				if (is_array($file['name'])) {
-					while (count($file['name'])) {
-						$test = array(
-							'error' => array_shift($file['error']),
-							'name' => array_shift($file['name']),
-							'tmp_name' => array_shift($file['tmp_name']),
-							'type' => array_shift($file['type']),
-						);
-						if (!($test['error'] == 4)) {
-							if (is_string($err = joindre_upload_error($test['error']))) {
-								return $err;
-							} // un erreur upload
-							if (!is_array(verifier_upload_autorise($test['name']))) {
-								return _T('medias:erreur_upload_type_interdit', array('nom' => $test['name']));
-							}
-							$files[] = $test;
-						}
-					}
-				} else {
-					//UPLOAD_ERR_NO_FILE
-					if (!($file['error'] == 4)) {
-						if (is_string($err = joindre_upload_error($file['error']))) {
-							return $err;
-						} // un erreur upload
-						if (!is_array(verifier_upload_autorise($file['name']))) {
-							return _T('medias:erreur_upload_type_interdit', array('nom' => $file['name']));
-						}
-						$files[] = $file;
-					}
-				}
-			}
-			if (!count($files)) {
-				return _T('medias:erreur_indiquez_un_fichier');
+		$files = joindre_trouver_http_post_files();
+		// erreur ?
+		if (is_string($files)) {
+			return $files;
+		}
+		// rien envoye ?
+		if (!count($files)) {
+			return _T('medias:erreur_indiquez_un_fichier');
+		}
+		// verifions les types de fichier envoyes
+		include_spip('action/ajouter_documents');
+		foreach ($files as $file) {
+			if (!is_array(verifier_upload_autorise($file['name']))) {
+				return _T('medias:erreur_upload_type_interdit', ['nom' => $file['name']]);
 			}
 		}
 
@@ -165,6 +141,56 @@ function joindre_trouver_fichier_envoye() {
 	return array();
 }
 
+/**
+ * Récupérer et mettre en forme la liste des fichiers postes
+ * que ce soit via plusieurs input file ou via un input file multiple
+ * @param $name : nom de l'input qu'on veut recuperer si on ne veut pas tous les fichiers
+ * @return array|string
+ *   string en cas d'erreur
+ */
+function joindre_trouver_http_post_files($name = null) {
+	$post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
+	$files = [];
+	if (is_array($post)) {
+		foreach ($post as $input_name => $file) {
+			if ($name and $input_name !== $name) {
+				continue;
+			}
+			if (is_array($file['name'])) {
+				while (count($file['name'])) {
+					$test = [
+						'input_name' => $input_name,
+						'error' => array_shift($file['error']),
+						'name' => array_shift($file['name']),
+						'tmp_name' => array_shift($file['tmp_name']),
+						'type' => array_shift($file['type']),
+					];
+					//UPLOAD_ERR_NO_FILE
+					if (!($test['error'] == 4)) {
+						// un erreur upload
+						if (is_string($err = joindre_upload_error($test['error']))) {
+							return $err;
+						}
+						$files[] = $test;
+					}
+				}
+			} else {
+				//UPLOAD_ERR_NO_FILE
+				if (!($file['error'] == 4)) {
+					// un erreur upload
+					if (is_string($err = joindre_upload_error($file['error']))) {
+						return $err;
+					}
+					$file['input_name'] = $input_name;
+					$files[] = $file;
+				}
+			}
+		}
+	}
+
+	return $files;
+}
+
 
 // Erreurs d'upload
 // renvoie false si pas d'erreur
-- 
GitLab