mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 12:48:42 +02:00
Refactor: Vérification des routes et suppression des fichiers .bak
Ce commit inclut les actions suivantes : - Vérification de la syntaxe des définitions de routes dans app/public/index.php. Aucune correction n'a été nécessaire car la potentielle erreur 'AuthController@@logout' était déjà corrigée. - Suppression des fichiers .bak obsolètes : - app/public/index.php.bak - app/public/ocsp_responder.php.bak - app/src/Services/LanguageService.php.bak Ces changements contribuent à la propreté et à la maintenabilité du code.
This commit is contained in:
@ -1,162 +0,0 @@
|
|||||||
<?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', '/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); # CORRIGÉ: de AuthController@@logout à AuthController@logout
|
|
||||||
|
|
||||||
// Exécuter le routage
|
|
||||||
$router->dispatch();
|
|
@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// Démarrer la session PHP (si nécessaire pour la journalisation utilisateur, sinon peut être omis)
|
|
||||||
session_start();
|
|
||||||
|
|
||||||
// Inclusion des fichiers fondamentaux
|
|
||||||
require_once __DIR__ . '/../src/Core/Autoloader.php';
|
|
||||||
require_once __DIR__ . '/../src/Core/Database.php';
|
|
||||||
require_once __DIR__ . '/../src/config/app.php'; // Charge les constantes d'application
|
|
||||||
|
|
||||||
// Enregistrement de l'autoloader
|
|
||||||
\App\Core\Autoloader::register();
|
|
||||||
|
|
||||||
// Importation des classes
|
|
||||||
use App\Core\Database;
|
|
||||||
use App\Controllers\OcspController; // Votre contrôleur spécifique pour l'OCSP
|
|
||||||
use App\Services\AuthService;
|
|
||||||
use App\Services\LogService;
|
|
||||||
|
|
||||||
// Initialisation de la connexion à la base de données (si le contrôleur OCSP en a besoin)
|
|
||||||
try {
|
|
||||||
Database::connect(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
error_log("OCSP: Database connection error: " . $e->getMessage());
|
|
||||||
http_response_code(500);
|
|
||||||
die("OCSP service temporarily unavailable.");
|
|
||||||
}
|
|
||||||
|
|
||||||
$dbInstance = Database::getInstance();
|
|
||||||
$authService = new AuthService($dbInstance); // Peut être utilisé pour logguer des requêtes OCSP anonymes
|
|
||||||
$logService = new LogService(APP_LOG_PATH);
|
|
||||||
|
|
||||||
|
|
||||||
// La logique OCSP réelle serait plus complexe.
|
|
||||||
// Ce script attendrait une requête POST OCSP (application/ocsp-request)
|
|
||||||
// et appellerait le contrôleur OCSP pour la traiter.
|
|
||||||
|
|
||||||
// Pour un POC, nous allons simplement appeler la méthode du contrôleur dédiée.
|
|
||||||
// En production, Nginx redirigerait une requête HTTP POST spécifique vers ce script.
|
|
||||||
// Le client OCSP enverrait une requête binaire.
|
|
||||||
// Pour l'instant, ce script est juste un point d'entrée.
|
|
||||||
|
|
||||||
$controller = new OcspController();
|
|
||||||
$controller->handleRequest();
|
|
||||||
|
|
||||||
// Log la requête OCSP
|
|
||||||
$logService->log('info', 'Requête OCSP reçue.', null, $_SERVER['REMOTE_ADDR']);
|
|
@ -1,117 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Services;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service pour gérer la langue de l'application et charger les traductions.
|
|
||||||
*/
|
|
||||||
class LanguageService
|
|
||||||
{
|
|
||||||
private $langDir; // Répertoire où sont stockés les fichiers de traduction
|
|
||||||
private $currentLang; // Langue actuellement sélectionnée
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructeur du service de langue.
|
|
||||||
* Initialise la langue actuelle à partir de la session ou une valeur par défaut.
|
|
||||||
*
|
|
||||||
* @param string $langDir Chemin absolu du répertoire des fichiers de traduction.
|
|
||||||
*/
|
|
||||||
public function __construct($langDir)
|
|
||||||
{
|
|
||||||
$this->langDir = rtrim($langDir, '/') . '/'; // Assure qu'il y a un slash final
|
|
||||||
// Récupère la langue de la session ou utilise 'en' par défaut
|
|
||||||
$this->currentLang = $_SESSION['lang'] ?? 'en';
|
|
||||||
// Vérifie si la langue est supportée, sinon revient à 'en'
|
|
||||||
if (!in_array($this->currentLang, SUPPORTED_LANGUAGES)) {
|
|
||||||
$this->currentLang = 'en';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Définit la langue de l'application.
|
|
||||||
*
|
|
||||||
* @param string $lang Le code de la langue (ex: 'fr', 'en').
|
|
||||||
* @return bool Vrai si la langue a été définie avec succès, faux sinon.
|
|
||||||
*/
|
|
||||||
public function setLanguage($lang)
|
|
||||||
{
|
|
||||||
if (in_array($lang, SUPPORTED_LANGUAGES)) {
|
|
||||||
$_SESSION['lang'] = $lang;
|
|
||||||
$this->currentLang = $lang;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retourne la langue actuellement sélectionnée.
|
|
||||||
*
|
|
||||||
* @return string Le code de la langue.
|
|
||||||
*/
|
|
||||||
public function getLanguage()
|
|
||||||
{
|
|
||||||
return $this->currentLang;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Charge et retourne toutes les traductions pour la langue actuelle.
|
|
||||||
*
|
|
||||||
* @return array Tableau associatif des traductions.
|
|
||||||
*/
|
|
||||||
public function getTranslations()
|
|
||||||
{
|
|
||||||
$filePath = $this->langDir . $this->currentLang . '.json';
|
|
||||||
if (file_exists($filePath)) {
|
|
||||||
$content = file_get_contents($filePath);
|
|
||||||
if ($content === false) {
|
|
||||||
error_log("LanguageService: Impossible de lire le fichier de traduction: " . $filePath);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
$translations = json_decode($content, true);
|
|
||||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
||||||
error_log("LanguageService: Erreur de décodage JSON pour le fichier: " . $filePath . " - " . json_last_error_msg());
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return $translations;
|
|
||||||
}
|
|
||||||
// Fallback à l'anglais si le fichier de la langue actuelle est manquant
|
|
||||||
$englishFilePath = $this->langDir . 'en.json';
|
|
||||||
if (file_exists($englishFilePath)) {
|
|
||||||
$content = file_get_contents($englishFilePath);
|
|
||||||
if ($content === false) {
|
|
||||||
error_log("LanguageService: Impossible de lire le fichier de traduction anglais de secours: " . $englishFilePath);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
$translations = json_decode($content, true);
|
|
||||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
||||||
error_log("LanguageService: Erreur de décodage JSON pour le fichier anglais de secours: " . $englishFilePath . " - " . json_last_error_msg());
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return $translations;
|
|
||||||
}
|
|
||||||
error_log("LanguageService: Aucun fichier de traduction trouvé pour la langue '" . $this->currentLang . "' ou 'en'.");
|
|
||||||
return []; // Retourne un tableau vide si aucune traduction n'est trouvée
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Traduit une clé donnée.
|
|
||||||
*
|
|
||||||
* @param string $key La clé de traduction.
|
|
||||||
* @param array $replacements Tableau associatif de [placeholder => valeur] pour les remplacements.
|
|
||||||
* @return string La chaîne traduite ou la clé si non trouvée.
|
|
||||||
*/
|
|
||||||
public function __($key, $replacements = [])
|
|
||||||
{
|
|
||||||
// Utilise la variable globale $translations qui est chargée dans index.php
|
|
||||||
global $translations;
|
|
||||||
|
|
||||||
$translatedString = $translations[$key] ?? $key;
|
|
||||||
|
|
||||||
// Effectuer les remplacements de placeholders
|
|
||||||
foreach ($replacements as $placeholder => $value) {
|
|
||||||
$translatedString = str_replace("{" . $placeholder . "}", $value, $translatedString);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $translatedString;
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user