53 lines
2.2 KiB
PHP
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";
|