Less home code more F3

This commit is contained in:
julien
2026-03-28 17:37:22 +01:00
parent d2e70af739
commit 16850386d3
19 changed files with 232 additions and 429 deletions

View File

@@ -7,8 +7,8 @@ abstract class BaseController
protected Base $f3;
protected DB\SQL $db;
private ?array $resolvedUser = null;
private bool $userResolved = false;
// false = pas encore résolu, null = résolu sans utilisateur.
private array|false|null $resolvedUser = false;
public function __construct()
{
@@ -20,9 +20,9 @@ abstract class BaseController
{
$user = $this->currentUser();
// Les pages publiques peuvent rester cacheables avec le TTL demandé.
// Les pages publiques restent cacheables avec le TTL demandé.
// Si un utilisateur est connecté, le layout dépend de la session
// (navigation d'admin, déconnexion + CSRF) : on force expire(0)
// (navigation admin, déconnexion + CSRF) : on force expire(0)
// pour ne pas servir ce rendu à d'autres visiteurs.
$this->f3->expire($user !== null ? 0 : $cacheTtl);
@@ -37,19 +37,17 @@ abstract class BaseController
'metaDescription' => null,
]);
// Mémoriser en session la valeur exposée à @CSRF pour que les
// formulaires rendus pendant cette réponse puissent être vérifiés
// lors du POST suivant par verifyCsrf().
// Recopier @CSRF en session pour que verifyCsrf() puisse
// vérifier le jeton soumis au POST suivant.
$this->f3->copy('CSRF', 'SESSION.csrf');
echo Template::instance()->render('layout.html');
}
protected function currentUser(): ?array
{
if (!$this->userResolved) {
if ($this->resolvedUser === false) {
$userId = (int) ($this->f3->get('SESSION.user_id') ?? 0);
$this->resolvedUser = $userId > 0 ? (new User($this->db))->findById($userId) : null;
$this->userResolved = true;
}
return $this->resolvedUser;
@@ -65,15 +63,12 @@ abstract class BaseController
$this->f3->reroute('@login');
}
// La classe Session de F3 expose la valeur courante via « CSRF ».
// Au rendu, on la recopie en SESSION.csrf ; le formulaire renvoie
// ensuite le jeton affiché lors du rendu précédent, qu'on compare à
// la valeur mémorisée en session.
protected function verifyCsrf(): void
{
$submitted = (string) ($this->f3->get('POST.csrf_token') ?? '');
$expected = (string) ($this->f3->get('SESSION.csrf') ?? '');
// hash_equals : comparaison en temps constant contre les attaques temporelles.
if ($submitted !== '' && $expected !== '' && hash_equals($expected, $submitted)) {
return;
}