forked from ZwiiCMS-Team/ZwiiCMS
Form : bouton tout supprimer + faille CSRF
This commit is contained in:
parent
0dcb72b151
commit
ade8df4d6a
21
CHANGES.md
21
CHANGES.md
@ -3,17 +3,22 @@
|
|||||||
## Préversion 9.0.0
|
## Préversion 9.0.0
|
||||||
- Modification :
|
- 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
|
- 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.
|
- gestion des thèmes :
|
||||||
- Importer un thème à partir des fichiers
|
- Exporter un thème (avec les images) sous forme d'une archive ZIP à télécharger ou stocker dans 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.
|
- 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
|
- Changement du libellé Modérateur devient Editeur
|
||||||
- VisualBlocks dans TinyMCE
|
- Editeur :
|
||||||
- CodeMirror dans TinyMCE
|
- VisualBlocks dans TinyMCE
|
||||||
- Case à cocher dans les formulaires
|
- CodeMirror dans TinyMCE
|
||||||
- Option de position fixe du menu type Facebook
|
|
||||||
- Mini barre pour les membres simples
|
- 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
|
- 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 :
|
Correctif :
|
||||||
- contrôle CSRF de la configuration du compte connecté
|
- contrôle CSRF de la configuration du compte connecté
|
||||||
- Problème dans data/.htaccess
|
- Problème dans data/.htaccess
|
||||||
|
@ -20,6 +20,7 @@ class form extends common {
|
|||||||
'config' => self::GROUP_MODERATOR,
|
'config' => self::GROUP_MODERATOR,
|
||||||
'data' => self::GROUP_MODERATOR,
|
'data' => self::GROUP_MODERATOR,
|
||||||
'delete' => self::GROUP_MODERATOR,
|
'delete' => self::GROUP_MODERATOR,
|
||||||
|
'deleteall' => self::GROUP_MODERATOR,
|
||||||
'index' => self::GROUP_VISITOR,
|
'index' => self::GROUP_VISITOR,
|
||||||
'export2csv' => self::GROUP_MODERATOR,
|
'export2csv' => self::GROUP_MODERATOR,
|
||||||
'output2csv' => self::GROUP_MODERATOR
|
'output2csv' => self::GROUP_MODERATOR
|
||||||
@ -126,7 +127,7 @@ class form extends common {
|
|||||||
$content,
|
$content,
|
||||||
template::button('formDataDelete' . $dataIds[$i], [
|
template::button('formDataDelete' . $dataIds[$i], [
|
||||||
'class' => 'formDataDelete buttonRed',
|
'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')
|
'value' => template::ico('cancel')
|
||||||
])
|
])
|
||||||
];
|
];
|
||||||
@ -145,33 +146,77 @@ class form extends common {
|
|||||||
* @copyright Copyright (C) 2018-2019, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2019, Frédéric Tempez
|
||||||
*/
|
*/
|
||||||
public function export2csv() {
|
public function export2csv() {
|
||||||
$data = $this->getData(['module', $this->getUrl(0), 'data']);
|
// Jeton incorrect
|
||||||
if ($data !== []) {
|
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||||
$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
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => ' Export CSV effectué dans :<br />'.$csvfilename,
|
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||||
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data',
|
'notification' => 'Action non autorisée'
|
||||||
'state' => true
|
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
$this->addOutput([
|
$data = $this->getData(['module', $this->getUrl(0), 'data']);
|
||||||
'notification' => 'Aucune donnée à exporter',
|
if ($data !== []) {
|
||||||
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/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 :<br />'.$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
|
* Suppression
|
||||||
*/
|
*/
|
||||||
@ -183,6 +228,14 @@ class form extends common {
|
|||||||
'access' => false
|
'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
|
// Suppression
|
||||||
else {
|
else {
|
||||||
$this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]);
|
$this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]);
|
||||||
@ -195,6 +248,9 @@ class form extends common {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accueil
|
* Accueil
|
||||||
*/
|
*/
|
||||||
|
@ -18,4 +18,14 @@ $(".formDataDelete").on("click", function() {
|
|||||||
return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() {
|
return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() {
|
||||||
$(location).attr("href", _this.attr("href"));
|
$(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"));
|
||||||
|
});
|
||||||
});
|
});
|
@ -7,10 +7,18 @@
|
|||||||
'value' => 'Retour'
|
'value' => 'Retour'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col2 offset8">
|
<div class="col2 offset6">
|
||||||
|
<?php echo template::button('formDataDeleteAll', [
|
||||||
|
'class' => 'formDataDeleteAll buttonRed',
|
||||||
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'],
|
||||||
|
'ico' => 'cancel',
|
||||||
|
'value' => 'Tout effacer'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col2">
|
||||||
<?php echo template::button('formDataBack', [
|
<?php echo template::button('formDataBack', [
|
||||||
'class' => 'buttonBlue',
|
'class' => 'buttonBlue',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv',
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'],
|
||||||
'ico' => 'download',
|
'ico' => 'download',
|
||||||
'value' => 'Export CSV'
|
'value' => 'Export CSV'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
# fichier vide pour maintenir le répertoire sous Github
|
|
Loading…
Reference in New Issue
Block a user