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 "Initialisation"; echo "

Initialisation de l'Application

"; 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 "
"; // Redirection automatique après l'initialisation header('Refresh: 5; URL=/login'); exit(); } // ---------------------------------------------------- // Fin du processus d'initialisation // ---------------------------------------------------- // ---------------------------------------------------- // Configuration du routeur de l'application // ---------------------------------------------------- $router = new Router(); // Routes publiques (accessibles sans authentification) $router->addRoute('GET', '/', 'HomeController@index'); $router->addRoute('GET', '/login', 'AuthController@showLoginForm'); $router->addRoute('POST', '/login', 'AuthController@login'); // Routes protégées (nécessitent une authentification) // Le dernier paramètre 'true' indique que la route nécessite une authentification $router->addRoute('GET', '/dashboard', 'DashboardController@index', true); $router->addRoute('GET', '/certificates', 'CertificateController@index', true); $router->addRoute('GET', '/certificates/create', 'CertificateController@showCreateForm', true); $router->addRoute('POST', '/certificates/create', 'CertificateController@create', true); $router->addRoute('POST', '/certificates/revoke', 'CertificateController@revoke', true); $router->addRoute('GET', '/perimeters', 'PerimeterController@index', true); $router->addRoute('GET', '/perimeters/create', 'PerimeterController@showCreateForm', true); $router->addRoute('POST', '/perimeters/create', 'PerimeterController@create', true); $router->addRoute('GET', '/users', 'UserController@index', true); $router->addRoute('GET', '/users/create', 'UserController@showCreateForm', true); $router->addRoute('POST', '/users/create', 'UserController@create', true); $router->addRoute('POST', '/users/delete', 'UserController@delete', true); $router->addRoute('GET', '/logout', 'AuthController@logout', true); // Exécuter le routage $router->dispatch();