diff options
| -rw-r--r-- | public/js/maintenance.js | 3 | ||||
| -rw-r--r-- | src/controller/MaintenanceController.php | 16 | ||||
| -rw-r--r-- | src/controller/UserController.php | 7 | ||||
| -rw-r--r-- | src/service/Backup.php | 6 | ||||
| -rw-r--r-- | src/service/UserDataService.php | 2 | ||||
| -rw-r--r-- | src/service/router.php | 2 | ||||
| -rw-r--r-- | 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(){ | |||
| 58 | toastNotify("Une erreur s'est produite:<br>" + params.get('database_restauration')); | 58 | toastNotify("Une erreur s'est produite:<br>" + params.get('database_restauration')); |
| 59 | } | 59 | } |
| 60 | } | 60 | } |
| 61 | if(params.has('get_last_dump')){ | ||
| 62 | toastNotify(params.get('get_last_dump')); | ||
| 63 | } | ||
| 61 | if(params.has('get_all_media')){ | 64 | if(params.has('get_all_media')){ |
| 62 | toastNotify(params.get('get_all_media')); | 65 | toastNotify(params.get('get_all_media')); |
| 63 | } | 66 | } |
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 | |||
| 49 | die; | 49 | die; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static public function getLastDump(): void | 52 | static public function getLastDump(EntityManager $entityManager): void |
| 53 | { | 53 | { |
| 54 | $backup_list = Backup::getBackupList(); | ||
| 55 | $nb = count($backup_list); | ||
| 56 | |||
| 57 | if($nb <= 0){ // se produit à la première connexion en mode admin pour une raison algorithimque | ||
| 58 | Backup::mySQLdump($entityManager, 'auto'); | ||
| 59 | $backup_list = Backup::getBackupList(); | ||
| 60 | $nb = count($backup_list); | ||
| 61 | if($nb <= 0){ // improbable, les dossiers devraient déjà avoir été créés | ||
| 62 | throw new RuntimeException("Le serveur a rencontré une erreur: aucun backup n'est disponible et ce n'est pas normal."); | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 54 | try{ | 66 | try{ |
| 55 | $file_path = Backup::$backup_dir . '/' . Backup::getLastBackupName(); | 67 | $file_path = Backup::$backup_dir . '/' . $backup_list[$nb - 1]; |
| 56 | header('Content-Type: application/octet-stream'); // signifie fichier quelconque, du binaire quoi! | 68 | header('Content-Type: application/octet-stream'); // signifie fichier quelconque, du binaire quoi! |
| 57 | header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); // pour provoquer un téléchargement et non pour afficher | 69 | header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); // pour provoquer un téléchargement et non pour afficher |
| 58 | header('Content-Length: ' . filesize($file_path)); // peut servir côté client (barre de progression...) | 70 | 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 | |||
| 81 | if($form->validate()){ | 81 | if($form->validate()){ |
| 82 | // à mettre dans une classe métier UserService, Authentication, AuthService? | 82 | // à mettre dans une classe métier UserService, Authentication, AuthService? |
| 83 | $user = self::getUserByName($_POST['login'], $entityManager); | 83 | $user = self::getUserByName($_POST['login'], $entityManager); |
| 84 | if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())) | 84 | if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())){ |
| 85 | { | ||
| 86 | $log = new Log(true); | 85 | $log = new Log(true); |
| 87 | 86 | ||
| 88 | // protection fixation de session, si l'attaquant crée un cookie de session, il est remplacé | 87 | // protection fixation de session, si l'attaquant crée un cookie de session, il est remplacé |
| @@ -94,7 +93,9 @@ class UserController | |||
| 94 | EmailService::cleanEmails($entityManager); | 93 | EmailService::cleanEmails($entityManager); |
| 95 | 94 | ||
| 96 | try{ | 95 | try{ |
| 97 | Backup::mySQLdump($entityManager, 'auto'); // créer un nouveau backup | 96 | if(file_exists('../var/backups')){ |
| 97 | Backup::mySQLdump($entityManager, 'auto'); // créer un nouveau backup, sauf si les dossiers nécessaires sont encore à créer | ||
| 98 | } | ||
| 98 | } | 99 | } |
| 99 | catch(RuntimeException $e){ | 100 | catch(RuntimeException $e){ |
| 100 | echo '<script>window.error_message = "' . $e->getMessage() . '";</script>'; | 101 | echo '<script>window.error_message = "' . $e->getMessage() . '";</script>'; |
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 | |||
| 22 | $engine = stripos($version, 'mariadb') !== false ? 'mariadb-dump' : 'mysqldump'; | 22 | $engine = stripos($version, 'mariadb') !== false ? 'mariadb-dump' : 'mysqldump'; |
| 23 | 23 | ||
| 24 | $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) | 24 | $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) |
| 25 | // attention, si le dossier de destination n'est pas disponible, le fichier est placé avec les fichiers temporaires | ||
| 25 | file_put_contents($tmp, | 26 | file_put_contents($tmp, |
| 26 | "[client]\n | 27 | "[client]\n |
| 27 | user=" . Config::$user . "\n | 28 | user=" . Config::$user . "\n |
| @@ -88,11 +89,6 @@ class Backup | |||
| 88 | } | 89 | } |
| 89 | return $backup_array; | 90 | return $backup_array; |
| 90 | } | 91 | } |
| 91 | static public function getLastBackupName(): string // chemin inclu | ||
| 92 | { | ||
| 93 | $backup_list = self::getBackupList(); | ||
| 94 | return $backup_list[count($backup_list) - 1]; | ||
| 95 | } | ||
| 96 | 92 | ||
| 97 | static public function cleanBackups(): void | 93 | static public function cleanBackups(): void |
| 98 | { | 94 | { |
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 | |||
| 23 | $iterator = new RecursiveIteratorIterator($directory); | 23 | $iterator = new RecursiveIteratorIterator($directory); |
| 24 | 24 | ||
| 25 | foreach($iterator as $info){ | 25 | foreach($iterator as $info){ |
| 26 | if($info->getFilename() != "." && $info->getFilename() != ".."){ // chemins inutiles . et .. | 26 | if($info->getFilename() != "." && $info->getFilename() != ".." && $info->getFilename() != '.htaccess'){ // chemins inutiles . et .. et le .htaccess |
| 27 | $Zip->addGlob($info->getPathname(), 0, array('')); | 27 | $Zip->addGlob($info->getPathname(), 0, array('')); |
| 28 | $counter++; | 28 | $counter++; |
| 29 | } | 29 | } |
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'){ | |||
| 46 | 46 | ||
| 47 | if(IS_ADMIN === true){ | 47 | if(IS_ADMIN === true){ |
| 48 | if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){ | 48 | if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){ |
| 49 | MaintenanceController::getLastDump(); | 49 | MaintenanceController::getLastDump($entityManager); |
| 50 | die; | 50 | die; |
| 51 | } | 51 | } |
| 52 | if($request->query->has('action') && $request->query->get('action') === 'get_all_media'){ | 52 | 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 @@ | |||
| 48 | <a href="<?= new URL(['from' => 'maintenance', 'action' => 'get_all_media']) ?>"> | 48 | <a href="<?= new URL(['from' => 'maintenance', 'action' => 'get_all_media']) ?>"> |
| 49 | <button id="get_all_media">Récupérer l'ensemble des fichiers mutimedia</button> | 49 | <button id="get_all_media">Récupérer l'ensemble des fichiers mutimedia</button> |
| 50 | </a><br> | 50 | </a><br> |
| 51 | <i>Toutes vos photos et vos documents dans un "zip"</i> | 51 | <i>Toutes vos photos et vos documents dans un .zip</i> |
| 52 | </p> | 52 | </p> |
| 53 | <p> | 53 | <p> |
| 54 | <button onclick="openExplorer()" style="color: grey">Explorateur de fichiers</button><br> | 54 | <button onclick="openExplorer()" style="color: grey">Explorateur de fichiers</button><br> |
