mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 09:18:42 +02:00
![google-labs-jules[bot]](/assets/img/avatar_default.png)
Ce commit introduit la possibilité pour vous de télécharger les fichiers de certificats (racine, intermédiaire, final) et la clé privée du certificat racine (administrateurs uniquement) directement depuis la page du tableau de bord. Changements inclus : - Ajout d'une méthode `download()` dans `CertificateController` pour gérer la logique de téléchargement sécurisé des fichiers. - Ajout d'une nouvelle route `GET /certificates/download`. - Correction et standardisation des liens de téléchargement dans la vue du dashboard pour assurer la transmission correcte des paramètres (type de certificat, nom de fichier, périmètre). - La méthode de téléchargement inclut la journalisation des tentatives et des erreurs, ainsi que la gestion des permissions pour la clé privée racine.
164 lines
8.2 KiB
PHP
164 lines
8.2 KiB
PHP
<?php
|
|
|
|
// Démarrer la session PHP
|
|
session_start();
|
|
|
|
// Inclusion des fichiers fondamentaux
|
|
require_once __DIR__ . '/../src/Core/Autoloader.php';
|
|
require_once __DIR__ . '/../src/Core/Router.php';
|
|
require_once __DIR__ . '/../src/Core/Database.php';
|
|
require_once __DIR__ . '/../src/config/app.php'; // Charge les constantes d'application
|
|
|
|
// Enregistrement de l'autoloader pour charger les classes automatiquement
|
|
\App\Core\Autoloader::register();
|
|
|
|
// Importation des classes à utiliser
|
|
use App\Core\Database;
|
|
use App\Core\Router;
|
|
use App\Services\AuthService;
|
|
use App\Services\LanguageService;
|
|
use App\Services\LogService;
|
|
use App\Utils\DarkMode;
|
|
|
|
// Initialisation de la connexion à la base de données
|
|
try {
|
|
Database::connect(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);
|
|
} catch (PDOException $e) {
|
|
// En cas d'erreur de connexion, logguer et afficher un message générique
|
|
error_log("Database connection error: " . $e->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 "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation</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>";
|
|
|
|
// 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
|
|
$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>";
|
|
// 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 "<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>";
|
|
// 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 "<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 !
|
|
$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>";
|
|
}
|
|
|
|
echo "<p>Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...</p>";
|
|
echo "</div></body></html>";
|
|
// 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', '/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('GET', '/logout', 'AuthController@logout', true);
|
|
|
|
// Exécuter le routage
|
|
$router->dispatch();
|