summaryrefslogtreecommitdiff
path: root/src/controller/password.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/controller/password.php')
-rw-r--r--src/controller/password.php328
1 files changed, 0 insertions, 328 deletions
diff --git a/src/controller/password.php b/src/controller/password.php
deleted file mode 100644
index 3d003da..0000000
--- a/src/controller/password.php
+++ /dev/null
@@ -1,328 +0,0 @@
1<?php
2// src/controller/password.php
3//
4// test mot de passe et captcha
5
6declare(strict_types=1);
7
8use Doctrine\ORM\EntityManager;
9use App\Entity\User;
10use App\Entity\Log;
11
12// exécutée dans installation.php à l'ouverture de chaque page
13function existUsers(EntityManager $entityManager)
14{
15 // lecture
16 $users = $entityManager->getRepository(User::class)->findAll();
17
18 // cas particulier table vide
19 if(count($users) === 0)
20 {
21 $_GET = [];
22 $_SESSION['user'] = '';
23 $_SESSION['admin'] = false;
24
25 // création d'un utilisateur, puis rechargement de la page
26 createPassword($entityManager);
27 }
28}
29
30
31function createPassword(EntityManager $entityManager)
32{
33 // fonction exécutée à priori deux fois d'affilée: affichage puis traitement de la saisie
34
35 unset($_SESSION['user']);
36
37 $captcha_solution = (isset($_SESSION['captcha']) && is_int($_SESSION['captcha'])) ? $_SESSION['captcha'] : 0;
38 $captcha_try = isset($_POST['captcha']) ? Captcha::controlInput($_POST['captcha']) : 0;
39
40 // II - traitement
41 $error = '';
42 if(!isset($_POST['captcha'])) // page création d'un compte rechargée
43 {
44 //$error = '';
45 }
46 elseif($captcha_try == 0)
47 {
48 $error = 'error_non_valid_captcha';
49 }
50 elseif($captcha_solution == 0)
51 {
52 //$error = '';
53 }
54 elseif($captcha_try != $captcha_solution) // le test!
55 {
56 $error = 'bad_solution_captcha';
57 }
58 elseif(!isset($_POST['password']) || empty($_POST['password'])
59 || (!isset($_POST['login']) || empty($_POST['login'])))
60 {
61 $error = 'bad_login_or_password';
62 }
63 else
64 {
65 $login = Security::secureString($_POST['login']);
66 $password = Security::secureString($_POST['password']);
67
68 // -> prévenir la validation par erreur d'une chaine "vide"
69 $login = removeSpacesTabsCRLF($login);
70 $password = removeSpacesTabsCRLF($password);
71
72 // conformité
73 if(isset($password) && isset($login)
74 && $password == $_POST['password'] && $login == $_POST['login'])
75 {
76 unset($_SESSION['captcha']);
77
78 // enregistrement et redirection
79 $password = password_hash($password, PASSWORD_DEFAULT);
80 $user = new App\Entity\User($login, $password);
81 $entityManager->persist($user);
82 $entityManager->flush();
83
84 header('Location: ' . new URL);
85 exit();
86 }
87 else
88 {
89 $error = 'bad_login_or_password';
90
91 // compteur dans la session et blocage de compte
92 }
93 }
94
95 // inséré dans $captchaHtml puis dans $formulaireNouveauMDP
96 $captcha = new Captcha;
97 // enregistrement de la réponse du captcha pour vérification
98 $_SESSION['captcha'] = $captcha->getSolution();
99
100
101 // I - affichage
102 $title = 'Bienvenue nageur bigouden';
103 $subHeading = 'Veuillez choisir les codes que vous utiliserez pour gérer le site.';
104
105 // même vue que la fonction changerMotDePasse()
106 require('../src/view/password.php');
107
108 echo($header);
109 if($error != '')
110 {
111 sleep(1);
112 echo($error_messages[$error]);
113 }
114 echo($formulaireNouveauMDP);
115 echo($error_messages['forbidden_characters']);
116 echo($footer);
117 die;
118}
119
120
121function connect(LoginBuilder $builder, EntityManager $entityManager)
122{
123 // déjà connecté
124 if($_SESSION['admin'])
125 {
126 header('Location: ' . new URL);
127 die;
128 }
129
130 // II - traitement
131 $_SESSION['user'] = '';
132 $_SESSION['admin'] = false;
133
134 $captcha_solution = (isset($_SESSION['captcha']) && is_int($_SESSION['captcha'])) ? $_SESSION['captcha'] : 0;
135 $captcha_try = isset($_POST['captcha']) ? Captcha::controlInput($_POST['captcha']) : 0;
136
137 $error = '';
138 if(!isset($_POST['captcha'])) // page rechargée
139 {
140 //$error = '';
141 }
142 elseif($captcha_try == 0)
143 {
144 $error = 'error_non_valid_captcha';
145 }
146 elseif($captcha_solution == 0)
147 {
148 //$error = '';
149 }
150 elseif($captcha_try != $captcha_solution) // le test!
151 {
152 $error = 'bad_solution_captcha';
153 }
154 elseif(!isset($_POST['login']) || empty($_POST['login'])
155 || !isset($_POST['password']) || empty($_POST['password']))
156 {
157 $error = 'bad_login_or_password';
158 }
159 else // c'est OK
160 {
161 $login = Security::secureString($_POST['login']);
162 $password = Security::secureString($_POST['password']);
163 $user = getUser($login, $entityManager);
164
165 // enregistrement et redirection
166 if(!empty($user) && $login === $user->getLogin() && password_verify($password, $user->getPassword()))
167 {
168 $log = new Log(true);
169 $entityManager->persist($log);
170 $entityManager->flush();
171
172 session_regenerate_id(true); // protection fixation de session, si l'attaquant a créé un cookie de session (attaque XSS), il est remplacé
173 //unset($_SESSION['captcha']);
174 $_SESSION['user'] = $login;
175 $_SESSION['admin'] = true;
176 $link = new URL(isset($_GET['from']) ? ['page' => $_GET['from']] : []);
177 isset($_GET['id']) ? $link->addParams(['id' => $_GET['id']]) : '';
178 header('Location: ' . $link);
179 die;
180 }
181 else
182 {
183 $log = new Log(false);
184 $entityManager->persist($log);
185 $entityManager->flush();
186 $error = 'bad_login_or_password';
187 }
188 }
189
190 // inséré dans $captchaHtml puis dans $formulaireNouveauMDP
191 $captcha = new Captcha;
192 // enregistrement de la réponse du captcha pour vérification
193 $_SESSION['captcha'] = $captcha->getSolution(); // int
194
195 // I - affichage
196 $title = "Connexion";
197 $subHeading = "Veuillez saisir votre identifiant (e-mail) et votre mot de passe.";
198
199 require('../src/view/password.php');
200
201 //$builder->addHTML($header);
202 if($error != '')
203 {
204 sleep(1);
205 $builder->addHTML($error_messages[$error]);
206 }
207 $builder->addHTML($formulaireConnexion);
208 //$builder->addHTML($warning_messages['message_cookie']);
209 $builder->addHTML($warning_messages['private_browsing']);
210 $builder->addHTML($footer);
211
212 //die;
213}
214
215
216function changePassword(EntityManager $entityManager): void
217{
218 // fonction exécutée à priori deux fois d'affilée: affichage puis traitement de la saisie
219
220 // II - traitement
221 $error = '';
222 $success = false;
223 if(empty($_POST)) // première fois ou page rechargée
224 {
225 //
226 }
227 elseif(!isset($_POST['login']) || empty($_POST['login'])
228 || !isset($_POST['old_password']) || empty($_POST['old_password'])
229 || !isset($_POST['new_password']) || empty($_POST['new_password'])
230 || !isset($_POST['modify_password_hidden']) || !empty($_POST['modify_password_hidden']))
231 {
232 $error = 'bad_login_or_password';
233 }
234 else
235 {
236 // sécurisation de la saisie
237 $new_password = Security::secureString($_POST['new_password']);
238 $login = Security::secureString($_POST['login']);
239 $old_password = Security::secureString($_POST['old_password']);
240
241 // éviter d'enregistrer une chaîne vide
242 $new_password = removeSpacesTabsCRLF($new_password);
243
244 // tests de conformité
245 if($login != $_POST['login'] || $old_password != $_POST['old_password'] || $new_password != $_POST['new_password'])
246 {
247 $error = 'forbidden_characters';
248 }
249 elseif($login !== $_SESSION['user']){
250 $error = 'bad_login_or_password';
251 }
252 else
253 {
254 $user = getUser($login, $entityManager);
255
256 if(password_verify($old_password, $user->getPassword()))
257 {
258 // enregistrement et redirection
259 $new_password = password_hash($new_password, PASSWORD_DEFAULT);
260 $user->setPassword($new_password);
261 $entityManager->flush();
262 $success = true;
263 }
264 else
265 {
266 $error = 'bad_login_or_password';
267 }
268 }
269 }
270
271
272 // I - affichage
273 $title = "Nouveau mot de passe";
274 $subHeading = "Veuillez vous identifier à nouveau puis saisir votre nouveau mot de passe.";
275
276 require('../src/view/password.php');
277
278 echo($header);
279 if($error != '')
280 {
281 sleep(1); // sécurité TRÈS insuffisante à la force brute
282 echo($error_messages[$error]);
283 }
284 elseif($success)
285 {
286 $success = false;
287 echo($alertJSNewPassword);
288 //header("Location: " . new URL(['page' => $_GET['from']])); // choisir "location" entre PHP et JS
289 die;
290 }
291 echo($formulaireModifMDP);
292 echo($footer);
293 die;
294}
295
296
297function getUser(string $login, EntityManager $entityManager): ?User
298{
299 $users = $entityManager->getRepository('App\Entity\User')->findBy(['login' => $login]);
300
301 if(count($users) === 0)
302 {
303 $_SESSION['user'] = '';
304 $_SESSION['admin'] = false;
305 }
306
307 foreach($users as $user)
308 {
309 if($user->getLogin() === $login)
310 {
311 return $user;
312 }
313 }
314 return null;
315}
316
317
318function disconnect()
319{
320 // nettoyage complet
321 $_SESSION = []; // mémoire vive
322 session_destroy(); // fichier côté serveur
323 setcookie('PHPSESSID', '', time() - 4200, '/'); // cookie de session
324 $link = new URL(['page' => $_GET['page']]);
325 isset($_GET['id']) ? $link->addParams(['id' => $_GET['id']]) : '';
326 header('Location: ' . $link);
327 die;
328} \ No newline at end of file