$timeout) {
session_destroy();
header('Location: admin.php?action=login');
exit;
}
$_SESSION['last_activity'] = time();
// Vérifier si un utilisateur est connecté
function checkAuth() {
if (!isset($_SESSION['admin_id'])) {
header('Location: admin.php?action=login');
exit;
}
}
// Se connecter à la base de données
function getDB() {
return new SQLite3('database.sqlite');
}
// Page de connexion
function showLoginForm($error = null) {
?>
prepare('SELECT id, password_hash FROM admins WHERE username = :username');
$stmt->bindValue(':username', $username, SQLITE3_TEXT);
$result = $stmt->execute();
if ($user = $result->fetchArray()) {
if (password_verify($password, $user['password_hash'])) {
$_SESSION['admin_id'] = $user['id'];
header('Location: admin.php');
exit;
}
}
showLoginForm('Identifiants incorrects');
return;
}
showLoginForm();
}
// Gérer le changement de mot de passe
function handlePasswordChange() {
checkAuth();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: admin.php');
return;
}
$currentPassword = $_POST['current_password'] ?? '';
$newPassword = $_POST['new_password'] ?? '';
$confirmPassword = $_POST['confirm_password'] ?? '';
// Vérifier que le nouveau mot de passe respecte les critères
if (strlen($newPassword) < 12) {
$_SESSION['error_message'] = "Le mot de passe doit faire au moins 12 caractères.";
header('Location: admin.php?action=show_change_password');
return;
}
// Vérifier les critères avec des expressions régulières
if (!preg_match('/[a-z]/', $newPassword)) {
$_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre minuscule.";
header('Location: admin.php?action=show_change_password');
return;
}
if (!preg_match('/[A-Z]/', $newPassword)) {
$_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre majuscule.";
header('Location: admin.php?action=show_change_password');
return;
}
if (!preg_match('/[0-9]/', $newPassword)) {
$_SESSION['error_message'] = "Le mot de passe doit contenir au moins un chiffre.";
header('Location: admin.php?action=show_change_password');
return;
}
if (!preg_match('/[^A-Za-z0-9]/', $newPassword)) {
$_SESSION['error_message'] = "Le mot de passe doit contenir au moins un caractère spécial.";
header('Location: admin.php?action=show_change_password');
return;
}
$db = getDB();
// Vérifier l'ancien mot de passe
$stmt = $db->prepare('SELECT password_hash FROM admins WHERE id = :id');
$stmt->bindValue(':id', $_SESSION['admin_id'], SQLITE3_INTEGER);
$result = $stmt->execute();
$user = $result->fetchArray();
if (!password_verify($currentPassword, $user['password_hash'])) {
$_SESSION['error_message'] = "Le mot de passe actuel est incorrect.";
header('Location: admin.php?action=show_change_password');
return;
}
// Mettre à jour le mot de passe
$newHash = password_hash($newPassword, PASSWORD_DEFAULT);
$stmt = $db->prepare('UPDATE admins SET password_hash = :hash WHERE id = :id');
$stmt->bindValue(':hash', $newHash, SQLITE3_TEXT);
$stmt->bindValue(':id', $_SESSION['admin_id'], SQLITE3_INTEGER);
if ($stmt->execute()) {
$_SESSION['success_message'] = "Mot de passe changé avec succès.";
header('Location: admin.php');
} else {
$_SESSION['error_message'] = "Une erreur est survenue lors du changement de mot de passe.";
header('Location: admin.php?action=show_change_password');
}
return;
}
// Gérer la déconnexion
function handleLogout() {
session_destroy();
header('Location: admin.php');
exit;
}
// Router principal
$action = $_GET['action'] ?? 'home';
switch ($action) {
case 'login':
handleLogin();
break;
case 'logout':
handleLogout();
break;
case 'show_change_password':
showChangePasswordForm();
break;
case 'change_password':
handlePasswordChange();
break;
default:
showAdminInterface();
break;
}
?>