From 06d3760a39857964be3735e2550e76079fe6fca0 Mon Sep 17 00:00:00 2001 From: Esenjin Date: Sun, 9 Mar 2025 19:16:31 +0100 Subject: [PATCH] ajout de l'option pour changer le mdp admin --- admin/index.php | 32 +++++++++++++++++ api.php | 38 ++++++++++++++++++++ assets/js/admin.js | 82 +++++++++++++++++++++++++++++++++++++++++++ includes/database.php | 43 +++++++++++++++++++++++ 4 files changed, 195 insertions(+) diff --git a/admin/index.php b/admin/index.php index 9955f67..8c9387b 100644 --- a/admin/index.php +++ b/admin/index.php @@ -43,6 +43,7 @@ include '../includes/header.php'; Annonces Monstres Maintenance + Mot de passe
@@ -285,6 +286,37 @@ include '../includes/header.php';
+ +
+
+
+

Changer le mot de passe

+
+
+
+ +
+ + +
+
+ + +
Le mot de passe doit contenir au moins 8 caractères.
+
+
+ + +
+
+ +
+
+
+
+
+
+ false, 'message' => 'Action non reconnue'], 400); + + case 'updatePassword': + // Vérifier l'authentification + if (!is_logged_in()) { + send_json_response(['success' => false, 'message' => 'Authentification requise'], 401); + } + + // Vérifier les données requises + if (!isset($post_data['currentPassword']) || !isset($post_data['newPassword']) || !isset($post_data['confirmPassword'])) { + send_json_response(['success' => false, 'message' => 'Données manquantes'], 400); + } + + $current_password = $post_data['currentPassword']; + $new_password = $post_data['newPassword']; + $confirm_password = $post_data['confirmPassword']; + + // Vérifier que les mots de passe correspondent + if ($new_password !== $confirm_password) { + send_json_response(['success' => false, 'message' => 'Les nouveaux mots de passe ne correspondent pas'], 400); + } + + // Vérifier la longueur du mot de passe + if (strlen($new_password) < 8) { + send_json_response(['success' => false, 'message' => 'Le nouveau mot de passe doit contenir au moins 8 caractères'], 400); + } + + // Vérifier le mot de passe actuel + if (!verify_current_password('admin', $current_password)) { + send_json_response(['success' => false, 'message' => 'Mot de passe actuel incorrect'], 400); + } + + // Mettre à jour le mot de passe + if (update_user_password('admin', $new_password)) { + send_json_response(['success' => true, 'message' => 'Mot de passe mis à jour avec succès']); + } else { + send_json_response(['success' => false, 'message' => 'Erreur lors de la mise à jour du mot de passe'], 500); + } + break; } } else { // Méthode HTTP non autorisée diff --git a/assets/js/admin.js b/assets/js/admin.js index 377d62a..701089c 100644 --- a/assets/js/admin.js +++ b/assets/js/admin.js @@ -131,6 +131,88 @@ document.addEventListener('DOMContentLoaded', () => { } }); +// Changement du mot de passe admin +// Éléments DOM pour le changement de mot de passe +const passwordTab = document.getElementById('passwordTab'); +const changePasswordForm = document.getElementById('changePasswordForm'); +const passwordResult = document.getElementById('passwordResult'); + +// Événements pour l'onglet mot de passe +if (passwordTab) { + passwordTab.addEventListener('click', (e) => { + e.preventDefault(); + showSection('passwordSection'); + }); +} + +// Gestion du formulaire de changement de mot de passe +if (changePasswordForm) { + changePasswordForm.addEventListener('submit', function(e) { + e.preventDefault(); + + const currentPassword = document.getElementById('currentPassword').value; + const newPassword = document.getElementById('newPassword').value; + const confirmPassword = document.getElementById('confirmPassword').value; + + // Vérifier que les mots de passe correspondent + if (newPassword !== confirmPassword) { + showPasswordResult('Les nouveaux mots de passe ne correspondent pas.', false); + return; + } + + // Vérifier la longueur du mot de passe + if (newPassword.length < 8) { + showPasswordResult('Le nouveau mot de passe doit contenir au moins 8 caractères.', false); + return; + } + + // Préparer les données + const formData = new FormData(); + formData.append('currentPassword', currentPassword); + formData.append('newPassword', newPassword); + formData.append('confirmPassword', confirmPassword); + formData.append('csrf_token', document.querySelector('input[name="csrf_token"]').value); + + // Envoyer la requête + fetch('../api.php?action=updatePassword', { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + showPasswordResult(data.message, true); + changePasswordForm.reset(); + } else { + showPasswordResult(data.message, false); + } + }) + .catch(error => { + console.error('Erreur:', error); + showPasswordResult('Erreur de connexion. Veuillez réessayer.', false); + }); + }); +} + +/** + * Afficher le résultat du changement de mot de passe + * + * @param {string} message Message à afficher + * @param {boolean} success Succès ou échec + */ +function showPasswordResult(message, success) { + passwordResult.textContent = message; + passwordResult.classList.remove('d-none', 'alert-success', 'alert-danger'); + passwordResult.classList.add(success ? 'alert-success' : 'alert-danger'); + + // Masquer le message après quelques secondes si c'est un succès + if (success) { + setTimeout(() => { + passwordResult.classList.add('d-none'); + }, 5000); + } +} + /** * Fonctions pour la navigation entre les sections * diff --git a/includes/database.php b/includes/database.php index 40ebe59..84f50a2 100644 --- a/includes/database.php +++ b/includes/database.php @@ -366,5 +366,48 @@ function check_login($username, $password) { return true; } + return false; +} + +/** + * Mettre à jour le mot de passe d'un utilisateur + * + * @param string $username Nom d'utilisateur + * @param string $new_password Nouveau mot de passe + * @return bool Succès de la mise à jour + */ +function update_user_password($username, $new_password) { + $db = get_db_connection(); + + // Hacher le nouveau mot de passe + $hashed_password = password_hash($new_password, PASSWORD_DEFAULT); + + $stmt = $db->prepare('UPDATE users SET password = :password WHERE username = :username'); + $stmt->bindParam(':username', $username); + $stmt->bindParam(':password', $hashed_password); + + return $stmt->execute(); +} + +/** + * Vérifier le mot de passe actuel d'un utilisateur + * + * @param string $username Nom d'utilisateur + * @param string $current_password Mot de passe actuel + * @return bool Le mot de passe est-il valide + */ +function verify_current_password($username, $current_password) { + $db = get_db_connection(); + + $stmt = $db->prepare('SELECT password FROM users WHERE username = :username'); + $stmt->bindParam(':username', $username); + $stmt->execute(); + + $user = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($user && password_verify($current_password, $user['password'])) { + return true; + } + return false; } \ No newline at end of file