diff --git a/.gitattributes b/.gitattributes index a0a83a623a3033246eaac3edacb50b39e9c18e04..d7ef5cd7a63632cd3c6d42747c3e0618fa6b0e0f 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 0000000000000000000000000000000000000000..a688259018f71ce5cd2b8f213831f1920074d009 --- /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 843e952b85c463f4a23ff978e5e02ba0ad67cdd3..2ab10a095493f62e8c5fd26933ad672007a23ad2 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 4d110aee971cadae2d2727138a19578332e86280..8766befc438b29dc6b30a009d2457a5490208988 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 f7d18f08b524a8d0698647dbe34b42d1ca39839f..445b91a0088d0338048698bebe0d75e5ed76379c 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 "_"',