3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
session_start(); // Ouverture de session (avant tout autre envoi au client!!!)
Initialiser_session();
}
//************************************************************************************************************
// Fonction : Initialise une session neuve, UNE fois : valeurs par défaut, paramètres de TB_Configuration, langues,
// textes. Auparavant fait uniquement par index.php : une page ouverte directement (lien d'invitation
// scanné sur un téléphone, favori...) utilisait des variables inexistantes (synthèse §47).
// Reçoit : Rien
// Retour : Rien
//************************************************************************************************************
function Initialiser_session()
{
if (isset($_SESSION['session_initialisee'])) return;
$_SESSION['acces_valide'] = false;
$_SESSION['display_menu'] = false;
$_SESSION['langue'] = 'FR'; // Valeur par défaut, remplacée par Langue_par_defaut de TB_Configuration
$_SESSION['shipmember'] = array('Cle_primaire' => 0, 'Prenom' => "", 'Nom' => "", 'Entreprise' => "", 'Rue' => "",
'Code_postal' => "", 'Ville' => "", 'ID_Pays' => 75, 'Telephone' => "", 'Email' => "",
'Commentaires' => "", 'Niveau_acces' => 0);
$_SESSION['droits_acces'] = 0;
$_SESSION['bateau_shipmember'] = array();
$_SESSION['acces'] = 0;
$_SESSION['modifier_texte'] = 0;
Ouverture_bdd();
// Paramètres de configuration générale :
$reponse = Requete_bdd('SELECT Nom, Valeur FROM TB_Configuration WHERE Validite=1', __FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
if ($donnees['Nom'] == "Langue_par_defaut") $_SESSION['langue'] = $donnees['Valeur'];
else $_SESSION['Config__'.$donnees['Nom']] = $donnees['Valeur'];
}
Liberation_jeu_de_resultat_bdd($reponse);
// ID des langues selon leur préfixe :
$reponse = Requete_bdd('SELECT ID, Prefix FROM TB_Langues', __FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse)) $_SESSION['id_langue'][$donnees['Prefix']] = $donnees['ID'];
Liberation_jeu_de_resultat_bdd($reponse);
Fermeture_bdd();
chargement_langue(); // Textes de la langue en cours
$_SESSION['session_initialisee'] = true;
}
//************************************************************************************************************
// Fonction : Insertion de l'entête des pages HTML ; essentiellement la partie .
// Au passage, cette fonction étant la première appelée par chaque page (après l'ouverture
// de session obligatoire pour pouvoir accéder aux variables de session), on vérifie si
// l'environnement est correctement positionné. Si ce n'est pas le cas, par exemple avec
// l'accès à la BDD non établi ou aucune langue sélectionnée, elle renvoit immédiatement
// vers le fichier 'index.php' qui s'en chargera.
// Reçoit : Rien
// Retour : Rien
//************************************************************************************************************
function Entete_page_html()
{
// Vérification à chaque ouverture de page que les variables de session sont bien initialisées (le test se fait sur quelques "échantillons" supposés représentatifs...) :
if ((!isset($_SESSION['langue'])) OR
(!isset($_SESSION['display_menu'])))
{
header('Location:index.php?origine='.basename($_SERVER['SCRIPT_FILENAME']));
exit();
}
// Entête HTML :
echo '';
echo '';
echo '
';
echo '';
echo 'ShipHeart - Simplicity is true luxury';
echo '';
echo '';
echo '';
echo '';
echo '';
// NB (synthèse §50) : les polices Montserrat et Oswald ne sont plus chargées depuis fonts.googleapis.com - aucune
// feuille de style ne les utilisait (police du système), et chaque visite transmettait l'adresse IP du visiteur à
// Google (problème RGPD).
// NB (synthèse §50) : Leaflet (cartographie, chargé depuis unpkg.com) et noUiSlider (curseur de dates) ne sont plus
// chargés - ils servaient aux onglets du modèle CM4, retirés au §47 ; aucune page ne les utilise plus.
// gestion des fichiers CSS (et de scripts spécifiques à certains fichiers) :
switch(basename($_SERVER['SCRIPT_FILENAME']))
{
case "administration.php" : { echo ''; break; }
case "textes.php" : { echo ''; break; }
case "bateaux.php" : { echo ''; break; }
case "cartes.php" : { echo ''; break; }
case "mentions_legales.php" : { echo ''; break; }
case "shipmembers.php" : { echo ''; break; }
case "uploads.php" : { echo ''; break; }
case "versions.php" : { echo ''; break; }
}
echo ''; // CSS de Bootstrap
echo ''; // CSS général, tous écrans.
// NB (synthèse §50) : "max-width" (largeur de la FENÊTRE) au lieu de "max-device-width" (taille physique de l'écran,
// condition dépréciée) - même effet sur un téléphone, et cohérent avec les règles "petit écran" de format.css.
echo ''; // CSS pour les petits écrans (doit être placé à la fin car il override les CSS globaux)
// Chargement de srcipts JS généraux :
// NB (synthèse §50) : Google Charts n'est plus chargé (depuis les serveurs de Google, sur toutes les pages) - les
// graphiques utilisent Chart.js, hébergé sur le VPS (vendor/chartjs) et chargé seulement par la page qui en a besoin.
echo '';
echo '';
echo '';
}
//************************************************************************************************************
// Fonction : Insertion de l'entête des pages avec l'affichage du bandeau de titre et les menus.
// Puis affichage des messages d'erreur et d'information en les marquant de façon différenciée
// selon que le menu est déployé ou non et/ou que le message d'erreur existe et/ou que le
// message d'information existe.
// Reçoit : Les message d'erreur et le message d'information (de plus, on retrouve le nom du fichier via les variables du serveur)
// Retour : Rien
//************************************************************************************************************
function Entete_page($message_erreur, $message_information)
{
$nom_page = basename($_SERVER['SCRIPT_FILENAME']);
// Détermination de la nouvelle langue par rapport à l'actuelle :
if ($_SESSION['langue'] == "FR") $new_langue = "EN";
else $new_langue = "FR";
echo '
';
// NB (synthèse §50) : le script du menu mobile de l'ancien site (nav_bar_global, menu_mobile, img_type, portail_pro,
// portail_par) a été retiré. Ces éléments n'existent plus : il provoquait une erreur JavaScript à chaque chargement de
// page et à chaque clic, et redirigeait le logo vers bienvenue.php / accueil.php, pages qui n'existent plus.
//--------------------------------------------------------------------------------------------
// Script d'affichage/masquage du menu :
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
// Affichage des messages d'erreur et d'info sous le menu :
//--------------------------------------------------------------------------------------------
if (!PRODUCTION) $message_erreur .= "/!\ Base de données de test [".BDD_DATABASE."] ";
// else $message_erreur .= "Base de données de production [".BDD_DATABASE."] ";
if ($message_erreur != "") echo '
'.$message_erreur.'
';
if ($message_information != "") echo '
'.$message_information.'
';
}
//************************************************************************************************************
// Fonction : Insertion du pied de page
// Reçoit : Rien (mais on retrouve le nom du fichier via les variables du serveur)
// Retour : Rien
//************************************************************************************************************
function Pied_de_page()
{
$nom_page = basename($_SERVER['SCRIPT_FILENAME']);
// echo "";
echo '
';
//==================================================================================
// Script JS pour pieds de page :
?>';
echo '';
} // Fin de la fonction Pied_de_page()
//************************************************************************************************************
// Jeton anti-CSRF (synthèse §48) : un jeton aléatoire par session, inclus dans chaque formulaire et vérifié à chaque
// requête POST - un formulaire envoyé depuis un autre site ne peut pas le connaître. Complète SameSite=Lax.
//************************************************************************************************************
// Fonction : Jeton de la session (créé au premier appel).
// Retour : Le jeton (64 caractères hexadécimaux)
function Jeton_csrf()
{
if (empty($_SESSION['jeton_csrf'])) $_SESSION['jeton_csrf'] = bin2hex(random_bytes(32));
return $_SESSION['jeton_csrf'];
}
// Fonction : Champ caché portant le jeton, à placer dans chaque formulaire POST.
// Retour : Le code HTML du champ
function Champ_jeton_csrf()
{
return '';
}
// Fonction : Vérifie le jeton reçu dans la requête POST (comparaison à temps constant).
// Retour : true si le jeton est présent et correct
function Jeton_csrf_valide()
{
return (isset($_POST['jeton_csrf']) && is_string($_POST['jeton_csrf']) && hash_equals(Jeton_csrf(), $_POST['jeton_csrf']));
}