From d3e76f00def88f289826de8bd2a1ad062a8b1f75 Mon Sep 17 00:00:00 2001 From: Serreau Jovann Date: Thu, 2 Apr 2026 23:15:00 +0200 Subject: [PATCH] fix: corriger HMAC des logs + PDF style attestation + pagination glassmorphism + purge logs src/Entity/AppLog.php: - createdAt initialise avec date('Y-m-d H:i:s') au lieu de new DateTimeImmutable() pour tronquer les microsecondes (PostgreSQL arrondit les microsecondes differemment de PHP, ce qui causait des HMAC invalides a la relecture) - generateHmac(): format Y-m-d\TH:i:s sans microsecondes templates/admin/logs/pdf.html.twig (reecrit): - Meme style que les attestations RGPD (templates/pdf/rgpd_*.html.twig): banniere gold avec logo, doc-type badge indigo, titre italic uppercase, info-grid avec cellules bordure indigo, tableaux data avec header dark, bloc HMAC avec encadre vert/rouge, footer SARL SITECONSEIL - Logo passe au template via base64 src/Controller/Admin/LogsController.php: - pdf(): injection de kernel.project_dir, chargement du logo en base64 et passage au template src/Command/PurgeEmailTrackingCommand.php: - Ajout de la purge des AppLog de plus de 90 jours (meme seuil que EmailTracking), affiche le nombre de logs supprimes templates/components/pagination/glass.html.twig (nouveau): - Template de pagination KnpPaginator style glassmorphism: boutons glass avec hover, page active en glass-gold, fleches precedent/suivant config/packages/knp_paginator.yaml (nouveau): - Configuration KnpPaginator pour utiliser le template glass Co-Authored-By: Claude Opus 4.6 (1M context) --- config/packages/knp_paginator.yaml | 3 + src/Command/PurgeEmailTrackingCommand.php | 15 +- src/Controller/Admin/LogsController.php | 6 + src/Entity/AppLog.php | 4 +- templates/admin/logs/pdf.html.twig | 144 +++++++++++------- .../components/pagination/glass.html.twig | 23 +++ 6 files changed, 139 insertions(+), 56 deletions(-) create mode 100644 config/packages/knp_paginator.yaml create mode 100644 templates/components/pagination/glass.html.twig diff --git a/config/packages/knp_paginator.yaml b/config/packages/knp_paginator.yaml new file mode 100644 index 0000000..57d75e6 --- /dev/null +++ b/config/packages/knp_paginator.yaml @@ -0,0 +1,3 @@ +knp_paginator: + template: + pagination: 'components/pagination/glass.html.twig' diff --git a/src/Command/PurgeEmailTrackingCommand.php b/src/Command/PurgeEmailTrackingCommand.php index 67bb3b8..b76ebda 100644 --- a/src/Command/PurgeEmailTrackingCommand.php +++ b/src/Command/PurgeEmailTrackingCommand.php @@ -13,7 +13,7 @@ use Symfony\Component\Console\Style\SymfonyStyle; #[AsCommand( name: 'app:email-tracking:purge', - description: 'Supprime les enregistrements EmailTracking de plus de 90 jours', + description: 'Supprime les EmailTracking et AppLog de plus de 90 jours', )] class PurgeEmailTrackingCommand extends Command { @@ -45,7 +45,18 @@ class PurgeEmailTrackingCommand extends Command $deleted = $qb->getQuery()->execute(); - $io->success("$deleted enregistrement(s) supprime(s)."); + $io->text("EmailTracking : $deleted enregistrement(s) supprime(s)."); + + $deletedLogs = $this->em->createQueryBuilder() + ->delete('App\Entity\AppLog', 'l') + ->where('l.createdAt < :threshold') + ->setParameter('threshold', $threshold) + ->getQuery() + ->execute(); + + $io->text("AppLog : $deletedLogs enregistrement(s) supprime(s)."); + + $io->success(($deleted + $deletedLogs).' enregistrement(s) supprime(s) au total.'); return Command::SUCCESS; } diff --git a/src/Controller/Admin/LogsController.php b/src/Controller/Admin/LogsController.php index 505808f..bb0c1b2 100644 --- a/src/Controller/Admin/LogsController.php +++ b/src/Controller/Admin/LogsController.php @@ -6,6 +6,7 @@ use App\Entity\AppLog; use App\Repository\AppLogRepository; use App\Service\AppLoggerService; use Dompdf\Dompdf; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Knp\Component\Pager\PaginatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -51,6 +52,7 @@ class LogsController extends AbstractController AppLogRepository $repository, AppLoggerService $loggerService, Environment $twig, + #[Autowire('%kernel.project_dir%')] string $projectDir, ): Response { $log = $repository->find($id); @@ -60,9 +62,13 @@ class LogsController extends AbstractController $hmacValid = $loggerService->verifyLog($log); + $logoPath = $projectDir.'/public/logo_facture.png'; + $logo = file_exists($logoPath) ? 'data:image/png;base64,'.base64_encode((string) file_get_contents($logoPath)) : ''; + $html = $twig->render('admin/logs/pdf.html.twig', [ 'log' => $log, 'hmacValid' => $hmacValid, + 'logo' => $logo, ]); $dompdf = new Dompdf(); diff --git a/src/Entity/AppLog.php b/src/Entity/AppLog.php index 07a086e..d454c26 100644 --- a/src/Entity/AppLog.php +++ b/src/Entity/AppLog.php @@ -47,7 +47,7 @@ class AppLog $this->action = $action; $this->user = $user; $this->ip = $ip; - $this->createdAt = new \DateTimeImmutable(); + $this->createdAt = new \DateTimeImmutable(date('Y-m-d H:i:s')); $this->hmac = $this->generateHmac($hmacSecret); } @@ -110,7 +110,7 @@ class AppLog $this->action, $this->ip ?? '', null !== $this->user ? (string) $this->user->getId() : '', - $this->createdAt->format('Y-m-d\TH:i:s.u'), + $this->createdAt->format('Y-m-d\TH:i:s'), ]); return hash_hmac('sha256', $payload, $secret); diff --git a/templates/admin/logs/pdf.html.twig b/templates/admin/logs/pdf.html.twig index 3119695..b387d80 100644 --- a/templates/admin/logs/pdf.html.twig +++ b/templates/admin/logs/pdf.html.twig @@ -4,63 +4,103 @@ Log #{{ log.id }} - CRM SITECONSEIL -

