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) { // Afficher une page d'initialisation ou un message d'attente echo "
Ceci est le premier lancement. Nous allons configurer la base de données, créer le certificat Root CA et le premier compte administrateur.
"; // 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.', 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 $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.
"; // 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) . ""; // 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'; $adminPasswordPlain = 'adminpass'; // Mot de passe par défaut très faible, À CHANGER IMMÉDIATEMENT EN PRODUCTION ! $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 "Compte administrateur 'admin' créé avec succès. Mot de passe initial: {$adminPasswordPlain} (veuillez le changer après la première connexion !)
"; } echo "Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...
"; echo "