summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2024-02-08 04:31:14 +0100
committerpolo <ordipolo@gmx.fr>2024-02-08 04:31:14 +0100
commitccc9a05b758f1dc0313b96807edfc447a9e8d278 (patch)
tree114808e506b2bedabdc3ad09770edd7e5eb64e81
parent1ad47a7ca38e679a50c8dfee004db88b1633d7cf (diff)
downloadmelaine-ccc9a05b758f1dc0313b96807edfc447a9e8d278.zip
RGPD cookie uniquement en mode admin et avertissement, logo journal
-rw-r--r--controller/ajax.php15
-rw-r--r--controller/backup.php8
-rw-r--r--controller/ckeditor.php7
-rw-r--r--controller/config.php4
-rw-r--r--controller/cookies.php66
-rw-r--r--controller/installation.php15
-rw-r--r--controller/password.php346
-rw-r--r--index.php77
-rw-r--r--public/css/menu.css18
-rw-r--r--public/file_upload.js21
-rw-r--r--public/newspaper.pngbin0 -> 39185 bytes
-rw-r--r--view/album.php5
-rw-r--r--view/articlesContent.php8
-rw-r--r--view/backup.php2
-rw-r--r--view/discographie.php45
-rw-r--r--view/pageArticlesSimples.php6
-rw-r--r--view/password.php31
-rw-r--r--view/template.php4
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
8if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') 9if(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_
48if(isset($_GET['action']) && $_GET['action'] == 'restauration' 48if(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'
65if(isset($_GET['action']) && $_GET['action'] == 'restauration' 63if(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
83if(!isset($_GET['action']) || $_GET['action'] != 'restauration') 80if(!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
210function uploadChunkAndMerge() 210function 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
58function submitCKeditor() 59function 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
39if(extension_loaded("zip")) 39if(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
51function returnBytes ($size_str) // chaine du style '2M' 51function 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';
6if(isset($_COOKIE[$cookie]))
7{
8 deleteCookie($cookie);
9 header("Location: index.php");
10 exit();
11}
12
13// session_start()
14$cookie = 'session_admin';
15if(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à?)
50if(isset($_SESSION['erreur']) && !empty($_SESSION['erreur']))
51{
52 echo('<script>alert(\'' . $_SESSION['erreur'] . '\');</script>');
53 unset($_SESSION['erreur']);
54}
55
56
57function 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
5function installation() 7function 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
139function createIndexPHP($path, $droitsFichiers) 148function 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
5function existPassword() 7function 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
91function createPassword() 95function 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
167function connect() 178function 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 256function 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
234function changePassword() 268function 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
293function hashNewPassword(string $newPassword) 336function 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
307function testPassword(string $password): bool 348function 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 }
diff --git a/index.php b/index.php
index 2d86f58..182f931 100644
--- a/index.php
+++ b/index.php
@@ -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
7declare(strict_types=1); 7declare(strict_types=1);
8session_start();
9 8
10// erreurs affichées au rechargement (ça concerne une partie des erreurs) 9require('controller/cookies.php');
11if(!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
18require('controller/config.php'); 10require('controller/config.php');
19
20// -> présence du data/password.txt?
21require('controller/password.php'); 11require('controller/password.php');
22
23// au premier démarrage du site (création du dossier "data")
24require('controller/installation.php'); 12require('controller/installation.php');
25installation(); 13installation();
26 14
15
27// traitement des requêtes AJAX, execute exit() à la fin 16// traitement des requêtes AJAX, execute exit() à la fin
28require('controller/ajax.php'); 17require('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 20if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'submit'
33if(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
53if(isset($_GET['action']) && isset($_GET['page'])) 40if(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
66if(isset($_GET['page'])) // utile? 49if(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)
79require('controller/visitor.php'); 60require('controller/visitor.php');
80 61
81// contrôleur des pages en mode admin 62// contrôleur des pages en mode admin
82if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) 63if(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}
87else
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
288elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) 253elseif(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
317elseif(isset($_GET['erreur'])) 282elseif(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
27header h3 29header 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
21function sendFileSize() 7function 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
67if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 67if(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
98if($_SESSION['admin'] == 1 && (!isset($_GET['action']) || $_GET['action'] !== 'edition')) 97if(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
5ob_start(); 5ob_start();
6if($_SESSION['admin'] == 1) 6if(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"
69if($_SESSION['admin'] == 1) 69if(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--)
104for($i = 0; $i < $Albums->fileListCount; $i++) 104for($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";
66if($page == 'menu' && !empty($ArticlesContent)) 66if($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
51ob_start(); 50ob_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
69ob_start(); 67ob_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
121if(isset($_GET['from']))
122{
123 $page = '?page=' . $_GET['from'];
124}
118ob_start(); 125ob_start();
119if(isset($_GET['page'])) // exclue la "création du mot de passe" 126if(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
56if($_SESSION['admin'] == 0 && isset($_GET['page']) && $_GET['page'] != 'accueil') 56if(!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
66if($_SESSION['admin'] == 1) 66if(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 -->