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