getMessage()); die("Une erreur est survenue lors de la connexion à la base de données. Veuillez réessayer plus tard."); } // Initialisation des services principaux $dbInstance = Database::getInstance(); // Récupère l'instance PDO $authService = new AuthService($dbInstance); $logService = new LogService(APP_LOG_PATH); $langService = new LanguageService(APP_ROOT_DIR . '/src/Lang/'); // ---------------------------------------------------- // Gestion de la Langue et du Mode Sombre via URL ou Session // ---------------------------------------------------- // Traitement du changement de langue if (isset($_GET['lang'])) { $langService->setLanguage($_GET['lang']); // Redirige pour nettoyer le paramètre GET de l'URL header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?')); exit(); } $currentLang = $langService->getLanguage(); $translations = $langService->getTranslations(); // Charge les traductions pour la langue actuelle // Traitement du mode sombre DarkMode::init(); // Initialise le mode sombre si ce n'est pas déjà fait if (isset($_GET['dark_mode'])) { DarkMode::toggle($_GET['dark_mode']); // Redirige pour nettoyer le paramètre GET de l'URL header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?')); exit(); } // ---------------------------------------------------- // Log de chaque requête entrante (pour le débogage/audit) // ---------------------------------------------------- $logService->log('info', 'Requête reçue: ' . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'], $authService->getUserId(), $_SERVER['REMOTE_ADDR']); // ---------------------------------------------------- // Processus d'initialisation de l'application au premier lancement // Crée le Root CA et le premier compte administrateur si non existants. // ---------------------------------------------------- $stmt = $dbInstance->query("SELECT COUNT(*) FROM users"); $userCount = $stmt->fetchColumn(); // Vérifier l'existence du certificat root $rootCertExists = file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem'); if ($userCount === 0 || !$rootCertExists) { // 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']; $logService->log('debug', 'Initialisation - POST data received: admin_password_present=' . !empty($_POST['admin_password']) . ', root_domain=' . ($_POST['root_domain'] ?? 'not_set_or_empty')); $logService->log('debug', 'Initialisation - Session variables SET: init_admin_password_present=' . !empty($_SESSION['init_admin_password']) . ', init_root_domain=' . ($_SESSION['init_root_domain'] ?? 'not_set_or_empty')); header('Location: ' . $_SERVER['PHP_SELF']); exit(); } else { // Afficher le formulaire d'initialisation echo "
Veuillez fournir les informations suivantes pour la configuration initiale :
"; echo ""; echo "Configuration en cours avec les informations fournies...
"; // Création du certificat Root CA si non existant if (!$rootCertExists) { echo "Création du certificat Root CA en cours...
"; $logService->log('info', 'Lancement de la création du certificat Root CA pour le domaine: ' . $_SESSION['init_root_domain'], null, $_SERVER['REMOTE_ADDR']); $logService->log('debug', 'Initialisation - About to call create_root_cert.sh. Value of $_SESSION[\'init_root_domain\']: ' . ($_SESSION['init_root_domain'] ?? 'NOT SET OR EMPTY')); if (empty($_SESSION['init_root_domain'])) { $logService->log('error', 'Initialisation - CRITICAL: $_SESSION[\'init_root_domain\'] is empty or not set right before calling create_root_cert.sh. Forcing display of error and form again.'); // Code to re-display form or a clear error message, then exit. // This is to prevent the script from being called with an empty argument. echo "Erreur Critique: La variable de session pour le domaine racine est vide avant d'appeler le script de création. Veuillez réessayer.
"; // Minimal form for resubmission: echo ""; // Optionally, unset session variables to force re-entry of CAS 1.2 logic fully. unset($_SESSION['init_admin_password']); unset($_SESSION['init_root_domain']); exit(); } // 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 "Certificat Root CA créé avec succès pour le domaine " . htmlspecialchars($_SESSION['init_root_domain']) . ".
"; // 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]); } else { echo "Erreur lors de la création du certificat Root CA. Veuillez vérifier les logs PHP et Docker.
"; echo "" . htmlspecialchars($output) . ""; // 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 ""; // Arrête l'exécution pour que l'utilisateur puisse voir l'erreur exit(); } } // Création du premier compte administrateur si non existant if ($userCount === 0) { echo "
Création du premier compte administrateur...
"; $adminUsername = 'admin'; // 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']); $userId = $dbInstance->lastInsertId(); // Récupérer l'ID de l'utilisateur créé $logService->log('info', "Compte administrateur '$adminUsername' créé.", $userId, $_SERVER['REMOTE_ADDR']); echo "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.
"; } // 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 "Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...
"; // Redirection JavaScript après 5 secondes echo ""; echo "