mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-07-04 22:18:43 +02:00
Add files via upload
This commit is contained in:
117
app/src/Services/AuthService.php
Normal file
117
app/src/Services/AuthService.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use PDO;
|
||||
|
||||
/**
|
||||
* Service d'authentification utilisateur.
|
||||
* Gère les connexions, déconnexions et vérifie l'état de l'authentification.
|
||||
*/
|
||||
class AuthService
|
||||
{
|
||||
private $db; // Instance PDO pour l'accès à la base de données
|
||||
private $logService; // Service de journalisation
|
||||
|
||||
/**
|
||||
* Constructeur du service d'authentification.
|
||||
*
|
||||
* @param PDO $db L'instance PDO de la base de données.
|
||||
*/
|
||||
public function __construct(PDO $db)
|
||||
{
|
||||
$this->db = $db;
|
||||
// Le chemin du fichier de log doit être défini dans config/app.php
|
||||
$this->logService = new LogService(APP_LOG_PATH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tente de connecter un utilisateur.
|
||||
*
|
||||
* @param string $username Le nom d'utilisateur.
|
||||
* @param string $password Le mot de passe en clair.
|
||||
* @param string $ipAddress L'adresse IP de la requête de connexion.
|
||||
* @return bool Vrai si la connexion est réussie, faux sinon.
|
||||
*/
|
||||
public function login($username, $password, $ipAddress)
|
||||
{
|
||||
$stmt = $this->db->prepare("SELECT id, username, password, role FROM users WHERE username = ?");
|
||||
$stmt->execute([$username]);
|
||||
$user = $stmt->fetch();
|
||||
|
||||
if ($user && password_verify($password, $user['password'])) {
|
||||
// Connexion réussie : enregistre les informations de l session
|
||||
$_SESSION['user_id'] = $user['id'];
|
||||
$_SESSION['username'] = $user['username'];
|
||||
$_SESSION['role'] = $user['role'];
|
||||
|
||||
// Log de l'action de connexion réussie
|
||||
$this->logService->log('info', "Connexion réussie pour l'utilisateur '{$username}'.", $user['id'], $ipAddress);
|
||||
return true;
|
||||
} else {
|
||||
// Connexion échouée : log de la tentative
|
||||
$this->logService->log('warning', "Tentative de connexion échouée pour l'utilisateur '{$username}'.", null, $ipAddress);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Déconnecte l'utilisateur actuellement connecté.
|
||||
*
|
||||
* @param string $ipAddress L'adresse IP de la requête de déconnexion.
|
||||
* @return bool Vrai si la déconnexion est effectuée.
|
||||
*/
|
||||
public function logout($ipAddress)
|
||||
{
|
||||
$userId = $_SESSION['user_id'] ?? 'inconnu';
|
||||
$username = $_SESSION['username'] ?? 'inconnu';
|
||||
|
||||
// Détruit toutes les données de session
|
||||
session_destroy();
|
||||
$_SESSION = array(); // Vider le tableau $_SESSION
|
||||
|
||||
// Log de l'action de déconnexion
|
||||
$this->logService->log('info', "Déconnexion de l'utilisateur '{$username}'.", $userId, $ipAddress);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si un utilisateur est actuellement connecté.
|
||||
*
|
||||
* @return bool Vrai si l'utilisateur est connecté, faux sinon.
|
||||
*/
|
||||
public function isLoggedIn()
|
||||
{
|
||||
return isset($_SESSION['user_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère le rôle de l'utilisateur connecté.
|
||||
*
|
||||
* @return string|null Le rôle de l'utilisateur ('admin' ou 'user'), ou null si non connecté.
|
||||
*/
|
||||
public function getUserRole()
|
||||
{
|
||||
return $_SESSION['role'] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère l'ID de l'utilisateur connecté.
|
||||
*
|
||||
* @return int|null L'ID de l'utilisateur, ou null si non connecté.
|
||||
*/
|
||||
public function getUserId()
|
||||
{
|
||||
return $_SESSION['user_id'] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère le nom d'utilisateur de l'utilisateur connecté.
|
||||
*
|
||||
* @return string|null Le nom d'utilisateur, ou null si non connecté.
|
||||
*/
|
||||
public function getUsername()
|
||||
{
|
||||
return $_SESSION['username'] ?? null;
|
||||
}
|
||||
}
|
118
app/src/Services/LanguageService.php
Normal file
118
app/src/Services/LanguageService.php
Normal file
@ -0,0 +1,118 @@
|
||||
<?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 default
|
||||
$this->currentLang = $_SESSION['lang'] ?? 'en';
|
||||
// Vérifie si la langue est supportée, sinon revient à 'en'
|
||||
// CORRIGÉ: La condition était incorrecte
|
||||
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;
|
||||
}
|
||||
}
|
117
app/src/Services/LanguageService.php.bak
Normal file
117
app/src/Services/LanguageService.php.bak
Normal file
@ -0,0 +1,117 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
48
app/src/Services/LogService.php
Normal file
48
app/src/Services/LogService.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
/**
|
||||
* Service pour journaliser les actions de l'application dans un fichier.
|
||||
*/
|
||||
class LogService
|
||||
{
|
||||
private $logFile; // Chemin complet du fichier de log
|
||||
|
||||
/**
|
||||
* Constructeur du service de journalisation.
|
||||
*
|
||||
* @param string $logFile Chemin complet du fichier de log.
|
||||
*/
|
||||
public function __construct($logFile)
|
||||
{
|
||||
$this->logFile = $logFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enregistre un message dans le fichier de log.
|
||||
*
|
||||
* @param string $level Niveau de gravité du log (ex: 'info', 'warning', 'error').
|
||||
* @param string $message Le message à enregistrer.
|
||||
* @param int|null $userId L'ID de l'utilisateur si l'action est liée à un utilisateur.
|
||||
* @param string|null $ipAddress L'adresse IP d'où provient l'action.
|
||||
*/
|
||||
public function log($level, $message, $userId = null, $ipAddress = null)
|
||||
{
|
||||
$timestamp = date('Y-m-d H:i:s'); // Date et heure actuelle
|
||||
$logEntry = sprintf("[%s] [%s] ", $timestamp, strtoupper($level)); // Format de base du log
|
||||
|
||||
// Ajoute l'ID utilisateur si fourni
|
||||
if ($userId !== null) {
|
||||
$logEntry .= "[User: $userId] ";
|
||||
}
|
||||
// Ajoute l'adresse IP si fournie
|
||||
if ($ipAddress !== null) {
|
||||
$logEntry .= "[IP: $ipAddress] ";
|
||||
}
|
||||
$logEntry .= "$message\n"; // Ajoute le message et un saut de ligne
|
||||
|
||||
// Écrit le log dans le fichier, en ajoutant au contenu existant
|
||||
file_put_contents($this->logFile, $logEntry, FILE_APPEND);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user