From ade8df4d6a116ab64fa20692bc7f9a33a7ad9f24 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Sat, 26 Jan 2019 10:59:29 +0100 Subject: [PATCH] Form : bouton tout supprimer + faille CSRF --- CHANGES.md | 21 ++++--- module/form/form.php | 96 ++++++++++++++++++++++++------- module/form/view/data/data.js.php | 10 ++++ module/form/view/data/data.php | 12 +++- site/tmp/.htaccess | 2 - 5 files changed, 109 insertions(+), 32 deletions(-) delete mode 100644 site/tmp/.htaccess diff --git a/CHANGES.md b/CHANGES.md index 7411d150..33f357ba 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,17 +3,22 @@ ## Préversion 9.0.0 - Modification : - Stockage distinct du thème et des autres données (core, config, page, module et users ) avec import des données d'une version 8 - - Exporter un thème (avec les images) sous forme d'une archive ZIP à télécharger ou stocker dans Fichiers. - - Importer un thème à partir des fichiers - - Gabarits de pages : deux blocs (colonnes) à droite ou à gauche contenant des informations fixes, le paramétrage est dans le thème, mais les contenus sont stockés dans les pages. + - gestion des thèmes : + - Exporter un thème (avec les images) sous forme d'une archive ZIP à télécharger ou stocker dans Fichiers. + - Importer un thème à partir des fichiers + - Option de position fixe du menu type Facebook + - Gabarits de pages : deux barres latérales, une à droite ou à gauche contenant des informations fixes. - Changement du libellé Modérateur devient Editeur - - VisualBlocks dans TinyMCE - - CodeMirror dans TinyMCE - - Case à cocher dans les formulaires - - Option de position fixe du menu type Facebook + - Editeur : + - VisualBlocks dans TinyMCE + - CodeMirror dans TinyMCE - Mini barre pour les membres simples - - Activation de la procédure d'update en ligne - Update : affichage de la version proposée dans la popup de mise à jour + - Module Formulaire : + - Case à cocher dans les formulaires + - Bouton d'export au format CSV + - Bouton effacer toutes les données + - Correction faille CSRF Correctif : - contrôle CSRF de la configuration du compte connecté - Problème dans data/.htaccess diff --git a/module/form/form.php b/module/form/form.php index b3439efd..cd35653c 100755 --- a/module/form/form.php +++ b/module/form/form.php @@ -20,6 +20,7 @@ class form extends common { 'config' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, + 'deleteall' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, 'export2csv' => self::GROUP_MODERATOR, 'output2csv' => self::GROUP_MODERATOR @@ -126,7 +127,7 @@ class form extends common { $content, template::button('formDataDelete' . $dataIds[$i], [ 'class' => 'formDataDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i], + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'], 'value' => template::ico('cancel') ]) ]; @@ -145,33 +146,77 @@ class form extends common { * @copyright Copyright (C) 2018-2019, Frédéric Tempez */ public function export2csv() { - $data = $this->getData(['module', $this->getUrl(0), 'data']); - if ($data !== []) { - $csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv'; - if (!file_exists('site/file/source/data')) { - mkdir('site/file/source/data'); - } - $fp = fopen('site/file/source/data/'.$csvfilename, 'w'); - fputcsv($fp, array_keys($data[1]), ';','"'); - foreach ($data as $fields) { - fputcsv($fp, $fields, ';','"'); - } - fclose($fp); + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'notification' => ' Export CSV effectué dans :
'.$csvfilename, - 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data', - 'state' => true + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'notification' => 'Action non autorisée' ]); } else { - $this->addOutput([ - 'notification' => 'Aucune donnée à exporter', - 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data' - ]); + $data = $this->getData(['module', $this->getUrl(0), 'data']); + if ($data !== []) { + $csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv'; + if (!file_exists('site/file/source/data')) { + mkdir('site/file/source/data'); + } + $fp = fopen('site/file/source/data/'.$csvfilename, 'w'); + fputcsv($fp, array_keys($data[1]), ';','"'); + foreach ($data as $fields) { + fputcsv($fp, $fields, ';','"'); + } + fclose($fp); + // Valeurs en sortie + $this->addOutput([ + 'notification' => ' Export CSV effectué dans :
'.$csvfilename, + 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data', + 'state' => true + ]); + } else { + $this->addOutput([ + 'notification' => 'Aucune donnée à exporter', + 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data' + ]); + } } } + /** + * Suppression + */ + public function deleteall() { + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'notification' => 'Action non autorisée' + ]); + } else { + $data = ($this->getData(['module', $this->getUrl(0), 'data'])); + if (count($data) > 0 ) { + // Suppression multiple + for ($i = 1; $i <= count($data) ; $i++) { + $this->deleteData(['module', $this->getUrl(0), 'data', $i]); + } + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'notification' => 'Toutes les données ont été supprimées', + 'state' => true + ]); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'notification' => 'Aucune donnée à supprimer' + ]); + } + } + } + + /** * Suppression */ @@ -183,6 +228,14 @@ class form extends common { 'access' => false ]); } + // Jeton incorrect + elseif ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'notification' => 'Action non autorisée' + ]); + } // Suppression else { $this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]); @@ -195,6 +248,9 @@ class form extends common { } } + + + /** * Accueil */ diff --git a/module/form/view/data/data.js.php b/module/form/view/data/data.js.php index dd8bee6b..91d0e044 100755 --- a/module/form/view/data/data.js.php +++ b/module/form/view/data/data.js.php @@ -18,4 +18,14 @@ $(".formDataDelete").on("click", function() { return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() { $(location).attr("href", _this.attr("href")); }); +}); + +/** + * Confirmation de suppression de toutes les donénes + */ +$(".formDataDeleteAll").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir supprimer toutes les données ?", function() { + $(location).attr("href", _this.attr("href")); + }); }); \ No newline at end of file diff --git a/module/form/view/data/data.php b/module/form/view/data/data.php index ac04a081..ae925983 100755 --- a/module/form/view/data/data.php +++ b/module/form/view/data/data.php @@ -7,10 +7,18 @@ 'value' => 'Retour' ]); ?> -
+
+ 'formDataDeleteAll buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'], + 'ico' => 'cancel', + 'value' => 'Tout effacer' + ]); ?> +
+
'buttonBlue', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'], 'ico' => 'download', 'value' => 'Export CSV' ]); ?> diff --git a/site/tmp/.htaccess b/site/tmp/.htaccess deleted file mode 100644 index fb17dacc..00000000 --- a/site/tmp/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ - -# fichier vide pour maintenir le répertoire sous Github