installation du réperttoire www/live afin de gérer le vérificateur d'accès à la page live (wasm et api)
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
//************************************************************************************************************
|
||||
// live/commun.php - Fonctions communes du vérificateur du Live distant (synthèse §49).
|
||||
//
|
||||
// Le dossier /var/www/live est servi par le conteneur ship2net-php sur un port INTERNE (8081), joint uniquement
|
||||
// par Traefik : aucun routeur public ne mène à ce port, et il est hors de /var/www/html (le site public). Il ne
|
||||
// charge que les définitions (connexion à la base), pas fonctions.php : il est appelé à chaque requête vers un
|
||||
// bateau (fichiers du wasm et API).
|
||||
//************************************************************************************************************
|
||||
|
||||
require_once(__DIR__."/../config/production.php");
|
||||
require_once(__DIR__."/../config/definitions.php");
|
||||
|
||||
const NOM_COOKIE_LIVE = "ship2net_live";
|
||||
const DUREE_SESSION_LIVE_DEFAUT = 4; // heures, si TB_Configuration.Duree_session_live est absente
|
||||
|
||||
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // Erreurs SQL en exceptions (traitées : refus par défaut)
|
||||
|
||||
|
||||
//************************************************************************************************************
|
||||
// Fonction : Numéro du bateau visé, d'après le nom d'hôte de la requête d'origine (b<N>.ship2net.fr).
|
||||
// Reçoit : Le nom d'hôte
|
||||
// Retour : Le numéro (entier > 0), ou 0 si le nom ne correspond pas
|
||||
//************************************************************************************************************
|
||||
function Bateau_depuis_hote($hote)
|
||||
{
|
||||
$hote = strtolower(preg_replace('/:\d+$/', '', trim((string)$hote))); // sans port éventuel
|
||||
if (preg_match('/^b([1-9][0-9]{0,9})\.'.preg_quote(URL_SITE, '/').'$/', $hote, $m) !== 1) return 0;
|
||||
return (int)$m[1];
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************************************************
|
||||
// Fonction : Connexion à la base principale (mêmes paramètres que le site).
|
||||
// Retour : L'objet mysqli (exception en cas d'échec)
|
||||
//************************************************************************************************************
|
||||
function Connexion_live()
|
||||
{
|
||||
return new mysqli(BDD_HOST, BDD_USER, BDD_PASSWORD, BDD_DATABASE);
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************************************************
|
||||
// Fonction : Page d'explication renvoyée au navigateur (ticket invalide, session expirée...), avec un lien vers le
|
||||
// portail. Le code HTTP est fourni par l'appelant.
|
||||
//************************************************************************************************************
|
||||
function Page_refus($code_http, $titre, $texte)
|
||||
{
|
||||
http_response_code($code_http);
|
||||
header('Content-Type: text/html; charset=UTF-8');
|
||||
header('Cache-Control: no-store');
|
||||
echo '<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1">'
|
||||
.'<title>'.htmlspecialchars($titre).'</title>'
|
||||
.'<style>body{font-family:-apple-system,Segoe UI,Roboto,Arial,sans-serif;color:#004563;text-align:center;padding:3em 1em}'
|
||||
.'a{display:inline-block;margin-top:1.5em;padding:.6em 1.5em;border-radius:1em;background:#004563;color:#fff;text-decoration:none}</style>'
|
||||
.'</head><body><h1>'.htmlspecialchars($titre).'</h1><p>'.htmlspecialchars($texte).'</p>'
|
||||
.'<a href="https://'.URL_SITE.'/shipmembers.php">'.htmlspecialchars("Retour au portail Ship2net").'</a></body></html>';
|
||||
exit();
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************************************************
|
||||
// Fonction : Le ShipMember a-t-il droit au Live de ce bateau EN CE MOMENT ? Compte valide, et : administrateur, ou
|
||||
// accès 'actif' non expiré au bateau. Appelée à l'ouverture de la session ET à chaque requête : un accès
|
||||
// suspendu ou révoqué depuis le portail coupe le Live immédiatement.
|
||||
// Retour : true si autorisé
|
||||
//************************************************************************************************************
|
||||
function Droit_live($db, $id_shipmember, $id_bateau)
|
||||
{
|
||||
$stmt = $db->prepare("SELECT 1 FROM TB_Shipmembers M
|
||||
WHERE M.ID=? AND M.Validite=1
|
||||
AND (M.Niveau_acces >= ?
|
||||
OR EXISTS (SELECT 1 FROM TB_Lien_bateau_shipmember L
|
||||
WHERE L.ID_Shipmember=M.ID AND L.ID_Bateau=? AND L.Statut='actif' AND L.Fin_validite >= NOW()))");
|
||||
$niveau_admin = NIVEAU_ACCES_MINI_ADMINISTRATEUR;
|
||||
$stmt->bind_param('iii', $id_shipmember, $niveau_admin, $id_bateau);
|
||||
$stmt->execute();
|
||||
$autorise = ($stmt->get_result()->num_rows == 1);
|
||||
$stmt->close();
|
||||
return $autorise;
|
||||
}
|
||||
Reference in New Issue
Block a user