Merge pull request #8 from tips-of-mine/feat/init-ask-creds-domain

Feat/init ask creds domain
This commit is contained in:
tips-of-mine
2025-06-15 14:03:19 +02:00
committed by GitHub
2 changed files with 62 additions and 15 deletions

View File

@ -76,33 +76,60 @@ $userCount = $stmt->fetchColumn();
$rootCertExists = file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem');
if ($userCount === 0 || !$rootCertExists) {
// Afficher une page d'initialisation ou un message d'attente
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
// Début de la logique de formulaire et de session pour l'initialisation
if (!isset($_SESSION['init_admin_password'], $_SESSION['init_root_domain'])) {
if (isset($_POST['admin_password'], $_POST['root_domain']) && !empty($_POST['admin_password']) && !empty($_POST['root_domain'])) {
$_SESSION['init_admin_password'] = $_POST['admin_password'];
$_SESSION['init_root_domain'] = $_POST['root_domain'];
header('Location: ' . $_SERVER['PHP_SELF']);
exit();
} else {
// Afficher le formulaire d'initialisation
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation Requise</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
echo "<div class=\"container\">";
echo "<h1>Initialisation de l'Application Requise</h1>";
echo "<p>Veuillez fournir les informations suivantes pour la configuration initiale :</p>";
echo "<form method=\"POST\" action=\"" . htmlspecialchars($_SERVER['PHP_SELF']) . "\">";
echo "<div><label for=\"admin_password\">Mot de passe administrateur initial :</label><input type=\"password\" id=\"admin_password\" name=\"admin_password\" required></div>";
echo "<div><label for=\"root_domain\">Domaine racine (ROOT_DOMAIN) pour le certificat CA :</label><input type=\"text\" id=\"root_domain\" name=\"root_domain\" required><small>Exemple: exemple.com</small></div>";
echo "<button type=\"submit\">Configurer</button>";
echo "</form>";
echo "</div></body></html>";
exit();
}
}
// Si nous arrivons ici, les données de session sont définies. Procéder à l'initialisation.
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation en cours</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
echo "<div class=\"container\"><h1>Initialisation de l'Application</h1>";
echo "<p>Ceci est le premier lancement. Nous allons configurer la base de données, créer le certificat Root CA et le premier compte administrateur.</p>";
echo "<p>Configuration en cours avec les informations fournies...</p>";
// Création du certificat Root CA si non existant
if (!$rootCertExists) {
echo "<p>Création du certificat Root CA en cours...</p>";
$logService->log('info', 'Lancement de la création du certificat Root CA.', null, $_SERVER['REMOTE_ADDR']);
// Exécution du script shell de création de certificat root
$command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh'); // Utilise la constante
$logService->log('info', 'Lancement de la création du certificat Root CA pour le domaine: ' . $_SESSION['init_root_domain'], null, $_SERVER['REMOTE_ADDR']);
// Exécution du script shell de création de certificat root avec le domaine racine
$command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh ' . escapeshellarg($_SESSION['init_root_domain']));
$output = shell_exec($command . ' 2>&1');
$logService->log('info', "Résultat création Root CA: " . $output, null, $_SERVER['REMOTE_ADDR']);
if (file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem')) {
echo "<p>Certificat Root CA créé avec succès.</p>";
echo "<p>Certificat Root CA créé avec succès pour le domaine " . htmlspecialchars($_SESSION['init_root_domain']) . ".</p>";
// Extraire la date d'expiration du certificat créé pour l'enregistrer en BDD
$certInfo = shell_exec("openssl x509 -in " . escapeshellarg(ROOT_CA_PATH . '/certs/ca.cert.pem') . " -noout -enddate 2>/dev/null | cut -d= -f2");
$expirationTimestamp = strtotime($certInfo);
$expirationDate = $expirationTimestamp ? date('Y-m-d H:i:s', $expirationTimestamp) : (new DateTime('+10 years'))->format('Y-m-d H:i:s');
// Enregistrer le certificat root dans la base de données
$stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, expiration_date) VALUES (?, ?, ?)");
$stmt->execute(['ca.cert.pem', 'root', $expirationDate]);
$stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, common_name, expiration_date) VALUES (?, ?, ?, ?)");
$stmt->execute(['ca.cert.pem', 'root', $_SESSION['init_root_domain'], $expirationDate]);
} else {
echo "<p style=\"color: red;\">Erreur lors de la création du certificat Root CA. Veuillez vérifier les logs PHP et Docker.</p>";
echo "<pre>" . htmlspecialchars($output) . "</pre>";
// Nettoyer les variables de session en cas d'erreur pour permettre une nouvelle tentative
unset($_SESSION['init_admin_password']);
unset($_SESSION['init_root_domain']);
echo "<p><a href=\"" . htmlspecialchars($_SERVER['PHP_SELF']) . "\">Réessayer</a></p>";
// Arrête l'exécution pour que l'utilisateur puisse voir l'erreur
exit();
}
@ -112,19 +139,29 @@ if ($userCount === 0 || !$rootCertExists) {
if ($userCount === 0) {
echo "<p>Création du premier compte administrateur...</p>";
$adminUsername = 'admin';
$adminPasswordPlain = 'adminpass'; // Mot de passe par défaut très faible, À CHANGER IMMÉDIATEMENT EN PRODUCTION !
// Utiliser le mot de passe fourni via le formulaire et stocké en session
$adminPasswordPlain = $_SESSION['init_admin_password'];
$adminPasswordHashed = password_hash($adminPasswordPlain, PASSWORD_DEFAULT);
$stmt = $dbInstance->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)");
$stmt->execute([$adminUsername, $adminPasswordHashed, 'admin']);
$logService->log('info', "Compte administrateur '$adminUsername' créé.", $stmt->lastInsertId(), $_SERVER['REMOTE_ADDR']);
echo "<p>Compte administrateur 'admin' créé avec succès. Mot de passe initial: <b>{$adminPasswordPlain}</b> (veuillez le changer après la première connexion !)</p>";
$userId = $dbInstance->lastInsertId(); // Récupérer l'ID de l'utilisateur créé
$logService->log('info', "Compte administrateur '$adminUsername' créé.", $userId, $_SERVER['REMOTE_ADDR']);
echo "<p>Compte administrateur 'admin' créé avec succès. Le mot de passe a été défini comme vous l'avez fourni. Veuillez le conserver précieusement.</p>";
}
// Nettoyer les variables de session d'initialisation après une initialisation réussie
unset($_SESSION['init_admin_password']);
unset($_SESSION['init_root_domain']);
// Fermer la session pour s'assurer que les unsets sont sauvegardés avant toute sortie ou redirection.
session_write_close();
echo "<p>Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...</p>";
// Redirection JavaScript après 5 secondes
echo "<script type='text/javascript'>setTimeout(function() { window.location.href = '/login'; }, 5000);</script>";
echo "</div></body></html>";
// Redirection automatique après l'initialisation
header('Refresh: 5; URL=/login');
// header('Refresh: 5; URL=/login'); // Ancienne méthode de redirection commentée
exit();
}
// ----------------------------------------------------