Rapport de log #{{ log.id }}

-

CRM SITECONSEIL - Genere le {{ "now"|date("d/m/Y H:i:s") }}

- - - - - - - - - - - - - - -
Informations du log
ID{{ log.id }}
Date{{ log.createdAt|date('d/m/Y H:i:s') }}
Utilisateur - {% if log.user %} - {{ log.user.fullName }} ({{ log.user.email }}) - {% else %} - Non connecte - {% endif %} -
Methode HTTP{{ log.method }}
URL{{ log.url }}
Route{{ log.route }}
Action{{ log.action }}
Adresse IP{{ log.ip }}
- -
-

- {% if hmacValid %} - ✓ INTEGRITE VERIFIEE - DONNEES CONFORMES - {% else %} - ✗ INTEGRITE COMPROMISE - DONNEES ALTEREES - {% endif %} -

-

Signature HMAC SHA-256 :

-

{{ log.hmac }}

+ +
+ Log d'activite +

Rapport de log #{{ log.id }}

+
Trace d'activite — CRM SITECONSEIL
- diff --git a/templates/components/pagination/glass.html.twig b/templates/components/pagination/glass.html.twig new file mode 100644 index 0000000..1292205 --- /dev/null +++ b/templates/components/pagination/glass.html.twig @@ -0,0 +1,23 @@ +{% if pageCount > 1 %} + +{% endif %}