diff --git a/.htaccess b/.htaccess index ac61a1f..3a134f2 100644 --- a/.htaccess +++ b/.htaccess @@ -13,6 +13,8 @@ RewriteRule ^ajouter_organisateur$ server_files/ajouter_organisateur.php [L] RewriteRule ^ajouter_tournoi$ server_files/ajouter_tournoi.php [L] RewriteRule ^confirmer_mail/(.*?)$ server_files/confirmer_mail.php?token=$1 [L] RewriteRule ^connexion$ server_files/connexion.php [L] +RewriteRule ^connexion/reinitialiser_mdp/(.*?)$ server_files/connexion.php?reset_password&token=$1 [L] +RewriteRule ^connexion/(.*?)$ server_files/connexion.php?$1 [L] RewriteRule ^deconnexion$ server_files/deconnexion.php [L] RewriteRule ^equipe/(.*?)$ server_files/equipe.php?trigram=$1 [L] RewriteRule ^file/(.*?)$ server_files/view_file.php?file_id=$1 [L] diff --git a/server_files/connexion.php b/server_files/connexion.php index 189ddae..82d7f18 100644 --- a/server_files/connexion.php +++ b/server_files/connexion.php @@ -6,6 +6,21 @@ if (isset($_POST["submitted"]) && !isset($_SESSION["user_id"])) { $error_message = login(); } +if (isset($_POST["forgotten_password"]) && !isset($_SESSION["user_id"])) { + $error_message = recuperateAccount(); +} + +if (isset($_GET["reset_password"]) && isset($_GET["token"]) && !isset($_SESSION["user_id"])) { + $reset_data = $DB->query("SELECT `id`, `email` FROM `users` WHERE `forgotten_password` = '" . htmlspecialchars($_GET["token"]) . "';")->fetch(); + if ($reset_data === FALSE) { + header("Location: $URL_BASE/connexion"); + exit(); + } + + if (isset($_POST["reset_password"])) + $error_message = resetPassword(); +} + function login() { global $DB, $YEAR; @@ -38,6 +53,53 @@ function login() { return false; } +function recuperateAccount() { + global $DB, $MAIL_ADDRESS, $URL_BASE, $YEAR; + + $email = htmlspecialchars($_POST["email"]); + + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) + return "L'email entrée est invalide."; + + $req = $DB->query("SELECT `id` FROM `users` WHERE `email` = '$email' AND `year` = $YEAR;"); + if (!$req->fetch()) + return "Le compte n'existe pas."; + + $token = uniqid(); + + $DB->exec("UPDATE `users` SET `forgotten_password` = '$token' WHERE `email` = '$email' AND `year` = $YEAR;"); + + $msg = "Bonjour,\r\n\r\n" + . "Vous avez indiqué avoir oublié votre mot de passe. Veuillez cliquer ici pour le réinitialiser : $URL_BASE/connexion/reinitialiser_mdp/$token\r\n\r\n" + . "Si vous n'êtes pas à l'origine de cette manipulation, vous pouvez ignorer ce message.\r\n\r\n" + . "Cordialement,\r\n\r\n" + . "Le comité national d'organisation du TFJM²."; + mail("$email", "Mot de passe oublié - TFJM²", $msg, "From: $MAIL_ADDRESS\r\n"); + + return false; +} + +function resetPassword() { + global $DB, $MAIL_ADDRESS, $reset_data; + + $id = $reset_data["id"]; + $email = $reset_data["email"]; + $password = htmlspecialchars($_POST["password"]); + $confirm = htmlspecialchars($_POST["confirm_password"]); + + if (strlen($password) < 8) + return "Le mot de passe doit comporter au moins 8 caractères."; + + if ($password != $confirm) + return "Les deux mots de passe sont différents."; + + $hash = password_hash($password, PASSWORD_BCRYPT); + + $DB->prepare("UPDATE `users` SET `pwd_hash` = ?, `forgotten_password` = NULL WHERE `id` = ?;")->execute([$hash, $id]); + + return false; +} + ?> @@ -46,34 +108,92 @@ function login() { - Connexion réussie ! - - + if (isset($_GET["mdp_oublie"])) + echo "Le mail de récupération de mot de passe a bien été envoyé."; + else if (isset($_POST["reset_password"])) + echo "Le mot de passe a bien été changé. Vous pouvez désormais vous connecter."; + else + echo "Connexion réussie !"; + } +else if (isset($_SESSION["user_id"])) { ?>