Grosses mises à jour de shipmembers.php et adminstration.php pour revoir le process d'invitation sur un bateau mais aussi les sécurités de base sur les fichiers index.php et les fonctions_html.php

This commit is contained in:
2026-10-05 13:48:45 +00:00
parent 7146bce248
commit b7cb39bbe6
10 changed files with 2752 additions and 2511 deletions
+2 -30
View File
@@ -162,7 +162,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Récupération des informations sur le ou les bateaux accessibles à ce ShipMember :
$nb_bateaux = 0;
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE ID_SHIPMEMBER=? ';
$requete = "SELECT * FROM TB_Lien_bateau_shipmember WHERE ID_SHIPMEMBER=? AND Statut IN ('actif','suspendu')"; // Hors invitations et accès révoqués (synthèse §47)
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['Administration']['id_shipmember'])),
@@ -187,36 +187,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
}
Liberation_jeu_de_resultat_bdd($reponse);
}
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
$message_erreur .= "Code invalide ou déjà utilisé \n";
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
}
// Récupération des liaisons shipmember - bateau
$current_timestamp = date_format(date_create(), 'Y-m-d H:i:s');
$requete = 'SELECT ID_Bateau, ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' AND Validite=1 AND Validite_acces=1 AND Fin_validite>="'.$current_timestamp.'"';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$nb_acces = 0;
// $bateau_shipmember = []
while ($donnees = Recherche_ligne_bdd($reponse)) {
$_SESSION['bateau_shipmember'][$nb_acces++] = $donnees;
}
$_SESSION['acces'] = $nb_acces;
Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); // Accès actifs (synthèse §47)
// $_SESSION['acces_valide'] = true;
break;
+257 -193
View File
@@ -11,6 +11,11 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$message_erreur = "";
$message_information = "";
// Messages transmis par une redirection (motif POST -> redirection -> GET, après une action sur les accès : un
// rafraîchissement de la page ne rejoue jamais l'action) :
if (isset($_SESSION['Bateaux']['flash_information'])) { $message_information .= $_SESSION['Bateaux']['flash_information']; unset($_SESSION['Bateaux']['flash_information']); }
if (isset($_SESSION['Bateaux']['flash_erreur'])) { $message_erreur .= $_SESSION['Bateaux']['flash_erreur']; unset($_SESSION['Bateaux']['flash_erreur']); }
Ouverture_bdd(); // Connexion à MySql
@@ -224,46 +229,12 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
}
//---------------------------------------------------------------------------
// Modifier la validité des droits
if (isset($_POST['validite_acces'])) {
// echo 'Validité = ON pour ID='.$_POST['ID'].'<br />';
$requete = 'UPDATE TB_Lien_bateau_shipmember SET Validite_acces = 1 WHERE ID = '.$_POST['ID'];
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
}
else if (!isset($_POST['validite_acces']) && isset($_POST['ID']) && !isset($_POST['supprimerAcces']) && !isset($_POST['modifierAcces'])){
// echo 'Validité = OFF pour ID='.$_POST['ID'].'<br />';
$requete = 'UPDATE TB_Lien_bateau_shipmember SET Validite_acces = 0 WHERE ID = '.$_POST['ID'];
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
}
//---------------------------------------------------------------------------
// Supprimer l'accès
if (isset($_POST['supprimerAcces']) && isset($_POST['ID'])){
$id = $_POST['ID'];
$requete = 'UPDATE TB_Lien_bateau_shipmember SET Validite = 0 WHERE ID = ? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $id)),
__FILE__, __LINE__);
}
// NB : les actions sur les accès et invitations (création, suspension, réactivation, révocation, modification, PDF)
// sont traitées plus bas, dans la page Details_bateau, APRÈS le calcul des droits de l'utilisateur sur le bateau
// (elles étaient auparavant exécutées ici, avant tout contrôle - synthèse §47).
//---------------------------------------------------------------------------
// Modifier l'accès
if (isset($_POST['modifierAcces']) && isset($_POST['ID'])){
$id = $_POST['ID'];
$fin_validite = $_POST['fin_validite']." 23:59:59";
$type_profil = $_POST['type_profil'];
$requete = 'UPDATE TB_Lien_bateau_shipmember SET Fin_validite = ? , ID_Type_acces_bateau_shipmember = ? WHERE ID = ? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('s', $fin_validite),
array('i', $type_profil),
array('i', $id)),
__FILE__, __LINE__);
}
//************************************************************************************************************************************
// Traitement des données
//************************************************************************************************************************************
@@ -283,7 +254,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Recherche des droits d'accès à un bateau en particulier :
if ($_SESSION['Bateaux']['page'] == "Details_bateau")
{
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Validite_acces=1 AND ID_SHIPMEMBER=? AND ID_BATEAU=? ';
$requete = "SELECT * FROM TB_Lien_bateau_shipmember WHERE Statut='actif' AND Fin_validite >= NOW() AND ID_SHIPMEMBER=? AND ID_BATEAU=? ";
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire']),
@@ -299,7 +270,13 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
}
} while (0);
if ($flag_sortie) header('Location:shipmembers.php?action=navigation&destination=Login');
if ($flag_sortie)
{
// exit indispensable : sans lui, le reste de la page (actions comprises) s'exécutait malgré la redirection (synthèse §47)
Fermeture_bdd();
header('Location:shipmembers.php?action=navigation&destination=Login');
exit();
}
switch ($_SESSION['Bateaux']['page'])
@@ -406,7 +383,9 @@ $requete .= ' TB_Bateaux.Date_derniere_maj AS Date_derniere_maj, ';
$acces_profil['Modification_acces'] = 0;
// Recherche de l'ID de l'accès le plus élevé pour ce bateau et ce shipmember :
$requete = 'SELECT ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Validite_acces=1 AND ID_Shipmember=? AND ID_Bateau=? AND Fin_validite>=? ORDER BY ID_Type_acces_bateau_shipmember DESC LIMIT 1';
// NB : "ORDER BY ... ASC" - plus la clé du type est petite, plus il donne de droits (2 Propriétaire, 3 Installateur,
// 4 Skipper). L'ancien "DESC" retenait l'accès le plus FAIBLE quand un SM en avait plusieurs (synthèse §47).
$requete = "SELECT ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE Statut='actif' AND ID_Shipmember=? AND ID_Bateau=? AND Fin_validite>=? ORDER BY ID_Type_acces_bateau_shipmember ASC LIMIT 1";
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire']),
@@ -434,11 +413,11 @@ $requete .= ' TB_Bateaux.Date_derniere_maj AS Date_derniere_maj, ';
}
Liberation_jeu_de_resultat_bdd($reponse);
}
$acces_profil['Modification_acces'] = 0; // Modification d'un accès (type, fin) : réservée aux administrateurs
}
// Récupération des types d'accès possibles :
//$requete = 'SELECT Nom, Niveau_acces FROM TB_Lien_bateau_shipmember_acces WHERE Validite = 1 AND Niveau_acces < 99';
$requete = 'SELECT * FROM TB_Types_acces_bateau_shipmember WHERE Validite=1 ';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$type_acces_nb = 0;
@@ -451,44 +430,97 @@ $requete .= ' TB_Bateaux.Date_derniere_maj AS Date_derniere_maj, ';
Liberation_jeu_de_resultat_bdd($reponse);
// Génération d'un nouveau code d'acces :
if (isset($_POST['generer_code_acces'])){
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$unique = false;
do { // Vérifier si le code n'est pas déjà utilisé
$code_acces = '';
for ($i = 0; $i < 6; $i++) {
$code_acces .= $characters[random_int(0, $charactersLength - 1)];
}
$req = 'SELECT Code FROM TB_Lien_bateau_shipmember WHERE Code="'.$code_acces.'"';
$rep = Requete_bdd($req, __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($rep);
if ($donnees == NULL) $unique = true;
} while($unique == false);
//------------------------------------------------------------------------------------------------------------
// Actions sur les accès et invitations de CE bateau (synthèse §47). Traitées ici, APRÈS le calcul des droits :
// - chaque action vérifie que l'accès visé appartient bien au bateau affiché ;
// - créer une invitation, télécharger son PDF : administrateur, ou Creation_profils = 1 ;
// - suspendre, réactiver, révoquer : administrateur, ou Devalidation_profils = 2 (tous types), ou = 1 (tous
// sauf Propriétaire) ; une invitation en attente peut aussi être révoquée par qui peut en créer ;
// - modifier le type ou la fin d'un accès : administrateur.
// Après chaque action : redirection vers la page (motif POST -> redirection -> GET).
//------------------------------------------------------------------------------------------------------------
$est_administrateur = ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR);
$peut_inviter = ($est_administrateur || $acces_profil['Creation_profils'] == 1);
if (isset($_POST['date_validite']) && (!empty($_POST['date_validite']))){
$date = $_POST['date_validite']." 00:00:00";
if (isset($_POST['creer_invitation']))
{
if (!$peut_inviter) $_SESSION['Bateaux']['flash_erreur'] = t("Vous n'avez pas le droit d'inviter sur ce bateau.");
else
{
$resultat = Creer_invitation($bateau['Cle_primaire'], $_POST['email_invite'] ?? '', $_POST['prenom_invite'] ?? '',
$_POST['nom_invite'] ?? '', (int)($_POST['type_acces'] ?? 0), $_POST['fin_acces'] ?? '',
$_SESSION['shipmember']['Cle_primaire']);
if ($resultat['ok']) $_SESSION['Bateaux']['flash_information'] = str_replace("[[Code]]", $resultat['code'],
t("Invitation créée (code [[Code]]). Téléchargez son PDF dans la liste ci-dessous."));
else $_SESSION['Bateaux']['flash_erreur'] = $resultat['raison'];
}
else $date = '9999-12-31 23:59:59';
$requete = 'INSERT INTO TB_Lien_bateau_shipmember(ID_Bateau, Code, Fin_validite, Cree_par, ID_Type_acces_bateau_shipmember) VALUES (?,?,?,?,?)';
$reponse = Requete_preparee_bdd($requete, array(
array('i', $bateau['Cle_primaire']),
array('s', $code_acces),
array('s', $date),
array('i', $_SESSION['shipmember']['Cle_primaire']),
array('i', $_POST['type_acces'])
),__FILE__, __LINE__);
$no = Recuperation_id_cree_bdd();
Fermeture_bdd();
header('Location: bateaux.php');
exit();
}
if ( code_acces_pdf($code_acces, $no, $bateau['Adresse_mac'],"")== 0 ) Entete_page_html();
if (isset($_POST['action_acces']) && isset($_POST['ID']))
{
$lien = Lien_du_bateau((int)$_POST['ID'], $bateau['Cle_primaire']);
$action = (string)$_POST['action_acces'];
// Message d'information :
// if (isset($_SESSION['pdf']['src']) && $_SESSION['pdf']['src'] != '')
// $message_information.= "Télécharger le code d'accès d'<a class='download' target='_blank' href= ".$_SESSION['pdf']['src']."> ici </a> ";
// $_SESSION['pdf']['src'] ='';
if ($lien === null) $_SESSION['Bateaux']['flash_erreur'] = t("Accès introuvable pour ce bateau.");
else if ($action == 'pdf')
{
if (!$peut_inviter || $lien['Statut'] != 'en_attente') $_SESSION['Bateaux']['flash_erreur'] = t("Action non autorisée.");
else
{
$invitation = Invitation_par_code($lien['Code']);
$invitation['Code'] = $lien['Code'];
$invitation['Expiration_invitation'] = $lien['Expiration_invitation'];
Fermeture_bdd();
code_acces_pdf($invitation);
exit();
}
}
else
{
$autorise = Peut_devalider_acces($acces_profil, $est_administrateur, $lien['ID_Type_acces_bateau_shipmember'])
|| ($action == 'revoquer' && $lien['Statut'] == 'en_attente' && $peut_inviter);
$transitions = array( 'suspendre' => array("'actif'", 'suspendu'),
'reactiver' => array("'suspendu'", 'actif'),
'revoquer' => array("'en_attente','actif','suspendu'", 'revoque'));
if (!$autorise || !isset($transitions[$action])) $_SESSION['Bateaux']['flash_erreur'] = t("Action non autorisée.");
else
{
$requete = "UPDATE TB_Lien_bateau_shipmember SET Statut=? WHERE ID=? AND ID_Bateau=? AND Statut IN (".$transitions[$action][0].")";
Requete_preparee_bdd($requete, array(
array('s', $transitions[$action][1]), array('i', $lien['ID']), array('i', $bateau['Cle_primaire'])),
__FILE__, __LINE__);
if (Nb_lignes_modifiees() == 1) $_SESSION['Bateaux']['flash_information'] = t("Accès mis à jour.");
else $_SESSION['Bateaux']['flash_erreur'] = t("Cet accès a déjà changé d'état.");
}
}
Fermeture_bdd();
header('Location: bateaux.php');
exit();
}
if (isset($_POST['modifierAcces']) && isset($_POST['ID']))
{
$lien = Lien_du_bateau((int)$_POST['ID'], $bateau['Cle_primaire']);
$date = date_create_from_format('Y-m-d', (string)($_POST['fin_validite'] ?? ''));
if (!$est_administrateur || $lien === null || $lien['Statut'] == 'revoque') $_SESSION['Bateaux']['flash_erreur'] = t("Action non autorisée.");
else if ($date === false) $_SESSION['Bateaux']['flash_erreur'] = t("Date de fin d'accès invalide.");
else
{
$requete = "UPDATE TB_Lien_bateau_shipmember SET Fin_validite=?, ID_Type_acces_bateau_shipmember=?
WHERE ID=? AND ID_Bateau=? AND EXISTS (SELECT 1 FROM TB_Types_acces_bateau_shipmember WHERE Cle_primaire=? AND Validite=1)";
Requete_preparee_bdd($requete, array(
array('s', $date->format('Y-m-d').' 23:59:59'), array('i', (int)$_POST['type_profil']),
array('i', $lien['ID']), array('i', $bateau['Cle_primaire']), array('i', (int)$_POST['type_profil'])),
__FILE__, __LINE__);
if (Nb_lignes_modifiees() == 1) $_SESSION['Bateaux']['flash_information'] = t("Accès mis à jour.");
else $_SESSION['Bateaux']['flash_erreur'] = t("Aucune modification enregistrée (type d'accès invalide, ou valeurs identiques).");
}
Fermeture_bdd();
header('Location: bateaux.php');
exit();
}
@@ -499,34 +531,29 @@ $requete .= ' TB_Bateaux.Date_derniere_maj AS Date_derniere_maj, ';
//=========================
case "gerer_les_acces":
{
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND ID_Bateau='.$bateau['Cle_primaire'].' AND ID_Shipmember!=0 ';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
// Accès et invitations du bateau, hors révoqués (synthèse §47) - une seule requête au lieu de 3 par ligne :
$colonne_type = ($_SESSION['langue'] == "EN") ? 'Nom_en' : 'Nom_fr';
$requete = "SELECT L.*, S.Prenom AS sm_Prenom, S.Nom AS sm_Nom, S.Email AS sm_Email,
C.Prenom AS cree_par_Prenom, C.Nom AS cree_par_Nom, T.".$colonne_type." AS Niveau_acces_nom,
(L.Expiration_invitation IS NOT NULL AND L.Expiration_invitation <= NOW()) AS Expiree
FROM TB_Lien_bateau_shipmember L
LEFT JOIN TB_Shipmembers S ON S.ID = L.ID_Shipmember
LEFT JOIN TB_Shipmembers C ON C.ID = L.Cree_par
LEFT JOIN TB_Types_acces_bateau_shipmember T ON T.Cle_primaire = L.ID_Type_acces_bateau_shipmember
WHERE L.ID_Bateau=? AND L.Statut <> 'revoque'
ORDER BY FIELD(L.Statut, 'actif', 'suspendu', 'en_attente'), L.Date_creation";
$reponse = Requete_preparee_bdd($requete, array(array('i', $bateau['Cle_primaire'])), __FILE__, __LINE__);
$utilisateur_acces_nb = 0;
while ($donnees = Recherche_ligne_bdd($reponse)){
// Récupérer le nom et le prénom du shipmember qui a accès :
$sous_req = ' SELECT Nom, Prenom, Email FROM TB_Shipmembers WHERE Validite=1 AND ID='.$donnees['ID_Shipmember'].'';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_donnees = Recherche_ligne_bdd($sous_rep);
$donnees['sm_Nom'] = $sous_donnees['Nom'];
$donnees['sm_Prenom'] = $sous_donnees['Prenom'];
$donnees['sm_Email'] = $sous_donnees['Email'];
// Récupérer le nom et le prénom du shipmember qui a crée le lien :
$sous_req = ' SELECT Nom, Prenom FROM TB_Shipmembers WHERE Validite=1 AND ID='.$donnees['Cree_par'].'';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_donnees = Recherche_ligne_bdd($sous_rep);
$donnees['cree_par_Nom'] = $sous_donnees['Nom'];
$donnees['cree_par_Prenom'] = $sous_donnees['Prenom'];
// Récupérer le niveau accès garantie à l'utilisateur :
//$sous_req = ' SELECT Nom FROM TB_Lien_bateau_shipmember_acces WHERE Validite=1 AND Niveau_acces='.$donnees['Niveau_acces'].'';
$sous_req = 'SELECT * FROM TB_Types_acces_bateau_shipmember WHERE Validite=1 AND Cle_primaire='.$donnees['ID_Type_acces_bateau_shipmember'].' ';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_donnees = Recherche_ligne_bdd($sous_rep);
if ($_SESSION['langue'] == "EN") $donnees['Niveau_acces_nom'] = $sous_donnees['Nom_en'];
else $donnees['Niveau_acces_nom'] = $sous_donnees['Nom_fr'];
while ($donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC))
{
// Destinataire affiché : le ShipMember s'il a accepté, sinon la personne invitée :
if ($donnees['Statut'] == 'en_attente') $donnees['Destinataire'] = trim($donnees['Prenom_invite'].' '.$donnees['Nom_invite']).' ['.$donnees['Email_invite'].']';
else $donnees['Destinataire'] = trim($donnees['sm_Prenom'].' '.$donnees['sm_Nom']).' ['.$donnees['sm_Email'].']';
$donnees['Cree_par_nom'] = trim($donnees['cree_par_Prenom'].' '.$donnees['cree_par_Nom']);
unset($donnees['Code']); // Jamais envoyé au navigateur (le JSON de chaque ligne alimente le popup)
$utilisateur_acces[$utilisateur_acces_nb++] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
break;
}
default: break;
@@ -713,99 +740,138 @@ $requete .= ' TB_Bateaux.Date_derniere_maj AS Date_derniere_maj, ';
//===========================================================
case "gerer_les_acces":
{
echo '<div class="gestion_acces">';
echo ' <div class="generer_code">
<form action="bateaux.php" method="POST">';
echo ' <select name="type_acces" id="type_acces" required>
<option value="" disabled selected> -- '.$_SESSION['textes']['bateau']['details']['acces']['select'] .' -- </option>' ;
for ($i = 0; $i < $type_acces_nb; $i++){
echo '<option value="'.$type_acces[$i]['Cle_primaire'].'"> '.$type_acces[$i]['Nom'].' </option>';
}
echo ' </select>';
echo ' <input type="date" name="date_validite" id="date_validite"> ';
echo ' <button type="submit" name="generer_code_acces"> '.$_SESSION['textes']['bateau']['details']['acces']['generer'] .' </button>';
echo ' </form>
</div>';
echo ' <div class="users"> ';
echo ' <table>';
echo ' <tr>';
echo ' <th> '.t("Validite").' </th>';
echo ' <th> '.t("Shipmember").'</th>';
echo ' <th> '.t("Créé_par").'</th>';
echo ' <th> '.t("Type de profil").'</th>';
echo ' <th> '.t("Fin de validité").' </th>';
echo ' <th> </th>';
echo ' </tr>';
if ($utilisateur_acces_nb == 0) echo '<tr> <td colspan="5"> 0 shipmember / acces </td> </tr>';
else {
for($i = 0; $i < $utilisateur_acces_nb; $i++){
// Texte sûr pour le HTML (les données viennent des utilisateurs : noms, adresses...) :
$h = function($texte) { return htmlspecialchars((string)$texte, ENT_QUOTES, 'UTF-8'); };
echo ' <form action="bateaux.php" method="POST">';
echo ' <tr>';
echo ' <td > <input name="validite_acces" onChange="this.form.submit()" type="checkbox" ';
if (isset($acces_profil['Devalidation_profils']) && $acces_profil['Devalidation_profils'] == 0) echo ' disabled ';
if (isset($acces_profil['Devalidation_profils']) && $acces_profil['Devalidation_profils'] == 1 && $utilisateur_acces[$i]['ID_Type_acces_bateau_shipmember'] == 2) echo ' disabled ';
if ($utilisateur_acces[$i]['Validite_acces'] == 1) echo 'checked';
echo '> </td>';
echo ' <td> '.$utilisateur_acces[$i]['sm_Prenom'].' '.$utilisateur_acces[$i]['sm_Nom'].' ['.$utilisateur_acces[$i]['sm_Email'].']</td>';
echo ' <td> '.$utilisateur_acces[$i]['cree_par_Prenom'].' '.$utilisateur_acces[$i]['cree_par_Nom'].'</td>';
echo ' <td name="niveau_acces" value="'.$utilisateur_acces[$i]['ID_Type_acces_bateau_shipmember'].'">'.$utilisateur_acces[$i]['Niveau_acces_nom'].'</td>';
echo ' <td name="fin_validite" value="'.$utilisateur_acces[$i]['Fin_validite'].'"> ';
echo (substr($utilisateur_acces[$i]['Fin_validite'],0,-9) == "9999-12-31") ? Recuperer_texte("bateau","details","acces","aucune_fin") : substr($utilisateur_acces[$i]['Fin_validite'],0,-9) ;
echo ' </td>';
echo ' <input hidden name="ID" value="'.$utilisateur_acces[$i]['ID'].'">';
if ($acces_profil['Modification_acces'] == 1){
echo ' <td id="modifier_acces" onclick="popUpEditAccess(' . htmlspecialchars(json_encode($utilisateur_acces[$i]), ENT_QUOTES, 'UTF-8') . ')"></td>';
}
echo ' </tr>';
echo ' </form>';
echo '<div class="gestion_acces">';
//--------------------------------------------
// Formulaire d'invitation nominative (synthèse §47) :
if ($peut_inviter)
{
echo '<div class="generer_code">';
echo ' <form action="bateaux.php" method="POST">';
echo ' <input type="email" name="email_invite" required maxlength="254" placeholder="'.$h(t("Adresse e-mail du destinataire")).'">';
echo ' <input type="text" name="prenom_invite" maxlength="50" placeholder="'.$h(t("Prénom (facultatif)")).'">';
echo ' <input type="text" name="nom_invite" maxlength="50" placeholder="'.$h(t("Nom (facultatif)")).'">';
echo ' <select name="type_acces" required>';
echo ' <option value="" disabled selected> -- '.$h(t("Type d'accès")).' -- </option>';
for ($i = 0; $i < $type_acces_nb; $i++) echo '<option value="'.(int)$type_acces[$i]['Cle_primaire'].'">'.$h($type_acces[$i]['Nom']).'</option>';
echo ' </select>';
echo ' <input type="date" name="fin_acces" title="'.$h(t("Fin de l'accès (facultatif)")).'">';
echo ' <button type="submit" name="creer_invitation">'.$h(t("Inviter")).'</button>';
echo ' </form>';
echo '</div>';
}
//--------------------------------------------
// Liste des accès et des invitations en attente :
echo '<div class="users">';
echo ' <table>';
echo ' <tr>';
echo ' <th>'.$h(t("Statut")).'</th>';
echo ' <th>'.$h(t("Shipmember")).'</th>';
echo ' <th>'.$h(t("Créé_par")).'</th>';
echo ' <th>'.$h(t("Type de profil")).'</th>';
echo ' <th>'.$h(t("Fin de validité")).'</th>';
echo ' <th></th>';
echo ' </tr>';
if ($utilisateur_acces_nb == 0) echo '<tr><td colspan="6">'.$h(t("Aucun accès ni invitation en cours.")).'</td></tr>';
for ($i = 0; $i < $utilisateur_acces_nb; $i++)
{
$acces = $utilisateur_acces[$i];
// Statut affiché :
switch ($acces['Statut'])
{
case 'actif': $statut = t("Actif"); break;
case 'suspendu': $statut = t("Suspendu"); break;
default:
if ($acces['Expiree']) $statut = t("Invitation expirée");
else $statut = str_replace("[[Date]]", date_format(date_create($acces['Expiration_invitation']), 'd/m/Y'), t("Invitation en attente (jusqu'au [[Date]])"));
break;
}
// Actions permises sur cette ligne :
$peut_devalider = Peut_devalider_acces($acces_profil, $est_administrateur, $acces['ID_Type_acces_bateau_shipmember']);
$actions = array();
if ($acces['Statut'] == 'actif' && $peut_devalider) $actions['suspendre'] = t("Suspendre");
if ($acces['Statut'] == 'suspendu' && $peut_devalider) $actions['reactiver'] = t("Réactiver");
if ($acces['Statut'] == 'en_attente' && !$acces['Expiree'] && $peut_inviter) $actions['pdf'] = t("PDF");
if ($peut_devalider || ($acces['Statut'] == 'en_attente' && $peut_inviter)) $actions['revoquer'] = t("Révoquer");
echo ' <tr>';
echo ' <td>'.$h($statut).'</td>';
echo ' <td>'.$h($acces['Destinataire']).'</td>';
echo ' <td>'.$h($acces['Cree_par_nom']).'</td>';
echo ' <td>'.$h($acces['Niveau_acces_nom']).'</td>';
echo ' <td>'.((substr($acces['Fin_validite'], 0, 10) == "9999-12-31") ? $h(t("Aucune")) : $h(date_format(date_create($acces['Fin_validite']), 'd/m/Y'))).'</td>';
echo ' <td>';
if (count($actions) > 0)
{
echo '<form action="bateaux.php" method="POST">';
echo '<input type="hidden" name="ID" value="'.(int)$acces['ID'].'">';
foreach ($actions as $code_action => $libelle)
{
echo '<button type="submit" name="action_acces" value="'.$code_action.'"';
if ($code_action == 'revoquer') echo ' onclick="return window.confirm(\''.$h(addslashes(t("Révoquer définitivement cet accès ?"))).'\');"';
echo '>'.$h($libelle).'</button> ';
}
echo '</form>';
}
if ($acces_profil['Modification_acces'] == 1)
{
echo '<span id="modifier_acces" onclick="popUpEditAccess('.$h(json_encode($acces)).')"></span>';
}
echo ' </td>';
echo ' </tr>';
}
echo ' </table>';
echo ' </div>';
echo ' </table>';
echo '</div>';
echo '<div id="popUpAcces" style="display: none;">';
echo ' <div id="popUpAccesModal">';
echo ' <div id="top_part">';
echo ' <p> '.t("Titre du popup").' </p>';
echo ' <p id="close" onclick="closeEditAccess();"> </p>';
echo ' </div>';
echo ' <form action="bateaux.php" method="POST">';
echo ' <label for="shipmemberForm" id="ShipMember"> ';
echo ' <input id="shipmemberForm" type="text" value="" name="shipmember" readonly>';
echo ' <span>'.t("Shipmember").'</span>';
echo ' </label>';
echo ' <label for="cree_parForm" id="Cree_par"> ';
echo ' <input id="cree_parForm" type="text" value="" name="cree_par" readonly>';
echo ' <span>'.t("Créé par").'</span>';
echo ' </label>';
echo ' <label for="type_profilForm" id="Type_profil"> ';
echo ' <select name="type_profil" id="type_profilForm" required>
<option value="" disabled selected> -- '.$_SESSION['textes']['bateau']['details']['acces']['select'] .' -- </option>' ;
for ($i = 0; $i < $type_acces_nb; $i++){
echo '<option value="'.$type_acces[$i]['Cle_primaire'].'"> '.$type_acces[$i]['Nom'].' </option>';
}
echo ' </select>';
echo ' <span>'.t("Type de profil").'</span>';
echo ' </label>';
echo ' <label for="fin_validiteForm" id="Fin_validite"> ';
echo ' <input id="fin_validiteForm" type="date" value="" name="fin_validite" required>';
echo ' <span>'.t("Fin de validite").'</span>';
echo ' </label>';
echo ' <input hidden id="idForm" name="ID" value="">';
echo ' <button type="submit" name="supprimerAcces" onclick="return window.confirm(\''.$_SESSION["textes"]["bateau"]["edit_acces"]["popup"]["delete_confirm"].'\');"> '.t("Supprimer").' </button>';
echo ' <button type="submit" name="modifierAcces"> '.t("Mettre à jour").' </button>';
echo ' </form>';
echo ' </div>';
echo '</div>';
echo '</div>'; // Fin de class="gestion_acces"
//--------------------------------------------
// Popup de modification (administrateurs) : type d'accès et fin de validité.
// (La suppression se fait désormais par le bouton "Révoquer" de chaque ligne.)
if ($acces_profil['Modification_acces'] == 1)
{
echo '<div id="popUpAcces" style="display: none;">';
echo ' <div id="popUpAccesModal">';
echo ' <div id="top_part">';
echo ' <p>'.$h(t("Titre du popup")).'</p>';
echo ' <p id="close" onclick="closeEditAccess();"> </p>';
echo ' </div>';
echo ' <form action="bateaux.php" method="POST">';
echo ' <label for="shipmemberForm" id="ShipMember">';
echo ' <input id="shipmemberForm" type="text" value="" readonly>';
echo ' <span>'.$h(t("Shipmember")).'</span>';
echo ' </label>';
echo ' <label for="cree_parForm" id="Cree_par">';
echo ' <input id="cree_parForm" type="text" value="" readonly>';
echo ' <span>'.$h(t("Créé par")).'</span>';
echo ' </label>';
echo ' <label for="type_profilForm" id="Type_profil">';
echo ' <select name="type_profil" id="type_profilForm" required>';
echo ' <option value="" disabled selected> -- '.$h(t("Type d'accès")).' -- </option>';
for ($i = 0; $i < $type_acces_nb; $i++) echo '<option value="'.(int)$type_acces[$i]['Cle_primaire'].'">'.$h($type_acces[$i]['Nom']).'</option>';
echo ' </select>';
echo ' <span>'.$h(t("Type de profil")).'</span>';
echo ' </label>';
echo ' <label for="fin_validiteForm" id="Fin_validite">';
echo ' <input id="fin_validiteForm" type="date" value="" name="fin_validite" required>';
echo ' <span>'.$h(t("Fin de validite")).'</span>';
echo ' </label>';
echo ' <input type="hidden" id="idForm" name="ID" value="">';
echo ' <button type="submit" name="modifierAcces">'.$h(t("Mettre à jour")).'</button>';
echo ' </form>';
echo ' </div>';
echo '</div>';
}
break;
}
//===========================================================
// 'resume' (et toute ancienne valeur de session) :
default:
@@ -1008,20 +1074,18 @@ Pied_de_page();
document.getElementById('popUpAcces').style.display = "none";
}
function popUpEditAccess(data){
acces = data;
function popUpEditAccess(acces){
document.getElementById('popUpAcces').style.display = "block";
document.getElementById('shipmemberForm').value = acces['sm_Nom']+" "+acces['sm_Prenom']+" ["+acces['sm_Email']+"] ";
document.getElementById('cree_parForm').value = acces['cree_par_Nom']+" "+acces['cree_par_Prenom'];
document.getElementById('shipmemberForm').value = acces['Destinataire'];
document.getElementById('cree_parForm').value = acces['Cree_par_nom'];
document.getElementById('idForm').value = acces['ID'];
// Sélection du type actuel (comparaison en texte : la valeur d'une option est une chaîne, l'ID reçu un nombre) :
const selectElement = document.getElementById('type_profilForm');
for (let i = 0; i < selectElement.options.length; i++) {
if (selectElement.options[i].value === acces['ID_Type_acces_bateau_shipmember']) {
if (selectElement.options[i].value === String(acces['ID_Type_acces_bateau_shipmember'])) {
selectElement.options[i].selected = true;
break;
break;
}
}
document.getElementById('fin_validiteForm').value = acces['Fin_validite'].substring(0,10);
+11 -139
View File
@@ -1,139 +1,11 @@
<?php
session_start(); // Ouverture de session (avant tout autre envoi au client!!!)
require_once("../config/config.php");
Ouverture_bdd(); // Connexion à MySql
// A SUPPRIMER !!
//if (!isset($_SESSION['type_utilisateur'])) $_SESSION['type_utilisateur'] = TYPE_UTILISATEUR_PROFESSIONNEL; //TYPE_UTILISATEUR_INCONNU;
//--------------------------------------------------------------------------------------------------
// Init des variables de session générales :
if (!isset($_SESSION['acces_valide'])) $_SESSION['acces_valide'] = false;
if (!isset($_SESSION['display_menu'])) $_SESSION['display_menu'] = false;
if (!isset($_SESSION['langue'])) $_SESSION['langue'] = 'FR'; // Valeur par défaut
if (!isset($_SESSION['shipmember']['Cle_primaire'])) $_SESSION['shipmember']['Cle_primaire'] = 0;
if (!isset($_SESSION['shipmember']['Prenom'])) $_SESSION['shipmember']['Prenom'] = "";
if (!isset($_SESSION['shipmember']['Nom'])) $_SESSION['shipmember']['Nom'] = "";
if (!isset($_SESSION['shipmember']['Entreprise'])) $_SESSION['shipmember']['Entreprise'] = "";
if (!isset($_SESSION['shipmember']['Rue'])) $_SESSION['shipmember']['Rue'] = "";
if (!isset($_SESSION['shipmember']['Code_postal'])) $_SESSION['shipmember']['Code_postal'] = "";
if (!isset($_SESSION['shipmember']['Ville'])) $_SESSION['shipmember']['Ville'] = "";
if (!isset($_SESSION['shipmember']['ID_Pays'])) $_SESSION['shipmember']['ID_Pays'] = 75; // FR
if (!isset($_SESSION['shipmember']['Telephone'])) $_SESSION['shipmember']['Telephone'] = "";
if (!isset($_SESSION['shipmember']['Email'])) $_SESSION['shipmember']['Email'] = "";
if (!isset($_SESSION['shipmember']['Commentaires'])) $_SESSION['shipmember']['Commentaires'] = '';
if (!isset($_SESSION['shipmember']['Niveau_acces'])) $_SESSION['shipmember']['Niveau_acces'] = '';
if (!isset($_SESSION['droits_acces'])) $_SESSION['droits_acces'] = 0;
if (!isset($_SESSION['bateau_shipmember'])) $_SESSION['bateau_shipmember']['ID_Bateau'] = '';
if (!isset($_SESSION['bateau_shipmember'])) $_SESSION['bateau_shipmember']['Niveau_acces'] = '';
if (!isset($_SESSION['pdf']['src'])) $_SESSION['pdf']['src']['Niveau_acces'] = '';
if (!isset($_SESSION['modifier_texte'])) $_SESSION['modifier_texte'] = 0;
// if (!isset($_SESSION['shipmember']['code_acces'])) $_SESSION['shipmember']['code_acces'] = $_GET['code_acces'];
//--------------------------------------------------------------------------------------------------
// Recherche des paramètres de configuration générale pour mise à jour des variables de session associées :
$requete = 'SELECT Nom, Valeur FROM TB_Configuration';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse)) // boucle sur tous les enregistrements de la table
{
switch($donnees['Nom'])
{
case "Langue_par_defaut":
{
$_SESSION['langue'] = $donnees['Valeur'];
break;
}
default :
{
$_SESSION['Config__'.$donnees['Nom'].''] = $donnees['Valeur'];
break;
}
}
}
Liberation_jeu_de_resultat_bdd($reponse);
//--------------------------------------------------------------------------------------------------
// Mise à jour des ID de langue en fonction du prefixe (évite un accès à quasiment chaque requête) :
$requete = 'SELECT ID, Prefix FROM TB_Langues';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$_SESSION['id_langue'][''.$donnees['Prefix'].''] = $donnees['ID'];
}
Liberation_jeu_de_resultat_bdd($reponse);
Fermeture_bdd(); // Déconnexion de MySQL
//--------------------------------------------------------------------------------------------------
// Recherche des textes à utiliser sur les différentes pages et dans la langue en cours
// Attention : doit être rechargé à chaque fois qu'un texte est modifié dans la base
// Attention 2 : doit être rechargé à chaque fois qu'on change de langue
chargement_langue();
//--------------------------------------------------------------------------------------------------
// Affichage des informations système dans le cas d'une demande VERBOSE :
if ((!PRODUCTION) AND (isset($_GET['verbose'])))
{
Entete_page_html();
echo '<div id="Index">';
echo '<table>
<thead>
<tr>
<th>Nom de la variable</th>
<th>Valeur</th>
</tr>
</thead>
<tbody>';
// Affichage des variables de session :
echo '<tr style="line-height:40px;"><td colspan=2><strong>Variables de session</strong></tr>';
foreach ($_SESSION as $k=>$v)
{
if ($k == "db") continue; // Car la valeur stockée est un objet de type "db" qui plante l'affichage....
echo '<tr>
<td>'.$k.'</td>
<td>'.htmlspecialchars(is_array($v) ? json_encode($v) : $v).'</td>
</tr>';
}
// Affichage des variables du serveur :
echo '<tr style="line-height:40px;"><td colspan=2><strong>Variables du serveur</strong></tr>';
foreach ($_SERVER as $k=>$v)
{
echo '<tr>
<td>'.$k.'</td>
<td>'.htmlspecialchars(is_array($v) ? json_encode($v) : $v).'</td>
</tr>';
}
echo '</tbody>
</table>';
echo '<div class="boutons_selection">
<a title="Accéder au logiciel..." href="shipmembers.php">Continuer</a>
<a title="Remettre à zéro toutes les variables de session..." href="shipmembers.php?action=deconnexion">Déconnexion</a>
</div>';
echo '</div>';
echo '</body>';
echo '</html>';
}
else header('Refresh: 0; URL=shipmembers.php'); // Une fois que les variables de version sont chargées
// else header('Refresh: 0; URL=accueil.php'); // Une fois que les variables de version sont chargées
<?php
//************************************************************************************************************
// index.php - Point d'entrée du site. L'initialisation de la session, auparavant faite ici, est désormais assurée
// par Init_session() pour TOUTE page (une page ouverte directement fonctionne aussi - synthèse §47).
//************************************************************************************************************
require_once("../config/config.php");
Init_session(basename($_SERVER['SCRIPT_NAME']));
header('Location: shipmembers.php');
exit();
+1646 -1698
View File
File diff suppressed because it is too large Load Diff