ajout de l'option pour changer le mdp admin

This commit is contained in:
Esenjin 2025-03-09 19:16:31 +01:00
parent c8979f93d9
commit 06d3760a39
4 changed files with 195 additions and 0 deletions

View File

@ -43,6 +43,7 @@ include '../includes/header.php';
<a href="#announcementsSection" class="list-group-item list-group-item-action active" id="announcementsTab">Annonces</a>
<a href="#monstersSection" class="list-group-item list-group-item-action" id="monstersTab">Monstres</a>
<a href="#maintenanceSection" class="list-group-item list-group-item-action" id="maintenanceTab">Maintenance</a>
<a href="#passwordSection" class="list-group-item list-group-item-action" id="passwordTab">Mot de passe</a>
</div>
</div>
<div class="col-md-9">
@ -285,6 +286,37 @@ include '../includes/header.php';
</div>
</div>
<!-- Section de changement de mot de passe -->
<div id="passwordSection" class="admin-section d-none">
<div class="card">
<div class="card-header">
<h2 class="h4 mb-0">Changer le mot de passe</h2>
</div>
<div class="card-body">
<form id="changePasswordForm">
<input type="hidden" name="csrf_token" value="<?php echo generate_csrf_token(); ?>">
<div class="mb-3">
<label for="currentPassword" class="form-label">Mot de passe actuel</label>
<input type="password" class="form-control" id="currentPassword" name="currentPassword" required>
</div>
<div class="mb-3">
<label for="newPassword" class="form-label">Nouveau mot de passe</label>
<input type="password" class="form-control" id="newPassword" name="newPassword" required minlength="8">
<div class="form-text">Le mot de passe doit contenir au moins 8 caractères.</div>
</div>
<div class="mb-3">
<label for="confirmPassword" class="form-label">Confirmer le nouveau mot de passe</label>
<input type="password" class="form-control" id="confirmPassword" name="confirmPassword" required>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">Changer le mot de passe</button>
</div>
</form>
<div id="passwordResult" class="alert mt-3 d-none"></div>
</div>
</div>
</div>
<?php
// Inclure le pied de page
include '../includes/footer.php';

38
api.php
View File

@ -309,6 +309,44 @@ if ($method === 'GET') {
default:
send_json_response(['success' => 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

View File

@ -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
*

View File

@ -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;
}