diff options
author | polo <ordipolo@gmx.fr> | 2024-02-08 04:31:14 +0100 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2024-02-08 04:31:14 +0100 |
commit | ccc9a05b758f1dc0313b96807edfc447a9e8d278 (patch) | |
tree | 114808e506b2bedabdc3ad09770edd7e5eb64e81 | |
parent | 1ad47a7ca38e679a50c8dfee004db88b1633d7cf (diff) | |
download | melaine-ccc9a05b758f1dc0313b96807edfc447a9e8d278.zip |
RGPD cookie uniquement en mode admin et avertissement, logo journal
-rw-r--r-- | controller/ajax.php | 15 | ||||
-rw-r--r-- | controller/backup.php | 8 | ||||
-rw-r--r-- | controller/ckeditor.php | 7 | ||||
-rw-r--r-- | controller/config.php | 4 | ||||
-rw-r--r-- | controller/cookies.php | 66 | ||||
-rw-r--r-- | controller/installation.php | 15 | ||||
-rw-r--r-- | controller/password.php | 346 | ||||
-rw-r--r-- | index.php | 77 | ||||
-rw-r--r-- | public/css/menu.css | 18 | ||||
-rw-r--r-- | public/file_upload.js | 21 | ||||
-rw-r--r-- | public/newspaper.png | bin | 0 -> 39185 bytes | |||
-rw-r--r-- | view/album.php | 5 | ||||
-rw-r--r-- | view/articlesContent.php | 8 | ||||
-rw-r--r-- | view/backup.php | 2 | ||||
-rw-r--r-- | view/discographie.php | 45 | ||||
-rw-r--r-- | view/pageArticlesSimples.php | 6 | ||||
-rw-r--r-- | view/password.php | 31 | ||||
-rw-r--r-- | view/template.php | 4 |
18 files changed, 364 insertions, 314 deletions
diff --git a/controller/ajax.php b/controller/ajax.php index 1a4909e..96df9cb 100644 --- a/controller/ajax.php +++ b/controller/ajax.php | |||
@@ -4,12 +4,12 @@ | |||
4 | // traitement des requêtes AJAX | 4 | // traitement des requêtes AJAX |
5 | 5 | ||
6 | 6 | ||
7 | // -> insertion d'une image dans l'éditeur | 7 | // éditeur |
8 | // -> insertion d'une image | ||
8 | if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') | 9 | if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') |
9 | { | 10 | { |
10 | // sécurité !! | 11 | // sécurité !! |
11 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 | 12 | if(!isset($_SESSION) || !isset($_FILES['upload']) || empty($_FILES['upload'])) |
12 | || !isset($_FILES['upload']) || empty($_FILES['upload'])) | ||
13 | { | 13 | { |
14 | // sans effet? | 14 | // sans effet? |
15 | header('Location: index.php?erreur=image_ajax'); | 15 | header('Location: index.php?erreur=image_ajax'); |
@@ -48,7 +48,7 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_ | |||
48 | if(isset($_GET['action']) && $_GET['action'] == 'restauration' | 48 | if(isset($_GET['action']) && $_GET['action'] == 'restauration' |
49 | && isset($_GET['file_name']) && isset($_GET['file_size'])) | 49 | && isset($_GET['file_name']) && isset($_GET['file_size'])) |
50 | { | 50 | { |
51 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) | 51 | if(!isset($_SESSION)) |
52 | { | 52 | { |
53 | header('Location: index.php?erreur=file_infos_ajax'); | 53 | header('Location: index.php?erreur=file_infos_ajax'); |
54 | } | 54 | } |
@@ -56,8 +56,6 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' | |||
56 | { | 56 | { |
57 | $_SESSION['fileSize'] = $_GET['file_size']; | 57 | $_SESSION['fileSize'] = $_GET['file_size']; |
58 | $_SESSION['fileName'] = $_GET['file_name']; | 58 | $_SESSION['fileName'] = $_GET['file_name']; |
59 | //echo("file infos send"); | ||
60 | //var_dump($_SESSION['fileName']); | ||
61 | exit(); // stop !! | 59 | exit(); // stop !! |
62 | } | 60 | } |
63 | } | 61 | } |
@@ -65,8 +63,7 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' | |||
65 | if(isset($_GET['action']) && $_GET['action'] == 'restauration' | 63 | if(isset($_GET['action']) && $_GET['action'] == 'restauration' |
66 | && isset($_GET['chunk_name']) && isset($_FILES['blob'])) | 64 | && isset($_GET['chunk_name']) && isset($_FILES['blob'])) |
67 | { | 65 | { |
68 | 66 | if(!isset($_SESSION)) | |
69 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) | ||
70 | { | 67 | { |
71 | header('Location: index.php?erreur=upload_ajax'); | 68 | header('Location: index.php?erreur=upload_ajax'); |
72 | } | 69 | } |
@@ -79,7 +76,7 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' | |||
79 | } | 76 | } |
80 | } | 77 | } |
81 | 78 | ||
82 | // nettoyage | 79 | // nettoyage systématique |
83 | if(!isset($_GET['action']) || $_GET['action'] != 'restauration') | 80 | if(!isset($_GET['action']) || $_GET['action'] != 'restauration') |
84 | { | 81 | { |
85 | if(isset($_SESSION['fileName'])) | 82 | if(isset($_SESSION['fileName'])) |
diff --git a/controller/backup.php b/controller/backup.php index c10ca21..52f300f 100644 --- a/controller/backup.php +++ b/controller/backup.php | |||
@@ -10,7 +10,7 @@ function pageSauvegarde($from) | |||
10 | $date = date("d-m-Y", time()); | 10 | $date = date("d-m-Y", time()); |
11 | $nomFichier = "melaineDATA_" . $date; | 11 | $nomFichier = "melaineDATA_" . $date; |
12 | // ne prendre que les dossiers pour exclure les fichiers password.txt, melaineDATA.zip et melainePHP.zip existant | 12 | // ne prendre que les dossiers pour exclure les fichiers password.txt, melaineDATA.zip et melainePHP.zip existant |
13 | $dossiersCibles = [ 'data/archives', 'data/musique', 'data/jaime', 'data/presse', 'data/livres', 'data/legal', 'data/discographie', 'data/melaine', 'data/peinture' ]; | 13 | $dossiersCibles = [ 'data/menu', 'data/archives', 'data/musique', 'data/jaime', 'data/presse', 'data/livres', 'data/legal', 'data/discographie', 'data/melaine', 'data/peinture' ]; |
14 | //$fichiersALaRacine = []; | 14 | //$fichiersALaRacine = []; |
15 | 15 | ||
16 | createZip($cheminDestination, $nomFichier, $dossiersCibles); | 16 | createZip($cheminDestination, $nomFichier, $dossiersCibles); |
@@ -177,7 +177,7 @@ function pageRestauration($from) | |||
177 | $message = restoreData($path); | 177 | $message = restoreData($path); |
178 | } | 178 | } |
179 | 179 | ||
180 | // variables obtenues en AJAX | 180 | // variables crées dans ajax.php |
181 | if(isset($_SESSION['fileName'])) | 181 | if(isset($_SESSION['fileName'])) |
182 | { | 182 | { |
183 | unset($_SESSION['fileName']); | 183 | unset($_SESSION['fileName']); |
@@ -206,8 +206,8 @@ function pageRestauration($from) | |||
206 | require('view/backup.php'); | 206 | require('view/backup.php'); |
207 | } | 207 | } |
208 | 208 | ||
209 | // upload AJAX d'un zip dans file_upload.js | 209 | // upload AJAX d'un zip en morceaux dans file_upload.js |
210 | function uploadChunkAndMerge() | 210 | function uploadChunkAndMerge() // appel dans ajax.php |
211 | { | 211 | { |
212 | // $_GET['chunk_name'] n'est pas utilisé pour l'instant | 212 | // $_GET['chunk_name'] n'est pas utilisé pour l'instant |
213 | 213 | ||
diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 1707128..d0c5824 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php | |||
@@ -18,8 +18,9 @@ function preparationCKeditor($html) | |||
18 | header('Location: index.php?erreur=empty_input'); | 18 | header('Location: index.php?erreur=empty_input'); |
19 | } | 19 | } |
20 | 20 | ||
21 | // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine | 21 | // sécuriser le HTML |
22 | $html = trim($html); | 22 | require('controller/Security.php'); |
23 | $html = Security::secureString($html); | ||
23 | 24 | ||
24 | // supprimer les sauts de ligne | 25 | // supprimer les sauts de ligne |
25 | $sautsDeLigne = array("\n", "\r", "\r\n"); | 26 | $sautsDeLigne = array("\n", "\r", "\r\n"); |
@@ -58,7 +59,7 @@ function getFileCodeFromHTTPReferrer(): string | |||
58 | function submitCKeditor() | 59 | function submitCKeditor() |
59 | { | 60 | { |
60 | // déjà fait mais on ne sait jamais | 61 | // déjà fait mais on ne sait jamais |
61 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) | 62 | if(!isset($_SESSION)) |
62 | { | 63 | { |
63 | header('Location: index.php?page=' . $_GET['page'] . '&erreur=connexion'); | 64 | header('Location: index.php?page=' . $_GET['page'] . '&erreur=connexion'); |
64 | exit(); | 65 | exit(); |
diff --git a/controller/config.php b/controller/config.php index 6fc7000..804671b 100644 --- a/controller/config.php +++ b/controller/config.php | |||
@@ -34,7 +34,7 @@ else | |||
34 | echo('<script>alert(\'Erreur: Une de ces extensions de PHP est nécessaire: imagemagick ou GD. Veuillez activer une des deux dans le fichier php.ini ou installer le paquet php-imagick ou php-gd.\');</script>'); | 34 | echo('<script>alert(\'Erreur: Une de ces extensions de PHP est nécessaire: imagemagick ou GD. Veuillez activer une des deux dans le fichier php.ini ou installer le paquet php-imagick ou php-gd.\');</script>'); |
35 | } | 35 | } |
36 | 36 | ||
37 | // format dans lequel créer les sauvegardes | 37 | // format dans lequel créer les sauvegardes, |
38 | // zip uniquement pour l'instant | 38 | // zip uniquement pour l'instant |
39 | if(extension_loaded("zip")) | 39 | if(extension_loaded("zip")) |
40 | { | 40 | { |
@@ -48,7 +48,7 @@ else | |||
48 | 48 | ||
49 | // conversion des 2M du php.ini en 2000000 | 49 | // conversion des 2M du php.ini en 2000000 |
50 | // note: les kibi, mébi et gibi sont inutiles ici | 50 | // note: les kibi, mébi et gibi sont inutiles ici |
51 | function returnBytes ($size_str) // chaine du style '2M' | 51 | function returnBytes($size_str) // chaine du style '2M' |
52 | { | 52 | { |
53 | switch (substr ($size_str, -1)) | 53 | switch (substr ($size_str, -1)) |
54 | { | 54 | { |
diff --git a/controller/cookies.php b/controller/cookies.php new file mode 100644 index 0000000..f5c7e64 --- /dev/null +++ b/controller/cookies.php | |||
@@ -0,0 +1,66 @@ | |||
1 | <?php | ||
2 | // controller/cookies.php | ||
3 | |||
4 | // nettoyage du cookie de session de l'ancienne version du site | ||
5 | $cookie = 'PHPSESSID'; | ||
6 | if(isset($_COOKIE[$cookie])) | ||
7 | { | ||
8 | deleteCookie($cookie); | ||
9 | header("Location: index.php"); | ||
10 | exit(); | ||
11 | } | ||
12 | |||
13 | // session_start() | ||
14 | $cookie = 'session_admin'; | ||
15 | if(isset($_COOKIE[$cookie])) // détection du cookie | ||
16 | { | ||
17 | if(session_status() === PHP_SESSION_NONE) | ||
18 | { | ||
19 | session_name($cookie); | ||
20 | /*session_set_cookie_params([ | ||
21 | 'lifetime' => 0, | ||
22 | 'path' => '/', | ||
23 | 'domain' => $_SERVER['HTTP_HOST'], | ||
24 | 'secure' => true, | ||
25 | 'httponly' => true, | ||
26 | 'samesite' => 'strict']); | ||
27 | session_start();*/ | ||
28 | |||
29 | /*session_start([ | ||
30 | 'cookie_lifetime' => 0, | ||
31 | 'cookie_path' => '/', | ||
32 | 'cookie_domain' => $_SERVER['HTTP_HOST'], | ||
33 | 'cookie_secure' => true, | ||
34 | 'cookie_httponly' => true, | ||
35 | 'cookie_samesite' => 'strict']);*/ | ||
36 | session_start(); | ||
37 | |||
38 | // le cookie ne semble pas prendre les paramètres! pourquoi? | ||
39 | //var_dump(session_get_cookie_params()); | ||
40 | } | ||
41 | else // cas anormal: session déjà démarrée, mode parano activé! | ||
42 | { | ||
43 | deleteCookie($cookie); | ||
44 | header("Location: index.php"); | ||
45 | exit(); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | // erreurs affichées au rechargement (lesquelles déjà?) | ||
50 | if(isset($_SESSION['erreur']) && !empty($_SESSION['erreur'])) | ||
51 | { | ||
52 | echo('<script>alert(\'' . $_SESSION['erreur'] . '\');</script>'); | ||
53 | unset($_SESSION['erreur']); | ||
54 | } | ||
55 | |||
56 | |||
57 | function deleteCookie(string $name) | ||
58 | { | ||
59 | unset($_COOKIE[$name]); // utile? | ||
60 | setcookie($name, '', time() - 4200, '/'); // suppression | ||
61 | |||
62 | // cookie supprimé au prochain chargement de la page | ||
63 | // forcer un rechargement pour effet immédiat | ||
64 | //header("Location: index.php"); | ||
65 | //exit(); | ||
66 | } | ||
diff --git a/controller/installation.php b/controller/installation.php index f0d2890..90dcd28 100644 --- a/controller/installation.php +++ b/controller/installation.php | |||
@@ -1,5 +1,7 @@ | |||
1 | <?php | 1 | <?php |
2 | // controller/installation.php | 2 | // controller/installation.php |
3 | // | ||
4 | // .htaccess, dépendances et création des dossiers | ||
3 | 5 | ||
4 | // premier démarrage du site | 6 | // premier démarrage du site |
5 | function installation() | 7 | function installation() |
@@ -23,7 +25,8 @@ function installation() | |||
23 | } | 25 | } |
24 | 26 | ||
25 | // extensions de php | 27 | // extensions de php |
26 | // nécessité de 'dom' à confirmer | 28 | // nécessité de "imagick" OU de "gd" (on préfère imagick) |
29 | // "dom" n'est pas nécessaire pour l'instant | ||
27 | $extensions = ['imagick', 'gd', 'zip', 'mbstring', 'dom']; | 30 | $extensions = ['imagick', 'gd', 'zip', 'mbstring', 'dom']; |
28 | foreach($extensions as $extension) | 31 | foreach($extensions as $extension) |
29 | { | 32 | { |
@@ -132,8 +135,14 @@ function installation() | |||
132 | createZipMelainePHP(); | 135 | createZipMelainePHP(); |
133 | } | 136 | } |
134 | 137 | ||
135 | // création d'un mot de passe si password.txt est vide | 138 | |
136 | existPassword(); | 139 | // mot de passe |
140 | if(!file_exists('data/password.txt')) | ||
141 | { | ||
142 | touch('data/password.txt'); | ||
143 | chmod('data/password.txt', 0600); | ||
144 | } | ||
145 | existPassword(); // création si fichier vide | ||
137 | } | 146 | } |
138 | 147 | ||
139 | function createIndexPHP($path, $droitsFichiers) | 148 | function createIndexPHP($path, $droitsFichiers) |
diff --git a/controller/password.php b/controller/password.php index fa4f2c1..5e556e9 100644 --- a/controller/password.php +++ b/controller/password.php | |||
@@ -1,27 +1,31 @@ | |||
1 | <?php | 1 | <?php |
2 | // controller/password.php | 2 | // controller/password.php |
3 | // | ||
4 | // fichier data/password.txt et test captcha | ||
3 | 5 | ||
4 | // exécutée dans installation.php à l'ouverture de chaque page | 6 | // exécutée dans installation.php à l'ouverture de chaque page |
5 | function existPassword() | 7 | function existPassword() |
6 | { | 8 | { |
7 | // création du fichier | ||
8 | if(!file_exists('data/password.txt')) | ||
9 | { | ||
10 | touch('data/password.txt'); | ||
11 | chmod('data/password.txt', 0600); | ||
12 | } | ||
13 | |||
14 | // lecture | 9 | // lecture |
15 | $hashedPassword = file_get_contents('data/password.txt'); | 10 | $file_name = 'data/password.txt'; |
11 | $hashedPassword = file_get_contents($file_name); | ||
16 | if($hashedPassword === false) | 12 | if($hashedPassword === false) |
17 | { | 13 | { |
18 | echo('Erreur: ouverture du fichier password.txt impossible.'); | 14 | echo('Erreur: ouverture du fichier ' . $file_name . ' impossible.'); |
19 | exit(); | 15 | exit(); |
20 | } | 16 | } |
21 | 17 | ||
18 | $file_name = 'data/tmp/solution.txt'; | ||
22 | if(empty($hashedPassword)) | 19 | if(empty($hashedPassword)) |
23 | { | 20 | { |
21 | unset($_GET); | ||
24 | createPassword(); | 22 | createPassword(); |
23 | exit(); | ||
24 | } | ||
25 | // nettoyage | ||
26 | elseif(isset($_GET['page']) && $_GET['page'] != 'connexion' && file_exists($file_name)) | ||
27 | { | ||
28 | unlink($file_name); | ||
25 | } | 29 | } |
26 | } | 30 | } |
27 | 31 | ||
@@ -90,210 +94,247 @@ function controlCaptchaInput(): int | |||
90 | 94 | ||
91 | function createPassword() | 95 | function createPassword() |
92 | { | 96 | { |
93 | // paranoïa? | 97 | // I - traitement |
94 | if(isset($_SESSION['admin'])) | 98 | // cas anormal: session déjà existante |
99 | global $cookie; // nom du cookie dans cookies.php | ||
100 | if(isset($_COOKIE[$cookie])) | ||
95 | { | 101 | { |
96 | unset($_SESSION['admin']); | 102 | deleteCookie($cookie); // cookie supprimé au rechargement |
97 | header("Location: index.php"); | 103 | header("Location: index.php"); |
98 | exit(); | 104 | exit(); |
99 | } | 105 | } |
100 | 106 | ||
101 | $captcha = createCaptcha(); | ||
102 | |||
103 | $title = 'Bienvenue Melaine Favennec'; | ||
104 | $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; | ||
105 | require('view/password.php'); | ||
106 | |||
107 | // contrôle de la saisie | 107 | // contrôle de la saisie |
108 | if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse']) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) | 108 | $file_name = 'data/tmp/solution.txt'; |
109 | $error = ''; | ||
110 | if(file_exists($file_name)) | ||
109 | { | 111 | { |
110 | // caractères non désirés supprimés | 112 | $captcha_solution = file_get_contents($file_name); |
111 | // impossible d'entrer un espace ou une tabulation et de valider par erreur | 113 | unlink($file_name); |
112 | require('controller/Security.php'); | ||
113 | $password = Security::secureString($_POST['motdepasse']); | ||
114 | $password = removeSpacesTabsCRLF($_POST['motdepasse']); | ||
115 | 114 | ||
116 | // enregistrement | 115 | if(empty($_POST)) // page rechargée |
117 | if(isset($password) && $password == $_POST['motdepasse']) | 116 | {} |
117 | elseif(!isset($_POST['captcha']) || controlCaptchaInput() == 0) | ||
118 | { | ||
119 | $error = 'error_non_valid_captcha'; | ||
120 | } | ||
121 | elseif($_POST['captcha'] != $captcha_solution) | ||
118 | { | 122 | { |
119 | hashNewPassword($_POST['motdepasse']); | 123 | $error = 'bad_solution_captcha'; |
120 | unset($_SESSION['captcha']); // nettoyage | 124 | } |
121 | header('Location: index.php'); | 125 | elseif(!isset($_POST['motdepasse']) || empty($_POST['motdepasse'])) |
126 | { | ||
127 | $error = 'bad_password'; | ||
122 | } | 128 | } |
123 | // mot de passe non valable | ||
124 | else | 129 | else |
125 | { | 130 | { |
126 | sleep(1); | 131 | // -> caractères HTML dangereux supprimés |
127 | echo($header); | 132 | // -> empêche validation par erreur d'une chaine "vide" |
128 | echo($errorPassword); | 133 | require('controller/Security.php'); |
129 | echo($formulaireNouveauMDP); | 134 | $password = Security::secureString($_POST['motdepasse']); |
130 | echo($errorBadCharacters); | 135 | $password = removeSpacesTabsCRLF($_POST['motdepasse']); |
136 | |||
137 | // enregistrement et redirection | ||
138 | if(isset($password) && $password == $_POST['motdepasse']) | ||
139 | { | ||
140 | hashNewPassword($_POST['motdepasse']); | ||
141 | header('Location: index.php'); | ||
142 | exit(); | ||
143 | } | ||
144 | else | ||
145 | { | ||
146 | $error = 'bad_password'; | ||
147 | } | ||
131 | } | 148 | } |
132 | } | 149 | } |
133 | // saisie non valide | 150 | else // première fois |
134 | elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) | 151 | {} |
135 | { | 152 | |
136 | sleep(1); | 153 | // inséré dans $captchaHtml puis dans $formulaireNouveauMDP |
137 | echo($header); | 154 | $captcha = createCaptcha(); |
138 | echo($errorNonValidCaptcha); | 155 | // enregistrement de la réponse du captcha pour vérification |
139 | echo($formulaireNouveauMDP); | 156 | saveSolutionCaptcha($captcha[2]); |
140 | echo($errorBadCharacters); | 157 | |
141 | } | 158 | |
142 | // mauvais captcha | 159 | // II - affichage |
143 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) | 160 | $title = 'Bienvenue Melaine Favennec'; |
161 | $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; | ||
162 | |||
163 | // même vue que la fonction changerMotDePasse() | ||
164 | require('view/password.php'); | ||
165 | |||
166 | echo($header); | ||
167 | if($error != '') | ||
144 | { | 168 | { |
145 | sleep(1); | 169 | sleep(1); |
146 | echo($header); | 170 | echo($error_messages[$error]); |
147 | echo($errorCaptcha); | ||
148 | echo($formulaireNouveauMDP); | ||
149 | echo($errorBadCharacters); | ||
150 | } | ||
151 | // 1ère fois | ||
152 | else | ||
153 | { | ||
154 | echo($header); | ||
155 | echo($formulaireNouveauMDP); | ||
156 | echo($errorBadCharacters); | ||
157 | //echo($warning); // message pas top | ||
158 | } | 171 | } |
172 | echo($formulaireNouveauMDP); | ||
173 | echo($error_messages['forbidden_characters']); | ||
159 | echo($footer); | 174 | echo($footer); |
160 | |||
161 | // fois suivante (dispense de nettoyer la variable) | ||
162 | $_SESSION['captcha'] = $captcha[2]; | ||
163 | exit(); | ||
164 | } | 175 | } |
165 | 176 | ||
166 | 177 | ||
167 | function connect() | 178 | function connect() |
168 | { | 179 | { |
180 | // I - traitement | ||
169 | // déjà en mode admin | 181 | // déjà en mode admin |
170 | if($_SESSION['admin'] == 1) | 182 | global $cookie; // nom du cookie dans cookies.php |
183 | if(isset($_COOKIE[$cookie])) | ||
171 | { | 184 | { |
172 | header('Location: index.php?page=' . $_GET['from']); | 185 | header('Location: index.php?page=' . $_GET['from']); |
173 | exit(); | 186 | exit(); |
174 | } | 187 | } |
175 | 188 | ||
176 | // Ajouter une sécurité par cpatcha avec un "input" supplémentaire | 189 | // contrôle de la saisie |
190 | $file_name = 'data/tmp/solution.txt'; | ||
191 | $error = ''; | ||
192 | if(file_exists($file_name)) | ||
193 | { | ||
194 | $captcha_solution = file_get_contents($file_name); | ||
195 | unlink($file_name); | ||
196 | |||
197 | if(empty($_POST)) // page rechargée | ||
198 | {} | ||
199 | elseif(!isset($_POST['captcha']) || controlCaptchaInput() == 0) | ||
200 | { | ||
201 | $error = 'error_non_valid_captcha'; | ||
202 | } | ||
203 | elseif($_POST['captcha'] != $captcha_solution) | ||
204 | { | ||
205 | $error = 'bad_solution_captcha'; | ||
206 | } | ||
207 | elseif(!isset($_POST['motdepasse']) || empty($_POST['motdepasse'])) | ||
208 | { | ||
209 | $error = 'bad_password'; | ||
210 | } | ||
211 | else | ||
212 | { | ||
213 | // enregistrement et redirection | ||
214 | if(testPassword($_POST["motdepasse"])) | ||
215 | { | ||
216 | session_name($cookie); | ||
217 | session_start(); | ||
218 | header('Location: index.php?page=' . $_GET['from']); | ||
219 | exit(); | ||
220 | } | ||
221 | else | ||
222 | { | ||
223 | $error = 'bad_password'; | ||
224 | } | ||
225 | } | ||
226 | } | ||
227 | else // première fois | ||
228 | {} | ||
229 | |||
230 | // inséré dans $captchaHtml puis dans $formulaireNouveauMDP | ||
177 | $captcha = createCaptcha(); | 231 | $captcha = createCaptcha(); |
178 | // Et créer une variable de session pour la réponse au CAPTCHA | 232 | // enregistrement de la réponse du captcha pour vérification |
233 | saveSolutionCaptcha($captcha[2]); | ||
234 | |||
179 | 235 | ||
236 | // II - affichage | ||
180 | $title = "Connexion"; | 237 | $title = "Connexion"; |
181 | $subHeading = "Veuillez saisir votre mot de passe pour pouvoir apporter des modifications au site."; | 238 | $subHeading = "Veuillez saisir votre mot de passe pour pouvoir apporter des modifications au site."; |
182 | 239 | // même vue que la fonction changerMotDePasse() | |
183 | // cette page utilise la même vue que la fonction changerMotDePasse() dans controller/admin.php | ||
184 | require('view/password.php'); | 240 | require('view/password.php'); |
185 | 241 | ||
186 | echo($header); | 242 | echo($header); |
187 | 243 | //echo($warning_messages['message_disconnect']); | |
188 | // bon codes (mot de passe et captcha) | 244 | if($error != '') |
189 | if(isset ($_POST["motdepasse"]) && testPassword($_POST["motdepasse"]) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) | ||
190 | { | ||
191 | $_SESSION['admin'] = 1; | ||
192 | unset($_SESSION['captcha']); // nettoyage | ||
193 | header('Location: index.php?page=' . $_GET['from']); | ||
194 | exit(); | ||
195 | } | ||
196 | // saisie non valide | ||
197 | elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) | ||
198 | { | ||
199 | echo($errorNonValidCaptcha); | ||
200 | sleep(1); | ||
201 | echo($formulaireConnexion); | ||
202 | } | ||
203 | // mauvais captcha | ||
204 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) | ||
205 | { | 245 | { |
206 | echo($errorCaptcha); | ||
207 | sleep(1); | 246 | sleep(1); |
208 | echo($formulaireConnexion); | 247 | echo($error_messages[$error]); |
209 | } | 248 | } |
249 | echo($formulaireConnexion); | ||
250 | echo($warning_messages['message_cookie']); | ||
251 | echo($warning_messages['private_browsing']); | ||
252 | echo($footer); | ||
253 | } | ||
210 | 254 | ||
211 | // mauvais codes | ||
212 | elseif(isset ($_POST["motdepasse"]) && !testPassword($_POST["motdepasse"])) | ||
213 | { | ||
214 | // défense aux attaques par force brute | ||
215 | // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site | ||
216 | echo($errorPassword); | ||
217 | sleep(1); | ||
218 | echo($formulaireConnexion); | ||
219 | } | ||
220 | 255 | ||
221 | // première arrivée sur la page | 256 | function saveSolutionCaptcha(string $solution) |
222 | else | 257 | { |
223 | { | 258 | $file_name = 'data/tmp/solution.txt'; |
224 | echo($formulaireConnexion); | 259 | if(!file_exists($file_name)) |
225 | } | 260 | { |
226 | 261 | touch($file_name); | |
227 | // fois suivante (dispense de nettoyer la variable) | 262 | chmod($file_name, 0600); |
228 | $_SESSION['captcha'] = $captcha[2]; | 263 | } |
229 | 264 | file_put_contents($file_name, $solution); | |
230 | echo($messageDeconnect); | ||
231 | echo($footer); | ||
232 | } | 265 | } |
233 | 266 | ||
267 | |||
234 | function changePassword() | 268 | function changePassword() |
235 | { | 269 | { |
270 | // I - traitement | ||
236 | // vérification supplémentaire | 271 | // vérification supplémentaire |
237 | if($_SESSION['admin'] !== 1) | 272 | global $cookie; // nom du cookie dans cookies.php |
273 | if(!isset($_SESSION)) | ||
238 | { | 274 | { |
239 | $_SESSION['admin'] = 0; | 275 | deleteCookie($cookie); |
240 | header('Location: index.php?page=' . $_GET['from']); | 276 | header('Location: index.php?page=' . $_GET['from']); |
241 | exit(); | 277 | exit(); |
242 | } | 278 | } |
243 | 279 | ||
244 | $title = "Nouveau mot de passe"; | 280 | // contrôle de la saisie |
245 | $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; | 281 | $error = ''; |
246 | 282 | $success = false; | |
247 | require('view/password.php'); | 283 | if(empty($_POST)) // première fois ou page rechargée |
248 | echo($header); | 284 | {} |
249 | 285 | elseif(!isset($_POST['nouveauMotdepasse']) || empty($_POST['nouveauMotdepasse'])|| !isset($_POST['ancienMotdepasse']) || empty($_POST['ancienMotdepasse'])) | |
250 | // conformité du nouveau mot de passe | 286 | { |
251 | if(isset($_POST['nouveauMotdepasse']) && !empty($_POST['nouveauMotdepasse'])) | 287 | $error = 'bad_password'; |
288 | } | ||
289 | else | ||
252 | { | 290 | { |
253 | require('controller/Security.php'); | 291 | require('controller/Security.php'); |
254 | $newPassword = Security::secureString($_POST['nouveauMotdepasse']); | 292 | $newPassword = Security::secureString($_POST['nouveauMotdepasse']); |
255 | $newPassword = removeSpacesTabsCRLF($_POST['nouveauMotdepasse']); | 293 | $newPassword = removeSpacesTabsCRLF($_POST['nouveauMotdepasse']); |
256 | } | ||
257 | 294 | ||
258 | // bon mot de passe | 295 | if(isset($newPassword) && $newPassword !== $_POST['nouveauMotdepasse']) // erreur de conformité |
259 | if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse'] | 296 | { |
260 | && isset ($_POST["ancienMotdepasse"]) && testPassword($_POST["ancienMotdepasse"])) | 297 | $error = 'forbidden_characters'; |
261 | { | 298 | } |
262 | // enregistrement et confirmation | 299 | else |
263 | hashNewPassword($_POST["nouveauMotdepasse"]); | 300 | { |
264 | echo($message); | 301 | if(testPassword($_POST["ancienMotdepasse"])) |
302 | { | ||
303 | // enregistrement et confirmation | ||
304 | hashNewPassword($_POST["nouveauMotdepasse"]); | ||
305 | $success = true; | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | $error = 'bad_password'; | ||
310 | } | ||
311 | } | ||
265 | } | 312 | } |
266 | // mauvais mot de passe | 313 | |
267 | elseif(isset ($_POST["ancienMotdepasse"]) && !testPassword($_POST["ancienMotdepasse"])) | 314 | |
315 | // II - affichage | ||
316 | $title = "Nouveau mot de passe"; | ||
317 | $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; | ||
318 | |||
319 | require('view/password.php'); | ||
320 | |||
321 | echo($header); | ||
322 | if($error != '') | ||
268 | { | 323 | { |
269 | // défense aux attaques par force brute | ||
270 | // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site | ||
271 | echo($errorPassword); | ||
272 | sleep(1); | 324 | sleep(1); |
273 | echo($formulaireModifMDP); | 325 | echo($error_messages[$error]); |
274 | } | 326 | } |
275 | // erreur de conformité | 327 | elseif($success) |
276 | elseif(isset($newPassword) && $newPassword !== $_POST['nouveauMotdepasse']) | ||
277 | { | 328 | { |
278 | echo($errorBadCharacters); | 329 | echo($alertJSNewPassword); |
279 | echo($formulaireModifMDP); | ||
280 | } | 330 | } |
281 | // première arrivée sur la page | 331 | echo($formulaireModifMDP); |
282 | else | ||
283 | { | ||
284 | echo($formulaireModifMDP); | ||
285 | } | ||
286 | |||
287 | //echo($warning); | ||
288 | echo($footer); | 332 | echo($footer); |
289 | } | 333 | } |
290 | 334 | ||
291 | 335 | ||
292 | // hachage | ||
293 | function hashNewPassword(string $newPassword) | 336 | function hashNewPassword(string $newPassword) |
294 | { | 337 | { |
295 | // "réparation" des espaces accidentels | ||
296 | $newPassword= trim($newPassword); | ||
297 | // hachage | 338 | // hachage |
298 | $newHashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); | 339 | $newHashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); |
299 | 340 | ||
@@ -306,14 +347,9 @@ function hashNewPassword(string $newPassword) | |||
306 | 347 | ||
307 | function testPassword(string $password): bool | 348 | function testPassword(string $password): bool |
308 | { | 349 | { |
309 | // lecture | 350 | $hashedPassword = file_get_contents('data/password.txt'); |
310 | $oldHashedPassword = file_get_contents('data/password.txt'); | ||
311 | |||
312 | // "réparation" des espaces accidentels | ||
313 | $password= trim($password); | ||
314 | $oldHashedPassword = trim($oldHashedPassword); | ||
315 | 351 | ||
316 | if(password_verify($password, $oldHashedPassword)) | 352 | if(password_verify($password, $hashedPassword)) |
317 | { | 353 | { |
318 | return true; | 354 | return true; |
319 | } | 355 | } |
@@ -5,33 +5,19 @@ | |||
5 | // il traite les GET et passe la main aux contrôleurs | 5 | // il traite les GET et passe la main aux contrôleurs |
6 | 6 | ||
7 | declare(strict_types=1); | 7 | declare(strict_types=1); |
8 | session_start(); | ||
9 | 8 | ||
10 | // erreurs affichées au rechargement (ça concerne une partie des erreurs) | 9 | require('controller/cookies.php'); |
11 | if(!empty($_SESSION['erreur'])) | ||
12 | { | ||
13 | echo('<script>alert(\'' . $_SESSION['erreur'] . '\');</script>'); | ||
14 | unset($_SESSION['erreur']); | ||
15 | } | ||
16 | |||
17 | // variables globales, dépendances et config par l'utilisateur | ||
18 | require('controller/config.php'); | 10 | require('controller/config.php'); |
19 | |||
20 | // -> présence du data/password.txt? | ||
21 | require('controller/password.php'); | 11 | require('controller/password.php'); |
22 | |||
23 | // au premier démarrage du site (création du dossier "data") | ||
24 | require('controller/installation.php'); | 12 | require('controller/installation.php'); |
25 | installation(); | 13 | installation(); |
26 | 14 | ||
15 | |||
27 | // traitement des requêtes AJAX, execute exit() à la fin | 16 | // traitement des requêtes AJAX, execute exit() à la fin |
28 | require('controller/ajax.php'); | 17 | require('controller/ajax.php'); |
29 | 18 | ||
30 | |||
31 | // traitement des POST du ckeditor | 19 | // traitement des POST du ckeditor |
32 | // la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET | 20 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'submit' |
33 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | ||
34 | && isset($_GET['action']) && $_GET['action'] == 'submit' | ||
35 | // trois possibilités: on a un contenu HTML ou JSON ou les deux | 21 | // trois possibilités: on a un contenu HTML ou JSON ou les deux |
36 | && ((isset($_POST['contenu']) && $_POST['contenu'] != '') | 22 | && ((isset($_POST['contenu']) && $_POST['contenu'] != '') |
37 | || (isset($_POST['titre']) && isset($_POST['annee'])))) | 23 | || (isset($_POST['titre']) && isset($_POST['annee'])))) |
@@ -45,23 +31,20 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | |||
45 | require('model/Album.php'); | 31 | require('model/Album.php'); |
46 | } | 32 | } |
47 | 33 | ||
34 | // fonction "autonome", n'affiche rien puis redirige | ||
48 | submitCKeditor(); | 35 | submitCKeditor(); |
49 | } | 36 | } |
50 | 37 | ||
51 | 38 | ||
52 | // déconnexion | 39 | // déconnexion |
53 | if(isset($_GET['action']) && isset($_GET['page'])) | 40 | if(isset($_GET['action']) && isset($_GET['page']) && isset($_GET['action']) && $_GET['action'] === "deconnexion") |
54 | { | 41 | { |
55 | if($_GET['action'] == "deconnexion") | 42 | deleteCookie($cookie); |
56 | { | 43 | header("Location: index.php?page=" . $_GET['page']); |
57 | // on nettoie et on recharge | 44 | exit(); |
58 | $_SESSION['admin'] = 0; | ||
59 | header('Location: index.php?page=' . $_GET['page']); | ||
60 | } | ||
61 | } | 45 | } |
62 | 46 | ||
63 | 47 | ||
64 | |||
65 | // modèle | 48 | // modèle |
66 | if(isset($_GET['page'])) // utile? | 49 | if(isset($_GET['page'])) // utile? |
67 | { | 50 | { |
@@ -72,24 +55,16 @@ if(isset($_GET['page'])) // utile? | |||
72 | } | 55 | } |
73 | } | 56 | } |
74 | 57 | ||
75 | |||
76 | |||
77 | // contrôleurs | 58 | // contrôleurs |
78 | // mode visiteur (sans l'éditeur) | 59 | // mode visiteur (sans l'éditeur) |
79 | require('controller/visitor.php'); | 60 | require('controller/visitor.php'); |
80 | 61 | ||
81 | // contrôleur des pages en mode admin | 62 | // contrôleur des pages en mode admin |
82 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) | 63 | if(isset($_SESSION)) |
83 | { | 64 | { |
84 | // contrôleur en mode admin (= lecture/écriture) | 65 | // contrôleur en mode admin (= lecture/écriture) |
85 | require('controller/admin.php'); | 66 | require('controller/admin.php'); |
86 | } | 67 | } |
87 | else | ||
88 | { | ||
89 | // initialisation | ||
90 | $_SESSION['admin'] = 0; | ||
91 | } | ||
92 | |||
93 | 68 | ||
94 | 69 | ||
95 | // traitements des GET (page du site et action souhaitée) | 70 | // traitements des GET (page du site et action souhaitée) |
@@ -102,11 +77,6 @@ if(isset($_GET['page'])) | |||
102 | { | 77 | { |
103 | accueil(); | 78 | accueil(); |
104 | } | 79 | } |
105 | // page menu | ||
106 | /*elseif($_GET['page'] == 'menu') | ||
107 | { | ||
108 | menu(); | ||
109 | }*/ | ||
110 | // pages avec articles simples | 80 | // pages avec articles simples |
111 | elseif(in_array($_GET['page'], $pagesArticlesSimples)) | 81 | elseif(in_array($_GET['page'], $pagesArticlesSimples)) |
112 | { | 82 | { |
@@ -120,7 +90,7 @@ if(isset($_GET['page'])) | |||
120 | // avec plusieurs utilisateurs, il faut plus de sécurités | 90 | // avec plusieurs utilisateurs, il faut plus de sécurités |
121 | 91 | ||
122 | // rédaction | 92 | // rédaction |
123 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') | 93 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'editor') |
124 | { | 94 | { |
125 | // modification | 95 | // modification |
126 | if(isset($_GET['file_code']) || !empty($_GET['file_code'])) | 96 | if(isset($_GET['file_code']) || !empty($_GET['file_code'])) |
@@ -134,7 +104,7 @@ if(isset($_GET['page'])) | |||
134 | } | 104 | } |
135 | } | 105 | } |
136 | // modification d'un positions.json (version sans JS) | 106 | // modification d'un positions.json (version sans JS) |
137 | else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'monter') | 107 | elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'monter') |
138 | { | 108 | { |
139 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) | 109 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) |
140 | { | 110 | { |
@@ -147,7 +117,7 @@ if(isset($_GET['page'])) | |||
147 | $fonctionVisitor(); | 117 | $fonctionVisitor(); |
148 | } | 118 | } |
149 | } | 119 | } |
150 | else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'descendre') | 120 | elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'descendre') |
151 | { | 121 | { |
152 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) | 122 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) |
153 | { | 123 | { |
@@ -161,7 +131,7 @@ if(isset($_GET['page'])) | |||
161 | } | 131 | } |
162 | } | 132 | } |
163 | // suppression | 133 | // suppression |
164 | else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') | 134 | elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'suppression') |
165 | { | 135 | { |
166 | $fonctionEdit($_GET['file_code'], 1); | 136 | $fonctionEdit($_GET['file_code'], 1); |
167 | } | 137 | } |
@@ -176,7 +146,7 @@ if(isset($_GET['page'])) | |||
176 | elseif($_GET['page'] === 'discographie') | 146 | elseif($_GET['page'] === 'discographie') |
177 | { | 147 | { |
178 | // nouvel album | 148 | // nouvel album |
179 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') | 149 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'edition') |
180 | { | 150 | { |
181 | if(!isset($_GET['file_code']) || empty($_GET['file_code'])) | 151 | if(!isset($_GET['file_code']) || empty($_GET['file_code'])) |
182 | { | 152 | { |
@@ -191,7 +161,7 @@ if(isset($_GET['page'])) | |||
191 | } | 161 | } |
192 | } | 162 | } |
193 | // modification d'un positions.json (version sans JS) | 163 | // modification d'un positions.json (version sans JS) |
194 | elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'monter') | 164 | elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] === 'monter') |
195 | { | 165 | { |
196 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) | 166 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) |
197 | { | 167 | { |
@@ -204,7 +174,7 @@ if(isset($_GET['page'])) | |||
204 | discoVisitor(); | 174 | discoVisitor(); |
205 | } | 175 | } |
206 | } | 176 | } |
207 | elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'descendre') | 177 | elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] === 'descendre') |
208 | { | 178 | { |
209 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) | 179 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) |
210 | { | 180 | { |
@@ -218,7 +188,7 @@ if(isset($_GET['page'])) | |||
218 | } | 188 | } |
219 | } | 189 | } |
220 | // suppression | 190 | // suppression |
221 | else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') | 191 | else if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'suppression') |
222 | { | 192 | { |
223 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) | 193 | if(isset($_GET['file_code']) && !empty($_GET['file_code'])) |
224 | { | 194 | { |
@@ -243,18 +213,13 @@ if(isset($_GET['page'])) | |||
243 | header('Location: index.php?page=discographie'); | 213 | header('Location: index.php?page=discographie'); |
244 | } | 214 | } |
245 | 215 | ||
246 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') | 216 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'edition') |
247 | { | 217 | { |
248 | // modification | 218 | // modification |
249 | if(isset($_GET['file_code']) || !empty($_GET['file_code'])) | 219 | if(isset($_GET['file_code']) || !empty($_GET['file_code'])) |
250 | { | 220 | { |
251 | albumEdit($_GET['file_code'], 0); | 221 | albumEdit($_GET['file_code'], 0); |
252 | } | 222 | } |
253 | // suppression | ||
254 | else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') | ||
255 | { | ||
256 | albumEdit($_GET['file_code'], 1); | ||
257 | } | ||
258 | // on fait rien | 223 | // on fait rien |
259 | else | 224 | else |
260 | { | 225 | { |
@@ -285,9 +250,9 @@ if(isset($_GET['page'])) | |||
285 | 250 | ||
286 | // actions en mode admin depuis le menu orange | 251 | // actions en mode admin depuis le menu orange |
287 | // recharger une des pages principales | 252 | // recharger une des pages principales |
288 | elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) | 253 | elseif(isset($_SESSION) && isset($_GET['action'])) |
289 | { | 254 | { |
290 | if($_GET['action'] == 'modif_mdp') | 255 | if($_GET['action'] === 'modif_mdp') |
291 | { | 256 | { |
292 | changePassword(); | 257 | changePassword(); |
293 | } | 258 | } |
@@ -314,7 +279,7 @@ elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) | |||
314 | 279 | ||
315 | // à supprimer, on utilisera plutôt une variable de session | 280 | // à supprimer, on utilisera plutôt une variable de session |
316 | // renvoi ici par le .htaccess si lien mort ou sans http:// au début | 281 | // renvoi ici par le .htaccess si lien mort ou sans http:// au début |
317 | elseif(isset($_GET['erreur'])) | 282 | elseif(isset($_SESSION['erreur'])) |
318 | { | 283 | { |
319 | //if($_GET['erreur'] == 404) | 284 | //if($_GET['erreur'] == 404) |
320 | //{ | 285 | //{ |
diff --git a/public/css/menu.css b/public/css/menu.css index 957f6a5..cbafa00 100644 --- a/public/css/menu.css +++ b/public/css/menu.css | |||
@@ -21,7 +21,9 @@ | |||
21 | 21 | ||
22 | .sectionActu | 22 | .sectionActu |
23 | { | 23 | { |
24 | float: left; | 24 | /*float: left;*/ |
25 | display: flex; | ||
26 | /*justify-content: space-between;*/ | ||
25 | } | 27 | } |
26 | 28 | ||
27 | header h3 | 29 | header h3 |
@@ -32,9 +34,13 @@ header h3 | |||
32 | /*.articleActu > *:not(.boutonArticle)*/ | 34 | /*.articleActu > *:not(.boutonArticle)*/ |
33 | .articleActu | 35 | .articleActu |
34 | { | 36 | { |
35 | /*max-width: 50%;*/ | 37 | max-width: 80%; |
36 | margin: auto; | 38 | margin: auto; |
37 | } | 39 | } |
40 | .articleActu p | ||
41 | { | ||
42 | margin: 5px 0; | ||
43 | } | ||
38 | 44 | ||
39 | #contenu | 45 | #contenu |
40 | { | 46 | { |
@@ -78,10 +84,10 @@ header h3 | |||
78 | background-image: url("../mouette.png"); | 84 | background-image: url("../mouette.png"); |
79 | } | 85 | } |
80 | 86 | ||
81 | .articleActu | 87 | /*.articleActu |
82 | { | 88 | { |
83 | max-width: 50%; | 89 | max-width: 80%; |
84 | } | 90 | }*/ |
85 | 91 | ||
86 | #contenu | 92 | #contenu |
87 | { | 93 | { |
@@ -185,7 +191,7 @@ header h3 | |||
185 | 191 | ||
186 | .articleActu | 192 | .articleActu |
187 | { | 193 | { |
188 | max-width: 65%; | 194 | max-width: 85%; |
189 | } | 195 | } |
190 | 196 | ||
191 | #contenu | 197 | #contenu |
diff --git a/public/file_upload.js b/public/file_upload.js index 4102828..c24b798 100644 --- a/public/file_upload.js +++ b/public/file_upload.js | |||
@@ -1,21 +1,7 @@ | |||
1 | // public/file_upload.js | 1 | // public/file_upload.js |
2 | 2 | // | |
3 | // envoie d'un gros fichier ZIP en contournant la limite du php.ini | 3 | // envoie d'un gros fichier ZIP en contournant la limite du php.ini |
4 | // ce fichier est "caché", le serveur ne l'envoit qu'à | 4 | // ce fichier est "caché", il n'est envoyé qu'à un utilisateur connecté et sur la page "restauration" |
5 | // un utilisateur connecté et sur la page "restauration" | ||
6 | |||
7 | // retirer antislash dans le nom à l'upload d'une image | ||
8 | /*function filtrerAntislash() | ||
9 | { | ||
10 | var fileInfos = getFileInfo('upload'); // = ID | ||
11 | var chaine = fileInfos.name.replace('\\', '_'); | ||
12 | alert(document.getElementById('upload').files[0].name); | ||
13 | |||
14 | // ne marche pas, "name" est en lecture seule | ||
15 | document.getElementById('upload').files[0].name = chaine; | ||
16 | alert(document.getElementById('upload').files[0].name); | ||
17 | //return chaine; | ||
18 | }*/ | ||
19 | 5 | ||
20 | // -> input file onchange | 6 | // -> input file onchange |
21 | function sendFileSize() | 7 | function sendFileSize() |
@@ -106,8 +92,7 @@ function uploadChunksAJAX(chunksArray, tagId) | |||
106 | formData.append('blob', chunksArray[i]); | 92 | formData.append('blob', chunksArray[i]); |
107 | 93 | ||
108 | url = 'index.php?from=menu&action=restauration&chunk_name='+fileName+'_'+i; | 94 | url = 'index.php?from=menu&action=restauration&chunk_name='+fileName+'_'+i; |
109 | // false => synchrone, déprécié parce que fige le navigateur | 95 | // false => synchrone, déprécié parce que fige le navigateur, mais ici on s'en fout |
110 | // mais ici on s'en fout | ||
111 | xhr.open("POST", url, false); | 96 | xhr.open("POST", url, false); |
112 | xhr.send(formData); | 97 | xhr.send(formData); |
113 | 98 | ||
diff --git a/public/newspaper.png b/public/newspaper.png new file mode 100644 index 0000000..3945471 --- /dev/null +++ b/public/newspaper.png | |||
Binary files differ | |||
diff --git a/view/album.php b/view/album.php index 28b1b13..6fcca36 100644 --- a/view/album.php +++ b/view/album.php | |||
@@ -64,8 +64,7 @@ for($i = 0; $i < $Albums->fileListCount; $i++) | |||
64 | <?php | 64 | <?php |
65 | 65 | ||
66 | // formulaires et éditeur à la place de l'article à modifier | 66 | // formulaires et éditeur à la place de l'article à modifier |
67 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | 67 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] === 'edition') |
68 | && isset($_GET['action']) && $_GET['action'] === 'edition') | ||
69 | { | 68 | { |
70 | $style = 'class="articleAvecEditeur"'; | 69 | $style = 'class="articleAvecEditeur"'; |
71 | ?> | 70 | ?> |
@@ -95,7 +94,7 @@ else | |||
95 | <?php | 94 | <?php |
96 | // boutons modifier et supprimer, mais pas monter ni descendre | 95 | // boutons modifier et supprimer, mais pas monter ni descendre |
97 | // modifier ouvre l'éditeur, supprimer renvoie vers la discographie | 96 | // modifier ouvre l'éditeur, supprimer renvoie vers la discographie |
98 | if($_SESSION['admin'] == 1 && (!isset($_GET['action']) || $_GET['action'] !== 'edition')) | 97 | if(isset($_SESSION) && (!isset($_GET['action']) || $_GET['action'] !== 'edition')) |
99 | { | 98 | { |
100 | ?> | 99 | ?> |
101 | <a class="infobulle" href="index.php?page=album&action=edition&file_code=<?= $fileCode ?>" > | 100 | <a class="infobulle" href="index.php?page=album&action=edition&file_code=<?= $fileCode ?>" > |
diff --git a/view/articlesContent.php b/view/articlesContent.php index 7abc289..8ec7f70 100644 --- a/view/articlesContent.php +++ b/view/articlesContent.php | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | // tampon pour $articlesContent | 4 | // tampon pour $articlesContent |
5 | ob_start(); | 5 | ob_start(); |
6 | if($_SESSION['admin'] == 1) | 6 | if(isset($_SESSION)) |
7 | { | 7 | { |
8 | // à la place du bouton après rechargement | 8 | // à la place du bouton après rechargement |
9 | if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['file_code'])) | 9 | if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['file_code'])) |
@@ -64,7 +64,7 @@ for($i = 0; $i < $Articles->fileListCount; $i++) | |||
64 | global $host; | 64 | global $host; |
65 | 65 | ||
66 | // remplacer un article par l'éditeur | 66 | // remplacer un article par l'éditeur |
67 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['file_code']) | 67 | if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['file_code']) |
68 | && $_GET['file_code'] == $Articles->fileList[$i]['fileCode'] | 68 | && $_GET['file_code'] == $Articles->fileList[$i]['fileCode'] |
69 | ) | 69 | ) |
70 | { | 70 | { |
@@ -85,14 +85,14 @@ for($i = 0; $i < $Articles->fileListCount; $i++) | |||
85 | echo($Articles->fileList[$i]['content'] . "\n"); | 85 | echo($Articles->fileList[$i]['content'] . "\n"); |
86 | ?> | 86 | ?> |
87 | </div> | 87 | </div> |
88 | <p class="boutonArticle" > | 88 | <p> |
89 | <a class="infobulle" href="<?= $lien_partage ?>" > | 89 | <a class="infobulle" href="<?= $lien_partage ?>" > |
90 | <img src="public/icone_partager.png" onclick="copierDansPressePapier('<?= $host ?>/<?= $lien_partage ?>')" alt="bouton"> | 90 | <img src="public/icone_partager.png" onclick="copierDansPressePapier('<?= $host ?>/<?= $lien_partage ?>')" alt="bouton"> |
91 | <button>Partager</button> | 91 | <button>Partager</button> |
92 | </a> | 92 | </a> |
93 | <?php | 93 | <?php |
94 | // bouton | 94 | // bouton |
95 | if($_SESSION['admin'] == 1) | 95 | if(isset($_SESSION)) |
96 | { | 96 | { |
97 | ?> | 97 | ?> |
98 | <a class="infobulle" href="index.php?page=<?= $page ?>&action=editor&file_code=<?= $Articles->fileList[$i]['fileCode'] ?>#<?= $Articles->fileList[$i]['fileCode'] ?>" > | 98 | <a class="infobulle" href="index.php?page=<?= $page ?>&action=editor&file_code=<?= $Articles->fileList[$i]['fileCode'] ?>#<?= $Articles->fileList[$i]['fileCode'] ?>" > |
diff --git a/view/backup.php b/view/backup.php index 8461543..78e2d04 100644 --- a/view/backup.php +++ b/view/backup.php | |||
@@ -28,7 +28,7 @@ if(isset($_GET['action']) && $_GET['action'] == 'sauvegarde') | |||
28 | <h2>Sauvegarde complète</h2> | 28 | <h2>Sauvegarde complète</h2> |
29 | <p>Toutes les données du sites (textes, photos) ont été rassemblées dans un unique fichier que vous pouvez conserver si vous le souhaitez sur votre ordinateur.</p> | 29 | <p>Toutes les données du sites (textes, photos) ont été rassemblées dans un unique fichier que vous pouvez conserver si vous le souhaitez sur votre ordinateur.</p> |
30 | <p>Vous pourrez l'utiliser plus tard pour restaurer le site dans l'état où il se trouve aujourd'hui ou pour récupérer des fichiers effacés ou perdus. Ce fichier sera utile dans le cas d'une migration (déplacement du site, changement d'hébergeur), d'un problème affectant le serveur, ou encore d'une mauvaise manipulation.</p> | 30 | <p>Vous pourrez l'utiliser plus tard pour restaurer le site dans l'état où il se trouve aujourd'hui ou pour récupérer des fichiers effacés ou perdus. Ce fichier sera utile dans le cas d'une migration (déplacement du site, changement d'hébergeur), d'un problème affectant le serveur, ou encore d'une mauvaise manipulation.</p> |
31 | <p style="color: red;" >Veuillez noter que votre mot de passe ne sera pas conservé. Dans le cas d'une migration, il vous sera proposé d'en créer un nouveau.</p> | 31 | <p style="color: red;" >Veuillez noter que votre mot de passe n'est pas inclu dans la sauvegarde. Dans le cas d'une migration, il vous sera proposé d'en créer un nouveau.</p> |
32 | <p>Ce fichier se nomme <i><?= $nomFichier ?></i></p> | 32 | <p>Ce fichier se nomme <i><?= $nomFichier ?></i></p> |
33 | 33 | ||
34 | <button class="boutonBackup" ><a href="data/<?= $nomFichier ?>" >Le télécharger</a></button> | 34 | <button class="boutonBackup" ><a href="data/<?= $nomFichier ?>" >Le télécharger</a></button> |
diff --git a/view/discographie.php b/view/discographie.php index 6e560af..84358db 100644 --- a/view/discographie.php +++ b/view/discographie.php | |||
@@ -66,7 +66,7 @@ for($i = 0; $i < $Albums->fileListCount; $i++) | |||
66 | <section> | 66 | <section> |
67 | <?php | 67 | <?php |
68 | // éditeur ou bouton "Nouvel album" | 68 | // éditeur ou bouton "Nouvel album" |
69 | if($_SESSION['admin'] == 1) | 69 | if(isset($_SESSION)) |
70 | { | 70 | { |
71 | if(isset($_GET['action']) && $_GET['action'] === 'edition' && $fileCode === '') | 71 | if(isset($_GET['action']) && $_GET['action'] === 'edition' && $fileCode === '') |
72 | { | 72 | { |
@@ -103,53 +103,31 @@ if($_SESSION['admin'] == 1) | |||
103 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) | 103 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) |
104 | for($i = 0; $i < $Albums->fileListCount; $i++) | 104 | for($i = 0; $i < $Albums->fileListCount; $i++) |
105 | { | 105 | { |
106 | // article modifié sur fond coloré | ||
107 | if(isset($fileCode) && $Albums->fileList[$i]['fileCode'] == $fileCode) | ||
108 | { | ||
109 | $style = 'class="articleAvecEditeur"'; | ||
110 | } | ||
111 | else | ||
112 | { | ||
113 | $style = 'class="articleSansEditeur"'; | ||
114 | } | ||
115 | ?> | 106 | ?> |
116 | <article id="<?= $Albums->fileList[$i]['fileCode'] ?>" <?= $style ?>> | 107 | <article id="<?= $Albums->fileList[$i]['fileCode'] ?>" class="articleSansEditeur"> |
117 | <?php | 108 | <?php |
118 | // formulaires et éditeur à la place de l'article à modifier | 109 | // mettre une adresse + cadre bleu lorsqu'un fichier html existe |
119 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | 110 | if($avecLien[$i]) |
120 | && isset($_GET['action']) && $_GET['action'] === 'edition' | ||
121 | && $Albums->fileList[$i]['fileCode'] == $fileCode) | ||
122 | { | 111 | { |
123 | ?> | ||
124 | <h3>Modifier un album</h3> | ||
125 | <?= $editeurHTML ?> | ||
126 | <?php | ||
127 | } | ||
128 | // affichage normal | ||
129 | else | ||
130 | { | ||
131 | // mettre une adresse lorsqu'un fichier html existe | ||
132 | if($avecLien[$i]) | ||
133 | { | ||
134 | ?> | 112 | ?> |
135 | <a href="index.php?<?= $lienAlbum[$i] ?>" > | 113 | <a href="index.php?<?= $lienAlbum[$i] ?>" > |
136 | <?php | 114 | <?php |
137 | } | 115 | } |
138 | ?> | 116 | ?> |
139 | <figure> | 117 | <figure> |
140 | <img src="data/discographie/images-mini/<?= $Albums->fileList[$i]['pochetteMini'] ?>" alt="" > | 118 | <img src="data/discographie/images-mini/<?= $Albums->fileList[$i]['pochetteMini'] ?>" alt="" > |
141 | <figcaption><?= $Albums->fileList[$i]['titre'] ?><br><?= $Albums->fileList[$i]['annee'] ?></figcaption> | 119 | <figcaption><?= $Albums->fileList[$i]['titre'] ?><br><?= $Albums->fileList[$i]['annee'] ?></figcaption> |
142 | </figure> | 120 | </figure> |
143 | <?php | 121 | <?php |
144 | if($avecLien[$i]) | 122 | if($avecLien[$i]) |
145 | { | 123 | { |
146 | ?> | 124 | ?> |
147 | </a> | 125 | </a> |
148 | <?php | 126 | <?php |
149 | } | 127 | } |
150 | // boutons | 128 | // boutons |
151 | if($_SESSION['admin'] == 1) | 129 | if(isset($_SESSION)) |
152 | { | 130 | { |
153 | ?> | 131 | ?> |
154 | <p> | 132 | <p> |
155 | <a class="infobulle" href="index.php?<?= $lienBoutonModif[$i] ?>" > | 133 | <a class="infobulle" href="index.php?<?= $lienBoutonModif[$i] ?>" > |
@@ -170,7 +148,6 @@ for($i = 0; $i < $Albums->fileListCount; $i++) | |||
170 | </a> | 148 | </a> |
171 | </p> | 149 | </p> |
172 | <?php | 150 | <?php |
173 | } | ||
174 | } | 151 | } |
175 | ?> | 152 | ?> |
176 | </article> | 153 | </article> |
diff --git a/view/pageArticlesSimples.php b/view/pageArticlesSimples.php index 8758373..d282964 100644 --- a/view/pageArticlesSimples.php +++ b/view/pageArticlesSimples.php | |||
@@ -66,8 +66,10 @@ echo "\n"; | |||
66 | if($page == 'menu' && !empty($ArticlesContent)) | 66 | if($page == 'menu' && !empty($ArticlesContent)) |
67 | { | 67 | { |
68 | ?> | 68 | ?> |
69 | <div> | 69 | <div class="sectionActu"> |
70 | <h3 class="sectionActu">Actualité</h3> | 70 | <div style="max-width: 20%;"> |
71 | <img src="public/newspaper.png"> | ||
72 | </div> | ||
71 | <div> | 73 | <div> |
72 | <?= $ArticlesContent ?> | 74 | <?= $ArticlesContent ?> |
73 | </div> | 75 | </div> |
diff --git a/view/password.php b/view/password.php index 6302950..ae153b5 100644 --- a/view/password.php +++ b/view/password.php | |||
@@ -47,7 +47,6 @@ ob_start(); | |||
47 | $formulaireNouveauMDP = ob_get_clean(); | 47 | $formulaireNouveauMDP = ob_get_clean(); |
48 | 48 | ||
49 | // formulaire changement de mot de passe | 49 | // formulaire changement de mot de passe |
50 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle | ||
51 | ob_start(); | 50 | ob_start(); |
52 | ?> | 51 | ?> |
53 | <form class="connexionFormulaire" method="post" action="index.php?from=<?= $_GET['from'] ?>&action=modif_mdp" > | 52 | <form class="connexionFormulaire" method="post" action="index.php?from=<?= $_GET['from'] ?>&action=modif_mdp" > |
@@ -64,7 +63,6 @@ ob_start(); | |||
64 | <?php | 63 | <?php |
65 | $formulaireModifMDP = ob_get_clean(); | 64 | $formulaireModifMDP = ob_get_clean(); |
66 | 65 | ||
67 | |||
68 | // en-tête | 66 | // en-tête |
69 | ob_start(); | 67 | ob_start(); |
70 | ?> | 68 | ?> |
@@ -91,15 +89,20 @@ ob_start(); | |||
91 | $header = ob_get_clean(); | 89 | $header = ob_get_clean(); |
92 | 90 | ||
93 | 91 | ||
94 | // messages d'erreur | 92 | $error_messages = [ |
95 | $errorPassword = '<p class="avertissement" >Mauvais mot de passe</p>'; | 93 | 'error_non_valid_captcha' => '<p class="avertissement" >Erreur au test anti-robot, veuillez saisir un nombre entier.</p>', |
96 | $errorNonValidCaptcha = '<p class="avertissement" >Captcha non valide, veuillez saisir un nombre entier.</p>'; | 94 | 'bad_solution_captcha' => '<p class="avertissement" >Erreur au test anti-robot, veuillez réessayer.</p>', |
97 | $errorCaptcha = '<p class="avertissement" >Erreur au test anti-robot</p>'; | 95 | 'bad_password' => '<p class="avertissement" >Mauvais mot de passe, veuillez réessayer.</p>', |
98 | $errorBadCharacters = '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>'; | 96 | 'forbidden_characters' => '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>' |
99 | $messageDeconnect = "<p class='connexionP connexionFooter' ><i>N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.</i></p>"; | 97 | ]; |
100 | 98 | ||
101 | // avertissement | 99 | $warning_messages = [ |
102 | $warning = '<p class="avertissement" >Rappel de sécurité<br />Vous n\'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!</p>'; | 100 | 'message_disconnect' => "<p class='connexionP' ><i>N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.</i></p>", |
101 | 'message_cookie' => "<p class='connexionP' style='color: red;'>Ce site utilisera un cookie « obligatoire » dès que vous serez connecté.<br>Il sera supprimé à votre déconnexion ou dès que vous aurez quitté le site.</p>", | ||
102 | // est un espace insécable | ||
103 | 'private_browsing' =>"<p class='connexionP' >Au fait? Vous n'utilisez pas votre propre ordinateur ou téléphone?<br/> | ||
104 | Utilisez la navigation privée.</p>" | ||
105 | ]; | ||
103 | 106 | ||
104 | 107 | ||
105 | // confirmation modification du mot de passe | 108 | // confirmation modification du mot de passe |
@@ -111,16 +114,20 @@ ob_start(); | |||
111 | <a href="index.php" >Retour au site.</a><br></p> | 114 | <a href="index.php" >Retour au site.</a><br></p> |
112 | </noscript> | 115 | </noscript> |
113 | <?php | 116 | <?php |
114 | $message = ob_get_clean(); | 117 | $alertJSNewPassword = ob_get_clean(); |
115 | 118 | ||
116 | 119 | ||
117 | // pied de page | 120 | // pied de page |
121 | if(isset($_GET['from'])) | ||
122 | { | ||
123 | $page = '?page=' . $_GET['from']; | ||
124 | } | ||
118 | ob_start(); | 125 | ob_start(); |
119 | if(isset($_GET['page'])) // exclue la "création du mot de passe" | 126 | if(isset($_GET['page'])) // exclue la "création du mot de passe" |
120 | { | 127 | { |
121 | ?> | 128 | ?> |
122 | <p class="connexionP connexionFooter" > | 129 | <p class="connexionP connexionFooter" > |
123 | <a href="index.php?from=<?= $_GET['from'] ?>" > | 130 | <a href="index.php<?= $page ?>" > |
124 | <button>Retour au site.</button> | 131 | <button>Retour au site.</button> |
125 | </a> | 132 | </a> |
126 | </p> | 133 | </p> |
diff --git a/view/template.php b/view/template.php index 2a4d182..dfe68bd 100644 --- a/view/template.php +++ b/view/template.php | |||
@@ -53,7 +53,7 @@ if($page != "accueil") | |||
53 | } | 53 | } |
54 | 54 | ||
55 | // lien vers le mode admin | 55 | // lien vers le mode admin |
56 | if($_SESSION['admin'] == 0 && isset($_GET['page']) && $_GET['page'] != 'accueil') | 56 | if(!isset($_SESSION) && isset($_GET['page']) && $_GET['page'] != 'accueil') |
57 | { | 57 | { |
58 | ?> | 58 | ?> |
59 | <div id="lienModeAdmin" > | 59 | <div id="lienModeAdmin" > |
@@ -63,7 +63,7 @@ if($_SESSION['admin'] == 0 && isset($_GET['page']) && $_GET['page'] != 'accueil' | |||
63 | } | 63 | } |
64 | 64 | ||
65 | // actions en mode admin | 65 | // actions en mode admin |
66 | if($_SESSION['admin'] == 1) | 66 | if(isset($_SESSION)) |
67 | { | 67 | { |
68 | ?> | 68 | ?> |
69 | <!-- zone superposée par les commandes du mode admin --> | 69 | <!-- zone superposée par les commandes du mode admin --> |