From ccaa81e1e68b48321acf336ca0b1a6c92ce94999 Mon Sep 17 00:00:00 2001
From: "maieul@maieul.net" <>
Date: Sun, 18 Dec 2016 22:08:27 +0000
Subject: [PATCH] =?UTF-8?q?finalement=20il=20faut=20utiliser=20une=20actio?=
 =?UTF-8?q?n=20securis=C3=A9e,=20qui=20renvoie=20le=20document?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes                          |  1 +
 action/formidable_recuperer_fichier.php | 37 +++++++++++++++++++++++++
 formidable_fonctions.php                | 15 +++++-----
 inc/formidable_fichiers.php             | 24 ++++++++++++++++
 lang/formidable_fr.php                  |  1 +
 5 files changed, 71 insertions(+), 7 deletions(-)
 create mode 100644 action/formidable_recuperer_fichier.php

diff --git a/.gitattributes b/.gitattributes
index a0a83a62..d7ef5cd7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,6 +2,7 @@
 action/dupliquer_formulaire.php -text
 action/editer_formulaire.php -text
 action/exporter_formulaire.php -text
+action/formidable_recuperer_fichier.php -text
 action/supprimer_formulaire.php -text
 action/supprimer_formulaires_reponse.php -text
 action/vider_formulaire.php -text
diff --git a/action/formidable_recuperer_fichier.php b/action/formidable_recuperer_fichier.php
new file mode 100644
index 00000000..a6882590
--- /dev/null
+++ b/action/formidable_recuperer_fichier.php
@@ -0,0 +1,37 @@
+<?php
+if (!defined("_ECRIRE_INC_VERSION")) return;
+include_spip('inc/autoriser');
+include_spip('inc/formidable_fichiers');
+/**
+ * Récupère, si on est autorisé à voir la réponse du formulaire, 
+ * un fichier 
+ * et l'envoi en http
+ **/
+function action_formidable_recuperer_fichier() {
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
+
+	$arg = unserialize($arg);
+	if (autoriser('voir', 'formulaires_reponse', $arg['formulaire'])) {
+		$chemin_fichier = _DIR_FICHIERS_FORMIDABLE
+			."formulaire_".$arg['formulaire'] 
+			."/reponse_".$arg['reponse']
+			."/".$arg['saisie']
+			."/".$arg['fichier'];
+		if (@file_exists($chemin_fichier)){
+			$f = $arg['fichier'];
+			formidable_retourner_fichier($chemin_fichier, $f);
+		}
+		else {
+			include_spip('inc/minipres');
+			echo minipres(_T("formidable:erreur_fichier_introuvable"));
+		}
+	} else {
+		include_spip('inc/minipres');
+    echo minipres();
+	}
+
+	exit;	
+
+}
+
diff --git a/formidable_fonctions.php b/formidable_fonctions.php
index 843e952b..2ab10a09 100644
--- a/formidable_fonctions.php
+++ b/formidable_fonctions.php
@@ -11,7 +11,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 }
 
 include_spip('inc/formidable');
-include_spip('inc/utils');
 include_spip('public/formidable_criteres');
 
 /**
@@ -164,14 +163,16 @@ function formidable_ajouter_action_vue_saisie_fichiers($saisie_a_modifier, $nom_
 	$id_formulaire = strval($id_formulaire);
 	$id_formulaires_reponse = strval($id_formulaires_reponse);
 	$vignette_par_defaut = charger_fonction('vignette', 'inc/');
-
+	$securiser_action = charger_fonction('securiser_action','inc');
 	if (array_key_exists($nom_saisie, saisies_lister_avec_type($saisies_du_formulaire, 'fichiers'))) { //saisies SPIP
 		foreach ($saisie_a_modifier as $i => $valeur){
-			$param = 'id_formulaire='.$id_formulaire
-				. '&id_formulaires_reponse='.$id_formulaires_reponse
-				. '&fichier='.$valeur['nom'] 
-				. '&saisie='.$nom_saisie;
-			$url = generer_url_action('formidable_recuperer_fichier',$param,true,false);
+			$param = serialize(array(
+				'formulaire' => $id_formulaire,
+				'reponse' => $id_formulaires_reponse,
+				'fichier' => $valeur['nom'],
+				'saisie' => $nom_saisie
+			));
+			$url = $securiser_action('formidable_recuperer_fichier',$param,'',false);
 			$saisie_a_modifier[$i]['url'] = $url;
 			$saisie_a_modifier[$i]['vignette'] = $vignette_par_defaut($valeur['extension'],false);
 		}
diff --git a/inc/formidable_fichiers.php b/inc/formidable_fichiers.php
index 4d110aee..8766befc 100644
--- a/inc/formidable_fichiers.php
+++ b/inc/formidable_fichiers.php
@@ -114,3 +114,27 @@ function formidable_deplacer_fichier_emplacement_definitif($fichier, $nom, $id_f
 	}
 
 }
+
+/** 
+ * Fournit à l'utilisateur·trice un fichier qui se trouve normalement dans un endroit inaccessible, par exemple dans config. 
+ * La fonction ne vérifie ni l'existence effective du fichier, 
+ * ni le droit effectif de l'utilisateur.
+ * Ceci doit être fait dans l'action qui appelle cette fonction
+ * @param string $chemin le chemin du fichier
+ * @param string $f le nom du fichier qui sera envoyé à l'utilisateur·trice.
+ *
+**/
+function formidable_retourner_fichier($chemin, $f) {
+			header('Content-Type: '.mime_content_type($chemin));
+			header("Content-Disposition: attachment; filename=\"$f\";");
+			header("Content-Transfer-Encoding: binary");
+			// fix for IE catching or PHP bug issue (inspiré de plugins-dist/dump/action/telecharger_dump.php
+			header("Pragma: public");
+			header("Expires: 0"); // set expiration time
+			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
+			if ($cl = filesize($chemin)) {
+				header("Content-Length: " . $cl);
+			}
+			readfile($chemin);
+			exit;
+}
diff --git a/lang/formidable_fr.php b/lang/formidable_fr.php
index f7d18f08..445b91a0 100644
--- a/lang/formidable_fr.php
+++ b/lang/formidable_fr.php
@@ -78,6 +78,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'editer_unicite_label' => 'Vérifier l’unicité d’un champ',
 	'erreur_autorisation' => 'Vous n’avez pas le droit d’éditer les formulaires du site.',
 	'erreur_base' => 'Une erreur technique est survenue durant l’enregistrement.',
+	'erreur_fichier_introuvable' => 'Le fichier demandé est introuvable.', 
 	'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier votre envoi.',
 	'erreur_identifiant' => 'Cet identifiant est déjà utilisé.',
 	'erreur_identifiant_format' => 'L’identifiant ne peut contenir que des chiffres, lettres et le caractère "_"',
-- 
GitLab