From f37d3f8979b34dbb03d7a39ccbb3889763bea61d Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 3 Jun 2026 23:15:17 +0200 Subject: =?UTF-8?q?exclusion=20des=20htaccess=20des=20zip,=20erreur=20cr?= =?UTF-8?q?=C3=A9ation=20backup=20quand=20dossier=20var/backups=20pas=20en?= =?UTF-8?q?core=20cr=C3=A9=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/js/maintenance.js | 3 +++ src/controller/MaintenanceController.php | 16 ++++++++++++++-- src/controller/UserController.php | 7 ++++--- src/service/Backup.php | 6 +----- src/service/UserDataService.php | 2 +- src/service/router.php | 2 +- src/view/templates/maintenance.php | 2 +- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/public/js/maintenance.js b/public/js/maintenance.js index a742cf6..f5840ef 100644 --- a/public/js/maintenance.js +++ b/public/js/maintenance.js @@ -58,6 +58,9 @@ document.addEventListener('DOMContentLoaded', function(){ toastNotify("Une erreur s'est produite:
" + params.get('database_restauration')); } } + if(params.has('get_last_dump')){ + toastNotify(params.get('get_last_dump')); + } if(params.has('get_all_media')){ toastNotify(params.get('get_all_media')); } diff --git a/src/controller/MaintenanceController.php b/src/controller/MaintenanceController.php index eb1db04..47e51ac 100644 --- a/src/controller/MaintenanceController.php +++ b/src/controller/MaintenanceController.php @@ -49,10 +49,22 @@ class MaintenanceController die; } - static public function getLastDump(): void + static public function getLastDump(EntityManager $entityManager): void { + $backup_list = Backup::getBackupList(); + $nb = count($backup_list); + + if($nb <= 0){ // se produit à la première connexion en mode admin pour une raison algorithimque + Backup::mySQLdump($entityManager, 'auto'); + $backup_list = Backup::getBackupList(); + $nb = count($backup_list); + if($nb <= 0){ // improbable, les dossiers devraient déjà avoir été créés + throw new RuntimeException("Le serveur a rencontré une erreur: aucun backup n'est disponible et ce n'est pas normal."); + } + } + try{ - $file_path = Backup::$backup_dir . '/' . Backup::getLastBackupName(); + $file_path = Backup::$backup_dir . '/' . $backup_list[$nb - 1]; header('Content-Type: application/octet-stream'); // signifie fichier quelconque, du binaire quoi! header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); // pour provoquer un téléchargement et non pour afficher header('Content-Length: ' . filesize($file_path)); // peut servir côté client (barre de progression...) diff --git a/src/controller/UserController.php b/src/controller/UserController.php index f911d2d..9de2fb8 100644 --- a/src/controller/UserController.php +++ b/src/controller/UserController.php @@ -81,8 +81,7 @@ class UserController if($form->validate()){ // à mettre dans une classe métier UserService, Authentication, AuthService? $user = self::getUserByName($_POST['login'], $entityManager); - if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())) - { + if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())){ $log = new Log(true); // protection fixation de session, si l'attaquant crée un cookie de session, il est remplacé @@ -94,7 +93,9 @@ class UserController EmailService::cleanEmails($entityManager); try{ - Backup::mySQLdump($entityManager, 'auto'); // créer un nouveau backup + if(file_exists('../var/backups')){ + Backup::mySQLdump($entityManager, 'auto'); // créer un nouveau backup, sauf si les dossiers nécessaires sont encore à créer + } } catch(RuntimeException $e){ echo ''; diff --git a/src/service/Backup.php b/src/service/Backup.php index c886617..e29ff64 100644 --- a/src/service/Backup.php +++ b/src/service/Backup.php @@ -22,6 +22,7 @@ class Backup $engine = stripos($version, 'mariadb') !== false ? 'mariadb-dump' : 'mysqldump'; $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) + // attention, si le dossier de destination n'est pas disponible, le fichier est placé avec les fichiers temporaires file_put_contents($tmp, "[client]\n user=" . Config::$user . "\n @@ -88,11 +89,6 @@ class Backup } return $backup_array; } - static public function getLastBackupName(): string // chemin inclu - { - $backup_list = self::getBackupList(); - return $backup_list[count($backup_list) - 1]; - } static public function cleanBackups(): void { diff --git a/src/service/UserDataService.php b/src/service/UserDataService.php index 5fa60d5..e0156e2 100644 --- a/src/service/UserDataService.php +++ b/src/service/UserDataService.php @@ -23,7 +23,7 @@ class UserDataService $iterator = new RecursiveIteratorIterator($directory); foreach($iterator as $info){ - if($info->getFilename() != "." && $info->getFilename() != ".."){ // chemins inutiles . et .. + if($info->getFilename() != "." && $info->getFilename() != ".." && $info->getFilename() != '.htaccess'){ // chemins inutiles . et .. et le .htaccess $Zip->addGlob($info->getPathname(), 0, array('')); $counter++; } diff --git a/src/service/router.php b/src/service/router.php index 556651f..6430e9e 100644 --- a/src/service/router.php +++ b/src/service/router.php @@ -46,7 +46,7 @@ if($request->getMethod() === 'GET'){ if(IS_ADMIN === true){ if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){ - MaintenanceController::getLastDump(); + MaintenanceController::getLastDump($entityManager); die; } if($request->query->has('action') && $request->query->get('action') === 'get_all_media'){ diff --git a/src/view/templates/maintenance.php b/src/view/templates/maintenance.php index 403ed97..6b4d223 100644 --- a/src/view/templates/maintenance.php +++ b/src/view/templates/maintenance.php @@ -48,7 +48,7 @@
- Toutes vos photos et vos documents dans un "zip" + Toutes vos photos et vos documents dans un .zip


-- cgit v1.2.3