Files
ship2net-www/live/verifier.php
T

53 lines
2.2 KiB
PHP

<?php
//************************************************************************************************************
// live/verifier.php - Vérification d'une session Live, appelée par Traefik (middleware ForwardAuth) pour CHAQUE
// requête vers un bateau (fichiers du wasm comme API) - synthèse §49.
// Traefik transmet les en-têtes de la requête d'origine (cookie compris) et indique l'hôte d'origine dans
// X-Forwarded-Host (qu'il réécrit lui-même : non falsifiable par le client, et ce port n'est joignable que par lui).
// Réponse 200 : Traefik laisse passer la requête vers le CM5. Toute autre réponse est renvoyée telle quelle au
// navigateur. Refus par défaut : toute anomalie (base injoignable comprise) aboutit à un refus.
//************************************************************************************************************
require_once(__DIR__."/commun.php");
$id_bateau = Bateau_depuis_hote($_SERVER['HTTP_X_FORWARDED_HOST'] ?? '');
$valeur_cookie = $_COOKIE[NOM_COOKIE_LIVE] ?? '';
$autorise = false;
if ($id_bateau > 0 && is_string($valeur_cookie) && preg_match('/^[0-9a-f]{64}$/', $valeur_cookie) === 1)
{
try
{
$db = Connexion_live();
$empreinte = hash('sha256', $valeur_cookie);
$stmt = $db->prepare("SELECT ID_Shipmember FROM TB_Sessions_live WHERE Empreinte=? AND ID_Bateau=? AND Expiration > NOW()");
$stmt->bind_param('si', $empreinte, $id_bateau);
$stmt->execute();
$ligne = $stmt->get_result()->fetch_row();
$stmt->close();
if ($ligne) $autorise = Droit_live($db, (int)$ligne[0], $id_bateau);
$db->close();
}
catch (Throwable $e)
{
error_log("live/verifier.php : ".$e->getMessage());
$autorise = false;
}
}
if ($autorise)
{
http_response_code(200);
exit();
}
// Refus : page explicative pour une navigation (le navigateur affiche une page), réponse brève pour l'API (appels du wasm) :
$accept = $_SERVER['HTTP_ACCEPT'] ?? '';
if (strpos($accept, 'text/html') !== false)
{
Page_refus(401, "Session Live expirée", "Votre session Live a expiré, ou votre accès à ce bateau a changé. Ouvrez à nouveau le Live depuis la page du bateau, sur le portail.");
}
http_response_code(401);
header('Content-Type: text/plain; charset=UTF-8');
header('Cache-Control: no-store');
echo "Session Live absente ou expirée";