prepare('SELECT MIN(id) as first_id FROM admins'); $result = $stmt->execute(); $firstId = $result->fetchArray()['first_id']; if ($_SESSION['admin_id'] != $firstId) { $_SESSION['error_message'] = "Accès non autorisé. Seul le premier administrateur peut gérer les comptes."; header('Location: admin.php'); exit; } // Se connecter à la base de données function getDB() { return new SQLite3('database.sqlite'); } // Gérer les actions POST if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; $db = getDB(); switch ($action) { case 'add': $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; if (empty($username) || empty($password)) { $_SESSION['error_message'] = "L'identifiant et le mot de passe sont requis."; break; } // Vérification du mot de passe if (strlen($password) < 12) { $_SESSION['error_message'] = "Le mot de passe doit faire au moins 12 caractères."; break; } if (!preg_match('/[a-z]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre minuscule."; break; } if (!preg_match('/[A-Z]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre majuscule."; break; } if (!preg_match('/[0-9]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins un chiffre."; break; } if (!preg_match('/[^A-Za-z0-9]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins un caractère spécial."; break; } // Vérifier si l'utilisateur existe déjà $stmt = $db->prepare('SELECT COUNT(*) as count FROM admins WHERE username = :username'); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $result = $stmt->execute()->fetchArray(); if ($result['count'] > 0) { $_SESSION['error_message'] = "Cet identifiant existe déjà."; break; } // Créer le nouvel utilisateur $stmt = $db->prepare('INSERT INTO admins (username, password_hash) VALUES (:username, :password_hash)'); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->bindValue(':password_hash', password_hash($password, PASSWORD_DEFAULT), SQLITE3_TEXT); if ($stmt->execute()) { $_SESSION['success_message'] = "Utilisateur ajouté avec succès."; logAdminAction( $_SESSION['admin_id'], 'ADD_USER', "Création du compte administrateur : " . $username ); } else { $_SESSION['error_message'] = "Erreur lors de l'ajout de l'utilisateur."; } break; case 'edit': $userId = $_POST['user_id'] ?? ''; $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; if (empty($userId) || empty($username)) { $_SESSION['error_message'] = "Des informations sont manquantes."; break; } // Vérifier que le nouvel identifiant n'existe pas déjà (sauf pour l'utilisateur actuel) $stmt = $db->prepare('SELECT COUNT(*) as count FROM admins WHERE username = :username AND id != :id'); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->bindValue(':id', $userId, SQLITE3_INTEGER); $result = $stmt->execute()->fetchArray(); if ($result['count'] > 0) { $_SESSION['error_message'] = "Cet identifiant existe déjà."; break; } // Si un nouveau mot de passe est fourni if (!empty($password)) { // Vérification du mot de passe if (strlen($password) < 12) { $_SESSION['error_message'] = "Le mot de passe doit faire au moins 12 caractères."; break; } if (!preg_match('/[a-z]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre minuscule."; break; } if (!preg_match('/[A-Z]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins une lettre majuscule."; break; } if (!preg_match('/[0-9]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins un chiffre."; break; } if (!preg_match('/[^A-Za-z0-9]/', $password)) { $_SESSION['error_message'] = "Le mot de passe doit contenir au moins un caractère spécial."; break; } // Construction de la requête avec nouveau mot de passe $stmt = $db->prepare('UPDATE admins SET username = :username, password_hash = :password_hash WHERE id = :id'); $stmt->bindValue(':password_hash', password_hash($password, PASSWORD_DEFAULT), SQLITE3_TEXT); } else { // Construction de la requête sans nouveau mot de passe $stmt = $db->prepare('UPDATE admins SET username = :username WHERE id = :id'); } $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->bindValue(':id', $userId, SQLITE3_INTEGER); if ($stmt->execute()) { $_SESSION['success_message'] = "Utilisateur modifié avec succès."; logAdminAction( $_SESSION['admin_id'], 'EDIT_USER', "Modification du compte administrateur : " . $username ); } else { $_SESSION['error_message'] = "Erreur lors de la modification de l'utilisateur."; } break; case 'delete': $userId = $_POST['user_id'] ?? ''; if (empty($userId)) { $_SESSION['error_message'] = "ID utilisateur manquant."; break; } // Vérifier que l'utilisateur n'est pas le premier compte $stmt = $db->prepare('SELECT MIN(id) as first_id FROM admins'); $firstId = $stmt->execute()->fetchArray()['first_id']; if ($userId == $firstId) { $_SESSION['error_message'] = "Impossible de supprimer le compte principal."; break; } // Supprimer l'utilisateur $stmt = $db->prepare('DELETE FROM admins WHERE id = :id AND id != (SELECT MIN(id) FROM admins)'); $stmt->bindValue(':id', $userId, SQLITE3_INTEGER); if ($stmt->execute()) { $_SESSION['success_message'] = "Utilisateur supprimé avec succès."; logAdminAction( $_SESSION['admin_id'], 'DELETE_USER', "Suppression d'un compte administrateur", "ID: " . $userId ); } else { $_SESSION['error_message'] = "Erreur lors de la suppression de l'utilisateur."; } break; } header('Location: utilisateurs.php'); exit; } // Récupérer la liste des utilisateurs $db = getDB(); $users = []; $result = $db->query('SELECT * FROM admins ORDER BY id'); while ($row = $result->fetchArray(SQLITE3_ASSOC)) { $users[] = $row; } $config = getSiteConfig(); ?>
ID | Identifiant | Date de création | Actions |
---|---|---|---|
Admin principal |