aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--public/js/maintenance.js3
-rw-r--r--src/controller/MaintenanceController.php16
-rw-r--r--src/controller/UserController.php7
-rw-r--r--src/service/Backup.php6
-rw-r--r--src/service/UserDataService.php2
-rw-r--r--src/service/router.php2
-rw-r--r--src/view/templates/maintenance.php2
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>