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

Initialisation de l'Application Requise

"; echo "

Veuillez fournir les informations suivantes pour la configuration initiale :

"; echo "
"; echo "
"; echo "
Exemple: exemple.com
"; echo ""; echo "
"; echo "
"; exit(); } } // Si nous arrivons ici, les données de session sont définies. Procéder à l'initialisation. echo "Initialisation en cours"; echo "

Initialisation de l'Application

"; 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 "
"; echo "
"; echo "
Exemple: exemple.com
"; echo ""; 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, common_name, expiration_date) VALUES (?, ?, ?, ?)"); $stmt->execute(['ca.cert.pem', 'root', $_SESSION['init_root_domain'], $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 "

Réessayer

"; // 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 "
"; // header('Refresh: 5; URL=/login'); // Ancienne méthode de redirection commentée 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', '/certificates/download', 'CertificateController@download', 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('POST', '/users/toggle-admin', 'UserController@toggleAdminRole', true); $router->addRoute('GET', '/logout', 'AuthController@logout', true); // Exécuter le routage $router->dispatch();