diff --git a/config/fonctions.php b/config/fonctions.php index 1b4e8f4..0799f9c 100644 --- a/config/fonctions.php +++ b/config/fonctions.php @@ -1,12 +1,13 @@ = NOW()"; + $reponse = Requete_preparee_bdd($requete, array(array('i', $id_shipmember)), __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC)) $acces[] = $donnees; + Liberation_jeu_de_resultat_bdd($reponse); + return $acces; +} + + +//************************************************************************************************************ +// Fonction : Indique si le compte d'un ShipMember est activé, c'est-à-dire si son titulaire a prouvé qu'il +// contrôle l'adresse e-mail (connexion avec le mot de passe provisoire reçu, puis choix d'un mot de +// passe : la ligne TB_Activation est alors supprimée). +// Reçoit : La clé primaire du ShipMember +// Retour : true si activé +//************************************************************************************************************ +function Compte_est_active($id_shipmember) +{ + $reponse = Requete_preparee_bdd("SELECT COUNT(*) AS nb FROM TB_Activation WHERE ID_SHIPMEMBERS=?", + array(array('i', $id_shipmember)), __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC); + Liberation_jeu_de_resultat_bdd($reponse); + return ($donnees['nb'] == 0); +} + + +//************************************************************************************************************ +// Fonction : Normalise un code d'invitation saisi ou reçu (majuscules, espaces et tirets retirés, puis tiret +// remis au milieu) et vérifie son format. +// Reçoit : La valeur brute (GET, POST, saisie manuelle...) +// Retour : Le code normalisé (ex : "K7QX-M3PW"), ou false si le format est invalide +//************************************************************************************************************ +function Normaliser_code_invitation($valeur) +{ + if (!is_string($valeur)) return false; // écarte ?code_acces[]=... (tableau) + $brut = strtoupper(preg_replace('/[\s-]/', '', $valeur)); + $moitie = intdiv(CODE_INVITATION_LONGUEUR, 2); + if (preg_match('/^['.CODE_INVITATION_ALPHABET.']{'.CODE_INVITATION_LONGUEUR.'}\z/', $brut) !== 1) return false; + return substr($brut, 0, $moitie).'-'.substr($brut, $moitie); +} + + +//************************************************************************************************************ +// Fonction : Génère un code d'invitation unique (générateur aléatoire cryptographique random_int). +// Reçoit : Rien +// Retour : Le code (ex : "K7QX-M3PW") +//************************************************************************************************************ +function Generer_code_invitation() +{ + $max = strlen(CODE_INVITATION_ALPHABET) - 1; + do + { + $brut = ""; + for ($i = 0; $i < CODE_INVITATION_LONGUEUR; $i++) $brut .= CODE_INVITATION_ALPHABET[random_int(0, $max)]; + $code = Normaliser_code_invitation($brut); + + $reponse = Requete_preparee_bdd("SELECT COUNT(*) AS nb FROM TB_Lien_bateau_shipmember WHERE Code=?", + array(array('s', $code)), __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC); + Liberation_jeu_de_resultat_bdd($reponse); + } + while ($donnees['nb'] != 0); + return $code; +} + + +//************************************************************************************************************ +// Fonction : Crée une invitation nominative (statut 'en_attente'). +// Reçoit : Le bateau, l'adresse e-mail du destinataire (obligatoire), son prénom et son nom (facultatifs, pour +// l'affichage), le type d'accès, la fin de l'accès accordé (format 'Y-m-d', vide = sans limite) et le +// ShipMember qui invite. +// Retour : ['ok'=>true, 'id'=>int, 'code'=>string] ou ['ok'=>false, 'raison'=>string] +// NB : les droits de celui qui invite sont vérifiés par la page appelante. +//************************************************************************************************************ +function Creer_invitation($id_bateau, $email, $prenom, $nom, $id_type_acces, $fin_acces, $id_cree_par) +{ + $email = strtolower(trim((string)$email)); + if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) return ['ok' => false, 'raison' => t("Adresse e-mail invalide.")]; + + $prenom = trim((string)$prenom); + $nom = trim((string)$nom); + $prenom = ($prenom === '') ? null : mb_substr($prenom, 0, 50); + $nom = ($nom === '') ? null : mb_substr($nom, 0, 50); + + // Type d'accès : doit exister et être valide (l'ancien type "Administrateur" est dévalidé) : + $reponse = Requete_preparee_bdd("SELECT COUNT(*) AS nb FROM TB_Types_acces_bateau_shipmember WHERE Cle_primaire=? AND Validite=1", + array(array('i', $id_type_acces)), __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC); + Liberation_jeu_de_resultat_bdd($reponse); + if ($donnees['nb'] == 0) return ['ok' => false, 'raison' => t("Type d'accès invalide.")]; + + // Fin de l'accès accordé : date du jour en fin de journée, ou sans limite : + if ($fin_acces === null || trim($fin_acces) === '') $fin_validite = '9999-12-31 23:59:59'; + else + { + $date = date_create_from_format('Y-m-d', trim($fin_acces)); + if ($date === false) return ['ok' => false, 'raison' => t("Date de fin d'accès invalide.")]; + $fin_validite = $date->format('Y-m-d').' 23:59:59'; + } + + $duree = isset($_SESSION['Config__Duree_validite_invitation']) ? (int)$_SESSION['Config__Duree_validite_invitation'] : DUREE_VALIDITE_INVITATION_DEFAUT; + if ($duree <= 0) $duree = DUREE_VALIDITE_INVITATION_DEFAUT; + + $code = Generer_code_invitation(); + $requete = "INSERT INTO TB_Lien_bateau_shipmember + (Statut, ID_Shipmember, ID_Bateau, Email_invite, Prenom_invite, Nom_invite, Code, Expiration_invitation, + Fin_validite, Cree_par, ID_Type_acces_bateau_shipmember) + VALUES ('en_attente', 0, ?, ?, ?, ?, ?, DATE_ADD(NOW(), INTERVAL ? DAY), ?, ?, ?)"; + Requete_preparee_bdd($requete, array( + array('i', $id_bateau), array('s', $email), array('s', $prenom), array('s', $nom), + array('s', $code), array('i', $duree), array('s', $fin_validite), + array('i', $id_cree_par), array('i', $id_type_acces)), + __FILE__, __LINE__); + return ['ok' => true, 'id' => Recuperation_id_cree_bdd(), 'code' => $code]; +} + + +//************************************************************************************************************ +// Fonction : Informations sur une invitation à partir de son code (bandeau d'accueil d'un lien d'invitation). +// Reçoit : Le code (brut ou normalisé) +// Retour : Un tableau (ID, Statut, Email_invite, Prenom_invite, Nom_invite, Nom_bateau, Type_acces, +// Expiree [0/1]) ou null si le code est inconnu ou mal formé +//************************************************************************************************************ +function Invitation_par_code($code) +{ + $code = Normaliser_code_invitation($code); + if ($code === false) return null; + + $colonne_type = (isset($_SESSION['langue']) && $_SESSION['langue'] == 'EN') ? 'Nom_en' : 'Nom_fr'; + $requete = "SELECT L.ID, L.Statut, L.Email_invite, L.Prenom_invite, L.Nom_invite, B.Nom AS Nom_bateau, + T.".$colonne_type." AS Type_acces, + (L.Expiration_invitation IS NOT NULL AND L.Expiration_invitation <= NOW()) AS Expiree + FROM TB_Lien_bateau_shipmember L + JOIN TB_Bateaux B ON B.Cle_primaire = L.ID_Bateau + LEFT JOIN TB_Types_acces_bateau_shipmember T ON T.Cle_primaire = L.ID_Type_acces_bateau_shipmember + WHERE L.Code=?"; + $reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC); + Liberation_jeu_de_resultat_bdd($reponse); + return $donnees ?: null; +} + + +//************************************************************************************************************ +// Fonction : Invitations en attente (non expirées) adressées à une adresse e-mail. +// Reçoit : L'adresse e-mail du ShipMember connecté +// Retour : Un tableau de lignes (ID, Nom_bateau, Type_acces, Expiration_invitation, Prenom_invitant, Nom_invitant) +//************************************************************************************************************ +function Invitations_en_attente($email) +{ + $invitations = []; + $colonne_type = (isset($_SESSION['langue']) && $_SESSION['langue'] == 'EN') ? 'Nom_en' : 'Nom_fr'; + $requete = "SELECT L.ID, B.Nom AS Nom_bateau, T.".$colonne_type." AS Type_acces, L.Expiration_invitation, + S.Prenom AS Prenom_invitant, S.Nom AS Nom_invitant + FROM TB_Lien_bateau_shipmember L + JOIN TB_Bateaux B ON B.Cle_primaire = L.ID_Bateau + LEFT JOIN TB_Types_acces_bateau_shipmember T ON T.Cle_primaire = L.ID_Type_acces_bateau_shipmember + LEFT JOIN TB_Shipmembers S ON S.ID = L.Cree_par + WHERE L.Statut='en_attente' AND L.Email_invite=? + AND (L.Expiration_invitation IS NULL OR L.Expiration_invitation > NOW()) + ORDER BY L.Date_creation"; + $reponse = Requete_preparee_bdd($requete, array(array('s', strtolower(trim((string)$email)))), __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC)) $invitations[] = $donnees; + Liberation_jeu_de_resultat_bdd($reponse); + return $invitations; +} + + +//************************************************************************************************************ +// Fonction : Accepte une invitation pour le ShipMember connecté. +// Toutes les conditions (en attente, adresse identique, non expirée) sont vérifiées DANS la requête de +// mise à jour elle-même : une invitation ne peut donc être acceptée qu'une fois, même par deux +// requêtes simultanées. +// Reçoit : L'ID de l'invitation, la clé primaire et l'adresse e-mail du ShipMember connecté +// Retour : ['ok'=>true] ou ['ok'=>false, 'raison'=>string] +//************************************************************************************************************ +function Accepter_invitation($id_lien, $id_shipmember, $email) +{ + if (!Compte_est_active($id_shipmember)) + { + return ['ok' => false, 'raison' => t("Votre compte doit être activé (mot de passe provisoire reçu par e-mail) avant de pouvoir accepter une invitation.")]; + } + $requete = "UPDATE TB_Lien_bateau_shipmember + SET Statut='actif', ID_Shipmember=?, Date_activation=NOW() + WHERE ID=? AND Statut='en_attente' AND Email_invite=? + AND (Expiration_invitation IS NULL OR Expiration_invitation > NOW())"; + Requete_preparee_bdd($requete, array( + array('i', $id_shipmember), array('i', $id_lien), array('s', strtolower(trim((string)$email)))), + __FILE__, __LINE__); + if (Nb_lignes_modifiees() == 1) return ['ok' => true]; + return ['ok' => false, 'raison' => t("Cette invitation n'est plus valable (déjà utilisée, expirée, révoquée, ou adressée à une autre adresse).")]; +} + + +//************************************************************************************************************ +// Fonction : Refuse une invitation (elle passe à 'revoque'). +// Reçoit : L'ID de l'invitation et l'adresse e-mail du ShipMember connecté +// Retour : true si l'invitation a bien été refusée +//************************************************************************************************************ +function Refuser_invitation($id_lien, $email) +{ + $requete = "UPDATE TB_Lien_bateau_shipmember SET Statut='revoque' + WHERE ID=? AND Statut='en_attente' AND Email_invite=?"; + Requete_preparee_bdd($requete, array(array('i', $id_lien), array('s', strtolower(trim((string)$email)))), __FILE__, __LINE__); + return (Nb_lignes_modifiees() == 1); +} + + +//************************************************************************************************************ +// Fonction : Masque partiellement une adresse e-mail pour l'afficher à quelqu'un qui n'est pas encore connecté +// (ex : "pierre.durand@exemple.fr" -> "p•••@exemple.fr"). +// Reçoit : L'adresse +// Retour : L'adresse masquée +//************************************************************************************************************ +function Masquer_email($email) +{ + $position = strpos((string)$email, '@'); + if ($position === false || $position == 0) return "•••"; + return mb_substr($email, 0, 1).'•••'.substr($email, $position); +} + + +//************************************************************************************************************ +// Clé du type d'accès "Propriétaire" dans TB_Types_acces_bateau_shipmember (cf Devalidation_profils = 1 : tous +// les types SAUF Propriétaire). +//************************************************************************************************************ +const TYPE_ACCES_PROPRIETAIRE = 2; + + +//************************************************************************************************************ +// Fonction : Charge un accès (ou une invitation) À CONDITION qu'il appartienne au bateau indiqué - toute action +// sur un accès passe par là, pour qu'un identifiant envoyé par le navigateur ne puisse jamais viser +// l'accès d'un autre bateau. +// Reçoit : L'ID de l'accès et la clé primaire du bateau affiché +// Retour : La ligne (ID, Statut, Code, ID_Type_acces_bateau_shipmember, Expiration_invitation) ou null +//************************************************************************************************************ +function Lien_du_bateau($id_lien, $id_bateau) +{ + $requete = "SELECT ID, Statut, Code, ID_Type_acces_bateau_shipmember, Expiration_invitation + FROM TB_Lien_bateau_shipmember WHERE ID=? AND ID_Bateau=?"; + $reponse = Requete_preparee_bdd($requete, array(array('i', $id_lien), array('i', $id_bateau)), __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse, MYSQLI_ASSOC); + Liberation_jeu_de_resultat_bdd($reponse); + return $donnees ?: null; +} + + +//************************************************************************************************************ +// Fonction : Indique si l'utilisateur peut suspendre, réactiver ou révoquer un accès d'un type donné. +// Administrateur : toujours. Devalidation_profils = 2 : tous les types. = 1 : tous sauf Propriétaire. +// Reçoit : Les droits de l'utilisateur sur le bateau ($acces_profil), s'il est administrateur, le type visé +// Retour : true si autorisé +//************************************************************************************************************ +function Peut_devalider_acces($acces_profil, $est_administrateur, $id_type_cible) +{ + if ($est_administrateur) return true; + $niveau = isset($acces_profil['Devalidation_profils']) ? (int)$acces_profil['Devalidation_profils'] : 0; + if ($niveau >= 2) return true; + if ($niveau == 1) return ((int)$id_type_cible != TYPE_ACCES_PROPRIETAIRE); + return false; +} + + +//************************************************************************************************************ +// Fonction : Met à jour en session la liste des accès actifs du ShipMember connecté ($_SESSION['bateau_shipmember'] +// et $_SESSION['acces']), à partir de la base - la liste est REMPLACÉE (l'ancien code y ajoutait des +// lignes sans la vider : des accès révoqués pouvaient y rester jusqu'à la déconnexion). +// Reçoit : La clé primaire du ShipMember +// Retour : Rien +//************************************************************************************************************ +function Rafraichir_acces_session($id_shipmember) +{ + $_SESSION['bateau_shipmember'] = Acces_actifs_shipmember($id_shipmember); + $_SESSION['acces'] = count($_SESSION['bateau_shipmember']); +} diff --git a/config/fonctions_html.php b/config/fonctions_html.php index e64c9e6..4ab62cf 100644 --- a/config/fonctions_html.php +++ b/config/fonctions_html.php @@ -1,344 +1,396 @@ - 3600, - 'path' => '/', - 'secure' => true, - 'httponly' => true, - 'samesite' => 'Lax', - ]); - - session_start(); // Ouverture de session (avant tout autre envoi au client!!!) - -} - - -//************************************************************************************************************ -// 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'])); - - // Entête HTML : - echo ''; - - echo ''; - - echo ''; - echo ''; - echo 'ShipHeart - Simplicity is true luxury'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - - echo ""; - echo ""; - echo ""; - - echo ""; - echo ""; - - // 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. - echo ''; // CSS pour les petits écrans (doit être placé à la fin car il override les CSS globaux) - - // Chargement de srcipts JS généraux : - echo ''; // Pour Google Charts (graphiques) - 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 '
'; - - //---------------------------------- - // Bandeau gauche : - echo '
- - -
-
-
- -
'; - -// echo ' '; -// echo ''; - - - //-------------------------------------------------------------------------------------------- - // Menu afficher / masquer -- Mobile - //-------------------------------------------------------------------------------------------- - echo ''; - - - //-------------------------------------------------------------------------------------------- - // 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 ''; - - echo '
'; - echo '
'; - - - -//================================================================================== -// Script JS pour pieds de page : -?>'; - -echo ''; - -} // Fin de la fonction Pied_de_page() - - - + 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 ''; + + + echo ""; + echo ""; + echo ""; + + echo ""; + echo ""; + + // 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. + echo ''; // CSS pour les petits écrans (doit être placé à la fin car il override les CSS globaux) + + // Chargement de srcipts JS généraux : + echo ''; // Pour Google Charts (graphiques) + 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 '
'; + + //---------------------------------- + // Bandeau gauche : + echo ''; + +// echo ' '; +// echo ''; + + + //-------------------------------------------------------------------------------------------- + // Menu afficher / masquer -- Mobile + //-------------------------------------------------------------------------------------------- + echo ''; + + + //-------------------------------------------------------------------------------------------- + // 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 ''; + + echo '
'; + echo '
'; + + + +//================================================================================== +// Script JS pour pieds de page : +?>'; + +echo ''; + +} // Fin de la fonction Pied_de_page() + + + diff --git a/config/fonctions_pdf.php b/config/fonctions_pdf.php index 9ffa7b0..254b9b3 100644 --- a/config/fonctions_pdf.php +++ b/config/fonctions_pdf.php @@ -251,92 +251,9 @@ class MYPDF2 extends TCPDF { //******************************************************************************************************************************** -// Fonction : Génère le document PDF à partir des données reçues en paramètres -// Reçoit : type du document (1er code généré pour le bateau, code généré par un autre utilisateur) -// client concerné a qui on envoie le pdf et le code d'accès pour générer le code QR. -// Retour : 0 si Ok, -1 si erreur -//******************************************************************************************************************************** -function code_acces_pdf($code, $no, $no_serie = "XX:XX:XX:XX:XX:XX", $client = "") -{ - $nom_piece = $no."_Code_acces_bateau_".$no_serie; - - - - $pdf = new MYPDF2('LANDSCAPE', 'px', 'A4', true, 'UTF-8', false); - - // set document (meta) information : - $pdf->SetCreator(PDF_CREATOR); - $pdf->SetAuthor('Koriolan'); - $pdf->SetTitle($nom_piece); - $pdf->SetSubject('ShipHeart'); - $pdf->SetKeywords('ShipHeart by Koriolan'); - - $pdf->SetTextColor(0, 69, 99); - $pdf->SetFont('helvetica', '', 10); - - $pdf->AddPage(); - $pdf->SetDrawColor(217,217,217); - $pdf->Line(421, 0, 421, 595); - - // First page - $pdf->Image('images/logo_shipheart.png', 506, 214, 252, 167, 'PNG', 'https://shipheart.tech'); - - // Firth page - $pdf->Image('images/logo_shipheart.png', 12, 12, 64, 45, 'PNG', 'https://shipheart.tech'); - - $pdf->CreateTextBox("Nous vous remercions pour votre confiance et sommes ravis de vous offrir un accès complet aux informations de votre bateau via notre platforme Ship2net. - - We thank you for your trust and are delighted to offer you full access to your boat information via our Ship2net platform.", 52, 166, 317, 195, 12); - - $pdf->CreateTextBox($no_serie, 0, 520, 421, 46, 12, '', 'C', 0); - - // $pdf->AddPage(); - $pdf->SetDrawColor(217,217,217); - $pdf->Line(421, 0, 421, 595); - - // Second page - $pdf->Image('images/logo_shipheart.png', 12, 12, 64, 45, 'PNG', 'https://shipheart.tech'); - - $pdf->Image('images/logo_shipheart.png', 766, 12, 64, 45, 'PNG', 'https://shipheart.tech'); - - $pdf->CreateTextBox("Pour activer votre accès au bateau merci de scanner le QR code ci-joint et de vous connecter à votre profil ShipMember existant ou d'en créer un. - - To activate your boat access please scan the attached QR code and log in to your existing ShipMember profile or create one.", 52, 218, 317, 160, 12); - - // Third page - $pdf->Image(generateCode($code), 546, 216, 164, 164, 'PNG', Url_activation_code_acces($code)); - - - // --------------------------------------------------------- - // Fermeture de l'objet PDF et enreigistrement du fichier : - ob_clean(); // Semble nécessaire ; sinon erreur du 'output' suivant - $pdf_string = $pdf->Output('pseudo.pdf', 'S'); // export du flux dans une chaine (le nom du fichier est ignoré...) - - // Copie de cette chaine dans le fichier final (cette solution en 2 temps permet d'éviter de devoir utiliser un nom de fichier absolu (semble obligatoire avec Output et l'option 'F') - file_put_contents('temp/PDF/'.$nom_piece.'.pdf', $pdf_string); - - $_SESSION['pdf']['src'] = 'temp/PDF/'.$nom_piece.'.pdf'; - - // Sauvegarder le pdf automatiquement - header("Cache-Control: public"); - header("Content-Description: File Transfer"); - header("Content-Disposition: attachment; filename=".$nom_piece.".pdf"); - header("Content-Type: application/zip"); - header("Content-Transfer-Encoding: binary"); - - // Read the file - readfile($_SESSION['pdf']['src']); - - // Suppression du pdf et codeqr du serveur - unlink('temp/CodeQR/'.$code.'.png'); - unlink($_SESSION['pdf']['src']); - return(0); -} - -//******************************************************************************************************************************** -// Fonction : URL d'activation d'un code d'accès bateau, portée par le QR code ET par le lien cliquable du PDF d'invitation. +// Fonction : URL d'activation d'un code d'invitation, portée par le QR code ET par le lien cliquable du PDF d'invitation. // Construite à partir de URL_SITE (definitions.php) : plus d'adresse écrite en dur (synthèse §47). -// Reçoit : le code d'accès +// Reçoit : le code d'invitation // Retour : l'URL complète //******************************************************************************************************************************** function Url_activation_code_acces($code) @@ -344,21 +261,96 @@ function Url_activation_code_acces($code) return 'https://'.URL_SITE.'/shipmembers.php?code_acces='.urlencode($code); } -function generateCode($code){ - $tempDir = "temp/CodeQR/"; - - $codeContents = Url_activation_code_acces($code); - $fileName = $code.'.png'; - - $pngAbsoluteFilePath = $tempDir.$fileName; - $urlRelativeFilePath = $tempDir.$fileName; - - // generating - if (!file_exists($pngAbsoluteFilePath)) { - QRcode::png($codeContents, $pngAbsoluteFilePath); - } - return $urlRelativeFilePath; +//******************************************************************************************************************************** +// Fonction : Image PNG d'un QR code, produite EN MÉMOIRE (aucun fichier temporaire : l'ancienne version écrivait le QR code +// et le PDF dans html/temp/, donc dans la partie publique du site - synthèse §47). +// Reçoit : le texte à encoder +// Retour : le contenu binaire de l'image PNG +//******************************************************************************************************************************** +function Qr_code_png($texte) +{ + ob_start(); + QRcode::png($texte, false, QR_ECLEVEL_M, 8, 2); // false = sortie standard, capturée par le tampon + $png = ob_get_clean(); + header_remove('Content-Type'); // phpqrcode a posé un en-tête image/png : retiré, le PDF posera le sien + return $png; } +//******************************************************************************************************************************** +// Fonction : Génère et ENVOIE au navigateur le PDF d'une invitation nominative à accéder à un bateau (synthèse §47). +// La page appelante doit s'arrêter juste après (exit) : rien ne doit suivre le PDF. +// Reçoit : l'invitation (tableau) : Code, Nom_bateau, Email_invite, Prenom_invite, Nom_invite, Type_acces, +// Expiration_invitation +// Retour : rien (le PDF est envoyé en téléchargement) +//******************************************************************************************************************************** +function code_acces_pdf($invitation) +{ + $code = $invitation['Code']; + $nom_bateau = $invitation['Nom_bateau']; + $email = $invitation['Email_invite']; + $destinataire = trim(($invitation['Prenom_invite'] ?? '').' '.($invitation['Nom_invite'] ?? '')); + $type_acces = $invitation['Type_acces'] ?? ''; + $expiration = ($invitation['Expiration_invitation'] != NULL) ? date_format(date_create($invitation['Expiration_invitation']), 'd/m/Y') : ''; + $nom_fichier = 'Invitation_'.preg_replace('/[^A-Za-z0-9_-]/', '_', $nom_bateau).'_'.$code.'.pdf'; + + $pdf = new MYPDF2('LANDSCAPE', 'px', 'A4', true, 'UTF-8', false); + + // set document (meta) information : + $pdf->SetCreator(PDF_CREATOR); + $pdf->SetAuthor('Koriolan'); + $pdf->SetTitle('Invitation - '.$nom_bateau); + $pdf->SetSubject('ShipHeart'); + $pdf->SetKeywords('ShipHeart by Koriolan'); + + $pdf->SetTextColor(0, 69, 99); + $pdf->SetFont('helvetica', '', 10); + $pdf->SetAutoPageBreak(false); // Mise en page fixe sur 2 feuilles : pas de saut de page automatique (l'ancienne version + // obtenait sa 2e feuille par un saut automatique, déclenché par le texte du bas de la 1re) + + //--------------------------------------------------------- + // Feuille 1 (pliée en deux : à droite la couverture, à gauche le mot d'accueil) : + $pdf->AddPage(); + $pdf->SetDrawColor(217,217,217); + $pdf->Line(421, 0, 421, 595); + + $pdf->Image('images/logo_shipheart.png', 506, 214, 252, 167, 'PNG', 'https://shipheart.tech'); // Couverture + $pdf->Image('images/logo_shipheart.png', 12, 12, 64, 45, 'PNG', 'https://shipheart.tech'); + + $salutation = ($destinataire != '') ? $destinataire.",\n\n" : ''; + $pdf->CreateTextBox($salutation."Nous vous remercions pour votre confiance et sommes ravis de vous offrir un accès aux informations du bateau ".$nom_bateau." via notre plateforme Ship2net.\n\n" + ."We thank you for your trust and are delighted to offer you access to the information of the boat ".$nom_bateau." via our Ship2net platform.", + 52, 150, 317, 230, 12, '', 'L'); + + $pdf->CreateTextBox($nom_bateau.(($type_acces != '') ? ' - '.$type_acces : ''), 0, 520, 421, 46, 12, 'B', 'C'); + + //--------------------------------------------------------- + // Feuille 2 (à gauche le mode d'emploi, à droite le QR code et le code) : + $pdf->AddPage(); + $pdf->SetDrawColor(217,217,217); + $pdf->Line(421, 0, 421, 595); + $pdf->Image('images/logo_shipheart.png', 12, 12, 64, 45, 'PNG', 'https://shipheart.tech'); + $pdf->Image('images/logo_shipheart.png', 766, 12, 64, 45, 'PNG', 'https://shipheart.tech'); + + $pdf->CreateTextBox("Cette invitation est réservée à l'adresse ".$email.".\n" + ."Pour l'activer, scannez le QR code ci-contre, puis connectez-vous à votre compte ShipMember avec cette adresse (ou créez votre compte avec cette adresse).\n" + ."Sans appareil photo : rendez-vous sur ".URL_SITE." et connectez-vous avec cette adresse ; l'invitation apparaîtra dans « Mes invitations ».\n" + .(($expiration != '') ? "Invitation valable jusqu'au ".$expiration.".\n" : '') + ."\n" + ."This invitation is reserved for the address ".$email.".\n" + ."To activate it, scan the QR code opposite, then log in to your ShipMember account with this address (or create your account with this address).\n" + ."Without a camera: go to ".URL_SITE." and log in with this address; the invitation will appear in \"My invitations\".\n" + .(($expiration != '') ? "Invitation valid until ".$expiration."." : ''), + 52, 110, 317, 400, 11, '', 'L'); + + $pdf->Image('@'.Qr_code_png(Url_activation_code_acces($code)), 546, 196, 164, 164, 'PNG', Url_activation_code_acces($code)); + $pdf->CreateTextBox($code, 506, 372, 244, 30, 18, 'B', 'C'); + $pdf->CreateTextBox(URL_SITE, 506, 400, 244, 20, 11, '', 'C'); + + //--------------------------------------------------------- + // Envoi direct au navigateur, sans fichier intermédiaire. Tout ce qui aurait déjà été mis en tampon (espaces, + // avertissements...) est jeté : un seul octet parasite avant le PDF le corromprait. + while (ob_get_level() > 0) ob_end_clean(); + $pdf->Output($nom_fichier, 'D'); +} diff --git a/html/administration.php b/html/administration.php index 8c9e0f4..8613b10 100644 --- a/html/administration.php +++ b/html/administration.php @@ -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; diff --git a/html/bateaux.php b/html/bateaux.php index eafd6ad..4252383 100644 --- a/html/bateaux.php +++ b/html/bateaux.php @@ -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'].'
'; - $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'].'
'; - $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' ici "; - // $_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 '
'; - echo '
-
'; - echo ' '; - echo ' '; - echo ' '; - echo '
-
'; - echo '
'; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - if ($utilisateur_acces_nb == 0) echo ''; - 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 ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - if ($acces_profil['Modification_acces'] == 1){ - echo ' '; - } - echo ' '; - echo ' '; + echo '
'; + + //-------------------------------------------- + // Formulaire d'invitation nominative (synthèse §47) : + if ($peut_inviter) + { + echo '
'; + echo '
'; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo '
'; + } + + //-------------------------------------------- + // Liste des accès et des invitations en attente : + echo '
'; + echo '
'.t("Validite").' '.t("Shipmember").' '.t("Créé_par").' '.t("Type de profil").' '.t("Fin de validité").'
0 shipmember / acces
'.$utilisateur_acces[$i]['sm_Prenom'].' '.$utilisateur_acces[$i]['sm_Nom'].' ['.$utilisateur_acces[$i]['sm_Email'].'] '.$utilisateur_acces[$i]['cree_par_Prenom'].' '.$utilisateur_acces[$i]['cree_par_Nom'].''.$utilisateur_acces[$i]['Niveau_acces_nom'].' '; - 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 '
'; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + if ($utilisateur_acces_nb == 0) echo ''; + 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 ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; } - echo '
'.$h(t("Statut")).''.$h(t("Shipmember")).''.$h(t("Créé_par")).''.$h(t("Type de profil")).''.$h(t("Fin de validité")).'
'.$h(t("Aucun accès ni invitation en cours.")).'
'.$h($statut).''.$h($acces['Destinataire']).''.$h($acces['Cree_par_nom']).''.$h($acces['Niveau_acces_nom']).''.((substr($acces['Fin_validite'], 0, 10) == "9999-12-31") ? $h(t("Aucune")) : $h(date_format(date_create($acces['Fin_validite']), 'd/m/Y'))).''; + if (count($actions) > 0) + { + echo '
'; + echo ''; + foreach ($actions as $code_action => $libelle) + { + echo ' '; + } + echo '
'; + } + if ($acces_profil['Modification_acces'] == 1) + { + echo ''; + } + echo '
'; - echo '
'; - + echo ' '; echo '
'; - echo ''; - + echo '
'; // 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 ''; + } 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); diff --git a/html/index.php b/html/index.php index 598394b..34f35f8 100644 --- a/html/index.php +++ b/html/index.php @@ -1,139 +1,11 @@ -'; - echo ' - - - - - - - - - '; - - // Affichage des variables de session : - echo ''; - 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 ' - - - '; - } - - // Affichage des variables du serveur : - echo ''; - foreach ($_SERVER as $k=>$v) - { - echo ' - - - '; - } - - echo ' -
Nom de la variableValeur
Variables de session
'.$k.''.htmlspecialchars(is_array($v) ? json_encode($v) : $v).'
Variables du serveur
'.$k.''.htmlspecialchars(is_array($v) ? json_encode($v) : $v).'
'; - - echo '
- Continuer - Déconnexion -
'; - echo '
'; - echo ''; - echo ''; - } - 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 - +Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse.
Sinon, merci de choisir une autre adresse."); - } - } - Liberation_jeu_de_resultat_bdd($reponse); - } - - if ($message_erreur == "") // Si les contrôles ne sont pas invalides, on créé le nouvel utilisateur : - { - // Génération d'un MDP aléatoire : - $password = Mdp_aleatoire(6); // Si l'adresse email est vide, il est inutile de préparer un mdp... - - - // Création du ShipMember : - $requete = 'INSERT INTO TB_Shipmembers(Nom, Prenom, Entreprise, Rue, Code_postal, Ville, ID_PAYS, Telephone, Email, ID_LANGUAGES, Mdp, Date_creation_compte) VALUES (?,?,?,?,?,?,?,?,?,(SELECT ID FROM TB_Langues WHERE Prefix=?),?,?,?)'; - Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['shipmember']['Nom']), - array('s', $_SESSION['shipmember']['Prenom']), - array('s', $_SESSION['shipmember']['Entreprise']), - array('s', $_SESSION['shipmember']['Rue']), - array('s', $_SESSION['shipmember']['Code_postal']), - array('s', $_SESSION['shipmember']['Ville']), - array('i', $_SESSION['shipmember']['ID_Pays']), - array('s', $_SESSION['shipmember']['Telephone']), - array('s', $_SESSION['shipmember']['Email']), - array('s', $_SESSION['langue']), - array('s', ""), - array('s', password_hash($password, PASSWORD_DEFAULT)), - array('s', date("Y-m-d H:i:s"))), - __FILE__, __LINE__); - - $_SESSION['shipmember']['Cle_primaire'] = Recuperation_id_cree_bdd(); - - $requete = 'INSERT INTO TB_Activation(ID_SHIPMEMBERS, Date_creation_mdp) VALUES (?, ?)'; - Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['shipmember']['Cle_primaire']), - array('s', date("Y-m-d H:i:s"))), - __FILE__, __LINE__); - - // Mise à jour du libellé du pays : - $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['ID_Pays']), - array('s', $_SESSION['langue'])), - __FILE__, __LINE__); - $donnees = Recherche_ligne_bdd($reponse); - $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; - Liberation_jeu_de_resultat_bdd($reponse); - - // Calcul de la date limite d'activation du compte : - $date = date_create("now"); // Date courante - date_add($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante + Nb jour configurés - $date_maxi_activation = date_format($date, "d/m/Y à H:i"); - - //......................................................................... - // Préparation et envoi de l'email de confirmation de création de compte : - $texte_email = t("

Félicitations !

-

Votre compte ShipMember est créé, vous y êtes presque.

-

Nom : [[Prenom]] [[Nom]]

-

Email : [[Email]]

-

Mot de passe provisoire : [[Password]]

-

Plus qu’un clic : Connectez-vous sur [[Url_site]] pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.

-

Et ensuite, où que vous soyez et dès que votre ShipHeart est installé, accédez à votre bateau via votre accès privilégié ShipMember !

-

-

Bienvenue parmi nous !

-

L'équipage ShipHeart

-

-

(*) L'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.

"); - - // Mise à jour des parametres du texte : - $texte_email = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $texte_email); - $texte_email = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $texte_email); - $texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email); - $texte_email = str_replace("[[Password]]", $password, $texte_email); - $texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email); - $texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email); - - Envoi_email('', $_SESSION['shipmember']['Email'], - t("Votre accès ShipMember - Un dernier clic pour accéder à votre bateau !"), - $texte_email, - "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); - //Fin......................................................................... - - //............................................................................ - // Message d'information : - $message = t("Un email vient d'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec un mot de passe provisoire."); - - $message = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $message); - $message = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $message); - $message = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $message); - - $message_information .= $message; - //Fin......................................................................... - - // 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); - Liberation_jeu_de_resultat_bdd($reponse); - if ($donnees == NULL) $message_erreur .= "Code invalide ou déjà utilisé \n"; - 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'] = ''; - } - - // 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; - } - Liberation_jeu_de_resultat_bdd($reponse); - $_SESSION['acces'] = $nb_acces; - $_SESSION['acces_valide'] = true; - $_SESSION['Shipmembers']['page'] = "Accueil"; - } - } - - - //--------------------------------------------------------------------------- - // Lecture de l'email et du mot de passe et filtrage contre les injections SQL : - if (isset($_POST['validation_login_shipmember']) AND isset($_POST['email_validation']) AND isset($_POST['mdp_validation'])) - { - // if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email_validation']) != 1) $message_information .= "Erreur de PERG MATCH
"; - - if (($_POST['email_validation'] != NULL) AND - ($_POST['mdp_validation'] != NULL) AND - (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email_validation']) == 1)) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... - { - $email = Protection_mysql(strtolower($_POST['email_validation'])); // On ajoute les caractères d'échappement sur l'email qui sera envoyé dans la requête - $mdp = $_POST['mdp_validation']; // Le MDP n'est pas envoyé... - - $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Email=? '; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $email)), - __FILE__, __LINE__); - - while ($donnees = Recherche_ligne_bdd($reponse)) - { - if (password_verify($mdp, $donnees['Mdp'])) - { - - $_SESSION['shipmember'] = $donnees; // Sauvegarde des informations du ShipMember - - if ($donnees['Compte_a_activer'] != 0) - { - $date = date_create("now"); // Date courante - date_sub($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante - Nb jour configurés - $date_creation = date_create_from_format('Y-m-d H:i:s', $donnees['Date_creation_mdp']); - - if ($date < $date_creation) // Si le Mdp provisoire est toujours valable : - { - $_SESSION['Shipmembers']['page'] = "Activation"; - } - else // Si le Mdp provisoireest expiré : - { - $message_erreur .= t("Désolé, votre compte n'a pas été activé dans le délai maximal.
Vous pouvez demander la génération d'un nouveau mot de passe provisoire en cliquant sur le bouton ci-dessous. Il vous sera adressé immédiatement par email."); - } - } - else - { - // Mémorisation dans l'historique de la connexion : - $requete = 'INSERT INTO TB_Historique(Type, Sous_type, ID_ELEMENT, Valeur, Description) VALUES (?, ?, ?, ?, ?)'; - Requete_preparee_bdd($requete, - array( - array('i', SYSTEME), - array('i', SYSTEME_CONNEXION_USER), - array('i', $_SESSION['shipmember']['Cle_primaire']), - array('i', 0), - array('s', 'Connexion de '.$donnees['Prenom'].' '.$donnees['Nom'].' [N° '.$_SESSION['shipmember']['Cle_primaire'].']')), - __FILE__, __LINE__); - - // Recherche des informations du ShipMember : - $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) $_SESSION['shipmember'] = $donnees; - Liberation_jeu_de_resultat_bdd($reponse); - - // Mise à jour du libellé du pays : - $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['ID_Pays']), - array('s', $_SESSION['langue'])), - __FILE__, __LINE__); - $donnees = Recherche_ligne_bdd($reponse); - $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; - Liberation_jeu_de_resultat_bdd($reponse); - - // Message de bienvenue : - $message_information .= t("Bienvenue !"); - - $_SESSION['acces_valide'] = true; - - // 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; - $_SESSION['Shipmembers']['page'] = "Accueil"; - } - - break; // Dans le cas où il y aurait plus d'une entrée avec le bon email ET le bon mdp, on ne traite que le premier... - } - // else $message_information .= "MDP ne matchent pas. "; - } - Liberation_jeu_de_resultat_bdd($reponse); - - } - // else $message_information .= "Email ou MDP non valides : [".$_POST['email_validation']."] et [".$_POST['mdp_validation']."]."; - else $message_erreur .= "Email ou MDP non valides"; - } - - - //--------------------------------------------------------------------------- - // Activation Shipmember : - if (isset($_POST['validation_activation_shipmember']) AND - isset($_POST['Mot_de_passe_1']) AND - isset($_POST['Mot_de_passe_2'])) - { - if (($_POST['Mot_de_passe_1'] == $_POST['Mot_de_passe_2']) AND (Check_mdp($_POST['Mot_de_passe_1']) == 1)) - { - $new_mdp = $_POST['Mot_de_passe_1']; - - // Recherche du MDP existant de l'adhérent : - $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) $shipmember = $donnees; - Liberation_jeu_de_resultat_bdd($reponse); - - // Vérification que le mot de passe est changé : -// if (Hash_Mdp($new_mdp) == $shipmember['Mdp']) $message_erreur .= nl2br(Recuperation_texte('all','all','erreurs','pwd_egal_temporaire')); - if (password_verify($new_mdp, $shipmember['Mdp'])) $message_erreur .= t("Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire."); - else - { - // Mise à jour du nouveau mot de passe : - $mdp_filtre = Protection_mysql($new_mdp); - $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; - Requete_preparee_bdd($requete, - array( - array('s', password_hash($mdp_filtre, PASSWORD_DEFAULT)), - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - - $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; - Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - - $_SESSION['acces_valide'] = true; - - // 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; - // $_SESSION['acces_valide'] = true; - $_SESSION['Shipmembers']['page'] = "Accueil"; - - - $_SESSION['Shipmembers']['page'] = "Accueil"; - $message_information .= t("Félicitations : votre compte est maintenant activé et vous êtes d'ores et déjà connecté.e.").' !'; - } - } - else - { - if ($_POST['Mot_de_passe_1'] != $_POST['Mot_de_passe_2']) $message_erreur .= t("Les deux mots de passe saisis doivent être identiques."); - else $message_erreur .= nl2br(t("Le mot de passe renseigné n'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.")); - } - } - - //--------------------------------------------------------------------------- - // Regenération du mot de passe : - if (isset($_POST['regenerer_mdp_shipmember']) AND isset($_POST['Email'])) - { - $_SESSION['shipmember']['Email'] = strtolower(trim($_POST['Email'])); - - // Vérifications : - if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_SESSION['shipmember']['Email']) != 1) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... - { - $message_erreur .= t("[Email] est invalide !"); - } - - // Vérification si l'email existe bien dans la base : - if ($message_erreur == "") - { - $nb_emails_valides = 0; - - $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Validite=1 AND Email=? '; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['shipmember']['Email'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - // Ces informations ne servent qu'à composer l'e-mail : NE PAS écrire - // $_SESSION['shipmember'], pour ne pas laisser en session l'identité d'un - // compte QUE L'ON N'A PAS ENCORE AUTHENTIFIÉ (n'importe qui peut demander la - // réinitialisation du mot de passe d'une adresse qui n'est pas la sienne). - $cle_primaire_demande = $donnees['Cle_primaire']; - $prenom_demande = $donnees['Prenom']; - $nom_demande = $donnees['Nom']; - $nb_emails_valides ++; - } - Liberation_jeu_de_resultat_bdd($reponse); - - if ($nb_emails_valides > 0) - { - // Génération d'un MDP aléatoire : - $password = Mdp_aleatoire(6); // Si l'adresse email est vide, il est inutile de préparer un mdp... - - // Mise à jour du nouveau mot de passe : - $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; - Requete_preparee_bdd($requete, - array( - array('i', $cle_primaire_demande)), - __FILE__, __LINE__); - - $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; - Requete_preparee_bdd($requete, - array( - array('s', password_hash($password, PASSWORD_DEFAULT)), - array('i', $cle_primaire_demande)), - __FILE__, __LINE__); - - $requete = 'INSERT INTO TB_Activation(ID_SHIPMEMBERS) VALUES (?)'; - Requete_preparee_bdd($requete, - array( - array('s', $cle_primaire_demande)), - __FILE__, __LINE__); - - // Mémorisation dans l'historique de la connexion : - $requete = 'INSERT INTO TB_Historique(Type, Sous_type, ID_ELEMENT, Valeur, Description) VALUES (?, ?, ?, ?, ?)'; - Requete_preparee_bdd($requete, - array( - array('i', SYSTEME), - array('i', SYSTEME_REINIT_MDP_USER), - array('i', $cle_primaire_demande), - array('i', 0), - array('s', 'Réinitialisation du mot de passe de '.$prenom_demande.' '.$prenom_demande.' [N° '.$cle_primaire_demande.']')), - __FILE__, __LINE__); - - - // Calcul de la date limite d'activation du compte : - $date = date_create("now"); // Date courante - date_add($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante + Nb jour configurés - $date_maxi_activation = date_format($date, "d/m/Y à H:i"); - - //......................................................................... - // Préparation et envoi de l'email de regénération de mot de passe : - $texte_email = t("

Bonjour,

-

Le mot de passe de votre compte ShipMember vient d'être réinitialisé à votre demande.

-

Nom : [[Prenom]] [[Nom]]

-

Email : [[Email]]

-

Mot de passe provisoire : [[Password]]

-

Plus qu’un clic : Connectez-vous sur [[Url_site]] pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*).

-

Bienvenue à nouveau parmi nous !

-

L'équipage ShipHeart

-

-

(*) L'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.

"); - - // Mise à jour des parametres du texte : - $texte_email = str_replace("[[Prenom]]", $prenom_demande, $texte_email); - $texte_email = str_replace("[[Nom]]", $nom_demande, $texte_email); - $texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email); - $texte_email = str_replace("[[Password]]", $password, $texte_email); - $texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email); - $texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email); - - Envoi_email('', $_SESSION['shipmember']['Email'], - t("Votre demande concernant votre accès ShipMember"), - $texte_email, - "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); - - //............................................................................ - // Message d'information : - $message = t("Un email vient d'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec les informations relatives à votre inscription.")."
"; - - $message = str_replace("[[Prenom]]", $prenom_demande, $message); - $message = str_replace("[[Nom]]", $nom_demande, $message); - $message = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $message); - - $message_information .= $message; - - //......................................................................... - // 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='.$cle_primaire_demande.' 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; - -// $_SESSION['acces_valide'] = true; -// $_SESSION['Shipmembers']['page'] = "Accueil"; - } - - $_SESSION['Shipmembers']['page'] = "Login"; - } - } - - //--------------------------------------------------------------------------- - // Modifications ShipMember : - if (isset($_POST['validation_modification_shipmember']) AND - isset($_POST['Prenom']) AND - isset($_POST['Nom']) AND - isset($_POST['Entreprise']) AND - isset($_POST['Rue']) AND - isset($_POST['Code_postal']) AND - isset($_POST['Ville']) AND - isset($_POST['ID_Pays']) AND - isset($_POST['Email']) AND - isset($_POST['Telephone']) AND - isset($_POST['Mot_de_passe_1']) AND - isset($_POST['Mot_de_passe_2'])) - { - // Mémorisation des valeurs saisies pour éviter de les perdre en cas d'erreur rendant la création impossible : - $old_email = $_SESSION['shipmember']['Email']; - $_SESSION['shipmember']['Prenom'] = trim($_POST['Prenom']); - $_SESSION['shipmember']['Nom'] = trim($_POST['Nom']); - $_SESSION['shipmember']['Entreprise'] = trim($_POST['Entreprise']); - $_SESSION['shipmember']['Rue'] = trim($_POST['Rue']); - $_SESSION['shipmember']['Code_postal'] = trim($_POST['Code_postal']); - $_SESSION['shipmember']['Ville'] = trim($_POST['Ville']); - $_SESSION['shipmember']['ID_Pays'] = $_POST['ID_Pays']; - $_SESSION['shipmember']['Telephone'] = trim($_POST['Telephone']); - $_SESSION['shipmember']['Email'] = strtolower(trim($_POST['Email'])); - - if ($old_email != $_SESSION['shipmember']['Email']) $flag_new_email = true; - else $flag_new_email = false; - - - // Vérifications : - $message_erreur .= check_longueur_champ('prenom_titre', $_SESSION['shipmember']['Prenom'], MIN_LONGUEUR_PRENOM, MAX_LONGUEUR_PRENOM); - $message_erreur .= check_longueur_champ('nom_titre', $_SESSION['shipmember']['Nom'], MIN_LONGUEUR_NOM, MAX_LONGUEUR_NOM); - $message_erreur .= check_longueur_champ('rue_titre', $_SESSION['shipmember']['Rue'], MIN_LONGUEUR_RUE, MAX_LONGUEUR_RUE); - $message_erreur .= check_longueur_champ('code_postal_titre', $_SESSION['shipmember']['Code_postal'], MIN_LONGUEUR_CODE_POSTAL, MAX_LONGUEUR_CODE_POSTAL); - $message_erreur .= check_longueur_champ('ville_titre', $_SESSION['shipmember']['Ville'], MIN_LONGUEUR_VILLE, MAX_LONGUEUR_VILLE); - $message_erreur .= check_longueur_champ('telephone_titre', $_SESSION['shipmember']['Telephone'], MIN_LONGUEUR_TELEPHONE, MAX_LONGUEUR_TELEPHONE); - - if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_SESSION['shipmember']['Email']) != 1) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... - { - $message_erreur .= t("[Email] est invalide !"); - } - - // Vérification si l'email n'existe pas déjà : - if (($message_erreur == "") AND ($flag_new_email)) - { - $requete = 'SELECT count(ID) AS Nb_shipmembers FROM TB_Shipmembers WHERE Validite=1 AND Email=?'; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['shipmember']['Email'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - if ($donnees['Nb_shipmembers'] != 0) - { - $message_erreur .= t("[Email] est déjà utilisée par un ShipMember.
Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse.
Sinon, merci de choisir une autre adresse."); - } - } - Liberation_jeu_de_resultat_bdd($reponse); - } - - // Vérification des nouveaux mots de passe : - $flag_new_pwd = false; - if (strlen($_POST['Mot_de_passe_1']) != 0) // Si le premier mot de passe est vide, on considère qu'aucune mise à jour de MDP n'est demandée. - { - if ($_POST['Mot_de_passe_1'] != $_POST['Mot_de_passe_2']) $message_erreur .= t("Les deux mots de passe saisis doivent être identiques."); - elseif (Check_mdp($_POST['Mot_de_passe_1']) != 1) $message_erreur .= t("Le mot de passe renseigné n'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=."); - else $flag_new_pwd = true; - } - - - - // Si les contrôles ne sont pas invalides, on met à jour le ShipMember : - if ($message_erreur == "") - { - $requete = 'UPDATE TB_Shipmembers SET Prenom=?, Nom=?, Entreprise=?, Rue=?, Code_postal=?, Ville=?, ID_Pays=?, Telephone=?, Email=? WHERE ID=?'; - Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['shipmember']['Prenom']), - array('s', $_SESSION['shipmember']['Nom']), - array('s', $_SESSION['shipmember']['Entreprise']), - array('s', $_SESSION['shipmember']['Rue']), - array('s', $_SESSION['shipmember']['Code_postal']), - array('s', $_SESSION['shipmember']['Ville']), - array('i', $_SESSION['shipmember']['ID_Pays']), - array('s', $_SESSION['shipmember']['Telephone']), - array('s', Protection_mysql($_SESSION['shipmember']['Email'])), // On protège l'Email contre les injections car c'est lui qui va servir aux requetes tant qu'on n'a pas la Clé_primaire. - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - - // Mise à jour du nouveau mot de passe : - if ($flag_new_pwd) - { - $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; - Requete_preparee_bdd($requete, - array( - array('s', password_hash(Protection_mysql($_POST['Mot_de_passe_1']), PASSWORD_DEFAULT)), - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - - $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; - Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - // NB : on met à 0 le flag 'compte_a_activer' car il se peut qu'on soit là juste après la création (en accès temporaire). Dans ce cas, si on a mis à jour les mots de passe, - // il est inutile de demander ensuite une activation. - } - - // Mise à jour du libellé du pays : - $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['ID_Pays']), - array('s', $_SESSION['langue'])), - __FILE__, __LINE__); - $donnees = Recherche_ligne_bdd($reponse); - $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; - Liberation_jeu_de_resultat_bdd($reponse); - - // Mise à jour de l'email : - if ($flag_new_email) - { - //......................................................................... - // Préparation et envoi de l'email de modification d'adresse email : - $texte_email = t("

Bonjour,

-

L'adresse email associée à votre compte ShipMember vient d'être modifiée à votre demande :

-

Ancienne adresse : [[Old_email]]

Nouvelle adresse : [[New_email]]

-

Si vous n'êtes pas à l'origine de ce changement d'adresse, merci de contacter sans attendre l'administrateur du site à : [[Adresse_email_alertes]]

-

L'équipage ShipHeart

"); - - // Mise à jour des parametres du texte : - $texte_email = str_replace("[[Old_email]]", $old_email, $texte_email); - $texte_email = str_replace("[[New_email]]", $_SESSION['shipmember']['Email'], $texte_email); - $texte_email = str_replace("[[Adresse_email_alertes]]", $_SESSION['Config__Adresse_email_alertes'], $texte_email); - - Envoi_email('', $_SESSION['shipmember']['Email'], - t("Modifications de votre accès ShipMember"), - $texte_email, - "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); - //Fin......................................................................... - - } - - $_SESSION['Shipmembers']['page'] = "Profil"; - } - - } - - - - -//************************************************************************************************************************************ -// Traitement des données -//************************************************************************************************************************************ - - // Protection contre les accès directs... : - if (($_SESSION['Shipmembers']['page'] != "Login") AND - ($_SESSION['Shipmembers']['page'] != "Activation") AND - ($_SESSION['Shipmembers']['page'] != "Generation_mdp") AND - (!$_SESSION['acces_valide'])) header('Location:shipmembers.php?action=navigation&destination=Login'); - - // $_SESSION['code_acces'] = $_GET['code_acces']; - // if (isset($_GET['code_acces']) && !isset($_SESSION['code_acces'])) $_SESSION['code_acces'] = $_GET['code_acces']; - - switch ($_SESSION['Shipmembers']['page']) - { - //**************************************************************************************************************************** - case "Login": - { - //--------------------------------------------------------------------- - // Saut à l'accueil sans login si on est déjà identifié : - if ($_SESSION['acces_valide'] && (!isset($_SESSION['code_acces']) || $_SESSION['code_acces'] == '') ) header('Location:shipmembers.php?action=navigation&destination=Accueil'); - else if ($_SESSION['acces_valide'] && (isset($_SESSION['code_acces']) && $_SESSION['code_acces'] != '') ) header('Location:shipmembers.php?action=navigation&destination=Accueil&code_acces='.$_SESSION['code_acces']); - //--------------------------------------------------------------------- - // Récupération des informations sur les pays : - $nb_pays = 0; - $requete = 'SELECT ID, ID AS Cle_primaire, Code_alpha2, Code_alpha3, (SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays ORDER BY Nom ASC'; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['langue'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $pays[$nb_pays ++] = $donnees; - } - Liberation_jeu_de_resultat_bdd($reponse); - - break; - } - - //**************************************************************************************************************************** - case "Activation": - { - //--------------------------------------------------------------------- - // Saut à l'accueil sans login si on est déjà identifié : - if ($_SESSION['acces_valide']) header('Location:shipmembers.php?action=navigation&destination=Accueil'); - - break; - } - - //**************************************************************************************************************************** - case "Generation_mdp": - { - //--------------------------------------------------------------------- - // Saut à l'accueil sans login si on est déjà identifié : - if ($_SESSION['acces_valide']) header('Location:shipmembers.php?action=navigation&destination=Accueil'); - - break; - } - - //**************************************************************************************************************************** - case "Accueil": - { - // Mise à jour des données du ShipMember (au cas où) : - $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $_SESSION['shipmember'] = $donnees; - } - 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; - // $_SESSION['acces_valide'] = true; - - - break; - } - - - - - - //**************************************************************************************************************************** - case "Profil": - { - //--------------------------------------------------------------------- - // Récupération des informations sur les pays : - $nb_pays = 0; - $requete = 'SELECT ID, Code_alpha2, Code_alpha3, (SELECT Texte FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays WHERE ID=?'; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['langue']), - array('i', $_SESSION['shipmember']['ID_Pays'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $pays = $donnees; - } - Liberation_jeu_de_resultat_bdd($reponse); - - break; - } - - //**************************************************************************************************************************** - case "Modifier_profil": - { - - //--------------------------------------------------------------------- - // Récupération des informations sur les pays : - $nb_pays = 0; - $requete = 'SELECT ID, ID AS Cle_primaire, Code_alpha2, Code_alpha3, (SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays ORDER BY Nom ASC'; - $reponse = Requete_preparee_bdd($requete, - array( - array('s', $_SESSION['langue'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $pays[$nb_pays ++] = $donnees; - } - Liberation_jeu_de_resultat_bdd($reponse); - - break; - } - - - //**************************************************************************************************************************** - case "Bateau": - { - // Récupération des informations sur le ou les bateaux accessibles à ce ShipMember : - $nb_bateaux = 0; - $requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Validite_acces=1 AND ID_SHIPMEMBER=? '; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $_SESSION['shipmember']['Cle_primaire'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $bateaux[$nb_bateaux ++]['Cle_primaire'] = $donnees['ID_Bateau']; - } - Liberation_jeu_de_resultat_bdd($reponse); - - // Bateau demonstration pour les SM affectés à aucun bateau - - if ($nb_bateaux == 0){ - $requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Validite_acces=1 AND ID_SHIPMEMBER=? AND Code=? '; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', 0), - array('s', "0000")), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $bateaux[$nb_bateaux ++]['Cle_primaire'] = $donnees['ID_Bateau']; - } - Liberation_jeu_de_resultat_bdd($reponse); - - } - // Récupération des informations relatives à chacun des bateaux accessibles : - for ($i=0; $i<$nb_bateaux; $i ++) - { - $requete = 'SELECT * FROM TB_Bateaux WHERE Cle_primaire=? '; - $reponse = Requete_preparee_bdd($requete, - array( - array('i', $bateaux[$i]['Cle_primaire'])), - __FILE__, __LINE__); - while ($donnees = Recherche_ligne_bdd($reponse)) - { - $bateaux[$i] = $donnees; - } - 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; - // $_SESSION['acces_valide'] = true; - - break; - } - - //**************************************************************************************************************************** - default: - { - $_SESSION['Shipmembers']['page'] = "Accueil"; - break; - } - } - - Fermeture_bdd(); // Déconnexion de MySQL - - -//************************************************************************************************************************************ -// Affichage -//************************************************************************************************************************************ - - Entete_page_html(); - - //******************************************************************************************************************************** - // Affichage principal : - echo '
'; - - echo '
'; // Permet de remonter au début de page par défaut - - //========================================================================================= - // Entête : - Entete_page($message_erreur, $message_information); - // if (isset($_SESSION['code_acces'])) echo $_SESSION['code_acces']; - switch ($_SESSION['Shipmembers']['page']) - { - //************************************************************************************************************************ - case "Login": - { - echo '
'; - - echo '

'.t("Connectez-vous").'

'; - - echo '
'; - - //--------------------------------------------------------------------------- - // Déjà ShipMember : - echo ''; - - - //--------------------------------------------------------------------------- - // Nouveau ShipMember : - echo ''; - - echo '
'; - - break; - } - - - //************************************************************************************************************************ - case "Activation": - { - echo '
'; - - echo '

'.t("Mon espace ShipMember").'

'; - - echo '
'; - - echo '
'; - - echo '

'.t("Activation de mon compte").'

'; - - echo '
-

'.t("Votre compte n'a pas encore été activé. Pour cela, merci de changer votre mot de passe provisoire ci-dessous.").'

-
'; - - echo '
'; - - echo '
-
'.t("Prénom").'
-
'.$_SESSION['shipmember']['Prenom'].'
-
'; - - echo '
-
'.t("Nom").'
-
'.$_SESSION['shipmember']['Nom'].'
-
'; - - echo '
-
'.t("Email").'
-
'.$_SESSION['shipmember']['Email'].'
-
'; - - echo '
-
'.t("Nouveau mot de passe").'
-
- -
-
'; - - echo '
-
'.t("Nouveau mot de passe (2)").'
-
- -
-
'; - - echo '
'; - - echo '
- -
'; - - echo '
'; - - echo '
'; - - echo '
'; - - break; - } - - //************************************************************************************************************************ - case "Generation_mdp": - { - echo '
'; - - echo '

'.t("Mon espace ShipMember").'

'; - - echo '
'; - - echo '
'; - - echo '

'.t("Générer un nouveau mot de passe provisoire").'

'; - - echo '
-

'.t("Renseignez votre adresse email puis confirmez votre demande.
Si votre adresse existe bien dans la liste des ShipMembers, un email vous sera adressé immédiatement avec un nouveau mot de passe provisoire.").'

-

'.t("Attention : dès validation, seul ce nouveau mot de passe provisoire sera valide pour vous connecter. Si vous n'avez pas reçu cet email dans les prochaines minutes, merci de vérifier s'il ne se trouve pas dans vos courriers indésirables. ").'

-
'; - - echo '
'; - - echo '
-
- '.t("Email").'* -
-
- -
-
'; - - echo '
'; - - echo '
- -
'; - - echo '
'; - - echo '
'; - - echo '
'; - - break; - } - - - //************************************************************************************************************************ - case "Accueil": - { - echo '
'; - - echo '

'.t("Mon espace ShipMember").'

'; - - echo '
'; - - echo '
-

'.t("Bienvenue dans votre espace ShipMember !").'

-

'.t("Vous trouverez ici toutes les informations que nous conservons vous concernant. Notre objectif est de ne conserver que celles nécessaires au traitement de vos commandes et, surtout, vous permettant de profiter pleinement de toutes les fonctions de votre ShipHeart.").'

-

'.t("Enfin, nous vous rappelons que Koriolan ne diffuse et ne diffusera jamais la moindre de ces informations à d'autres sociétés. Pour plus de précisions sur le traitement de vos données personnelles, n'hésitez pas à consulter nos mentions légales accessibles en bas de cette page.").'

-
'; - - echo '
'; - - echo '
'; - echo ' - '.t("Mes informations").' - '; - - echo ' - '.t("Mon bateau").' - '; - - echo ' - '.t("Déconnexion").' - '; - - // Accès au menu d'administration : - // if (isset($_SESSION['shipmember']['Niveau_administration']) && $_SESSION['shipmember']['Niveau_administration'] != '') - if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR) - { - echo ' - Administration - '; - } - - echo '
'; - - echo ''; - - break; - } - - - - - - //************************************************************************************************************************ - case "Profil": - { - echo '
'; - - echo '

'.t("Mon espace ShipMember").'

'; - - echo '
'; - - //--------------------------------------------------------------------------- - // Profil ShipMember : - echo '
'; - - echo '

'.t("Mes informations").'

'; - - /* echo '
-
- '.t("Numéro de ShipMember").' -
-
- '.$_SESSION['shipmember']['Cle_primaire'].' -
-
'; */ - - echo '
-
- '.t("Prénom").' -
-
- '.$_SESSION['shipmember']['Prenom'].' -
-
'; - - echo '
-
- '.t("Nom").' -
-
- '.$_SESSION['shipmember']['Nom'].' -
-
'; - - echo '
-
- '.t("Entreprise").' -
-
- '.$_SESSION['shipmember']['Entreprise'].' -
-
'; - - echo '
-
- '.t("Numéro et rue").' -
-
- '.$_SESSION['shipmember']['Rue'].' -
-
'; - - echo '
-
- '.t("Code postal").' -
-
- '.$_SESSION['shipmember']['Code_postal'].' -
-
'; - - echo '
-
- '.t("Ville").' -
-
- '.$_SESSION['shipmember']['Ville'].' -
-
'; - - echo '
-
- '.t("Pays").' -
-
- '.$pays['Nom'].' -
-
'; - - echo '
-
- '.t("Téléphone").' -
-
- '.$_SESSION['shipmember']['Telephone'].' -
-
'; - - echo '
-
- '.t("Email").' -
-
- '.$_SESSION['shipmember']['Email'].' -
-
'; - - echo '
'; - - - echo '
'; - echo ' - '.t("Modifier").' - '; - - echo ' - '.t("Retour").' - '; - echo '
'; - - echo '
'; - - break; - } - - //************************************************************************************************************************ - case "Modifier_profil": - { - echo '
'; - - echo '

'.t("Modifier mes informations").'

'; - - echo '
'; - - //--------------------------------------------------------------------------- - // Profil ShipMember : - echo '
'; - - echo '

'.t("Modifier mes informations").'

'; - - echo '
-
- '.t("Prénom").'* -
-
- -
-
'; - - echo '
-
- '.t("Nom").'* -
-
- -
-
'; - - echo '
-
- '.t("Entreprise").' -
-
- -
-
'; - - echo '
-
- '.t("Numéro et rue").' -
-
- -
-
'; - - echo '
-
- '.t("Code postal").' -
-
- -
-
'; - - echo '
-
- '.t("Ville").' -
-
- -
-
'; - - echo '
-
- '.t("Pays").' -
-
- -
-
'; - - echo '
-
- '.t("Téléphone").' -
-
- -
-
'; - - echo '
-
- '.t("Email").'* -
-
- -
-
'; - - - // Modification MDP : - echo '
-

'.t("Si vous souhaitez modifier votre mot de passe, entrez votre nouveau mot de passe deux fois ci-dessous. Sinon, laissez ces deux champs vides.").'

-
'; - - echo '
-
'.t("Nouveau mot de passe").'
-
- -
-
'; - - echo '
-
'.t("Nouveau mot de passe (2)").'
-
- -
-
'; - - - echo '
'; - - echo '
'; - echo ''; - - echo ' - '.t("Annuler").' - '; - echo '
'; - - echo '
'; - - break; - } - - - //************************************************************************************************************************ - case "Bateau": - { - echo '
'; - - echo '

'.t("Mon espace ShipMember").'

'; - - echo '
'; - - echo '
'; - - if ($nb_bateaux > 1) echo '

'.t("Accès à mes bateaux").'

'; - else echo '

'.t("Accès à mon bateau").'

'; - - if ($nb_bateaux == 0) // Si aucun bateau n'est configuré pour ce ShipMember : - { - echo '
-

'.t("Vous n'avez pas encore de ShipHeart activé.").'

-

'.t("Mais dès que ce sera le cas, vous trouverez ici l'accès à votre ou vos bateaux.").'

-

'.t("Pour chacun d'eux, vous visualiserez l'état de tous les circuits, leur consommation, le niveau des réservoirs et des batteries, mais aussi toutes les valeurs de vos capteurs : températures, pression atmosphérique, humidité, position géographique, etc...
Vous aurez également accès aux courbes historiques de toutes ces valeurs.").'

-

'.t("C'est également ici que vous pourrez créer des profils [Propriétaire], [Installateur] ou [Skipper] afin de donner accès de façon contrôlée à votre ou à vos bateaux. Sans aucune limite !").'

-
'; - } - else // Si au moins un bateau est configuré pour ce ShipMember - { - for ($i=0; $i<$nb_bateaux; $i ++) - { - - echo ' - '.$bateaux[$i]['Nom'].' - '; - - } - } - - echo '
'; - - echo '
'; - echo ' - '.t("Retour").' - '; - echo '
'; - - echo '
'; - - break; - } - - - } - - - echo '
'; - - echo '
'; - - - //******************************************************************************************************************************** - // Menu de pieds de page : -Pied_de_page(); +Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse.
Sinon, merci de choisir une autre adresse."); + } + } + Liberation_jeu_de_resultat_bdd($reponse); + } + + if ($message_erreur == "") // Si les contrôles ne sont pas invalides, on créé le nouvel utilisateur : + { + // Génération d'un MDP aléatoire : + $password = Mdp_aleatoire(6); // Si l'adresse email est vide, il est inutile de préparer un mdp... + + + // Création du ShipMember : + $requete = 'INSERT INTO TB_Shipmembers(Nom, Prenom, Entreprise, Rue, Code_postal, Ville, ID_PAYS, Telephone, Email, ID_LANGUAGES, Mdp, Date_creation_compte) VALUES (?,?,?,?,?,?,?,?,?,(SELECT ID FROM TB_Langues WHERE Prefix=?),?,?)'; + Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['shipmember']['Nom']), + array('s', $_SESSION['shipmember']['Prenom']), + array('s', $_SESSION['shipmember']['Entreprise']), + array('s', $_SESSION['shipmember']['Rue']), + array('s', $_SESSION['shipmember']['Code_postal']), + array('s', $_SESSION['shipmember']['Ville']), + array('i', $_SESSION['shipmember']['ID_Pays']), + array('s', $_SESSION['shipmember']['Telephone']), + array('s', $_SESSION['shipmember']['Email']), + array('s', $_SESSION['langue']), + array('s', password_hash($password, PASSWORD_DEFAULT)), + array('s', date("Y-m-d H:i:s"))), + __FILE__, __LINE__); + + $_SESSION['shipmember']['Cle_primaire'] = Recuperation_id_cree_bdd(); + + $requete = 'INSERT INTO TB_Activation(ID_SHIPMEMBERS, Date_creation_mdp) VALUES (?, ?)'; + Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['shipmember']['Cle_primaire']), + array('s', date("Y-m-d H:i:s"))), + __FILE__, __LINE__); + + // Mise à jour du libellé du pays : + $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['ID_Pays']), + array('s', $_SESSION['langue'])), + __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse); + $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; + Liberation_jeu_de_resultat_bdd($reponse); + + // Calcul de la date limite d'activation du compte : + $date = date_create("now"); // Date courante + date_add($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante + Nb jour configurés + $date_maxi_activation = date_format($date, "d/m/Y à H:i"); + + //......................................................................... + // Préparation et envoi de l'email de confirmation de création de compte : + $texte_email = t("

Félicitations !

+

Votre compte ShipMember est créé, vous y êtes presque.

+

Nom : [[Prenom]] [[Nom]]

+

Email : [[Email]]

+

Mot de passe provisoire : [[Password]]

+

Plus qu’un clic : Connectez-vous sur [[Url_site]] pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.

+

Et ensuite, où que vous soyez et dès que votre ShipHeart est installé, accédez à votre bateau via votre accès privilégié ShipMember !

+

+

Bienvenue parmi nous !

+

L'équipage ShipHeart

+

+

(*) L'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.

"); + + // Mise à jour des parametres du texte : + $texte_email = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $texte_email); + $texte_email = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $texte_email); + $texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email); + $texte_email = str_replace("[[Password]]", $password, $texte_email); + $texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email); + $texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email); + + Envoi_email('', $_SESSION['shipmember']['Email'], + t("Votre accès ShipMember - Un dernier clic pour accéder à votre bateau !"), + $texte_email, + "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); + //Fin......................................................................... + + //............................................................................ + // Message d'information : + $message = t("Un email vient d'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec un mot de passe provisoire."); + + $message = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $message); + $message = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $message); + $message = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $message); + + $message_information .= $message; + //Fin......................................................................... + + + // Pas de connexion automatique après la création : l'adresse e-mail n'est prouvée qu'à la première connexion avec + // le mot de passe provisoire reçu (activation). Sans cela, n'importe qui pourrait créer un compte avec l'adresse d'un + // autre et accepter aussitôt les invitations destinées à cette adresse (synthèse §47). + $_SESSION['shipmember']['Cle_primaire'] = 0; + $_SESSION['Shipmembers']['page'] = "Login"; + $message_information .= "
".t("Connectez-vous avec ce mot de passe provisoire pour activer votre compte."); + } + } + + + //--------------------------------------------------------------------------- + // Invitations (synthèse §47) : acceptation, refus, saisie manuelle d'un code. Réservé à un utilisateur connecté + // (acceptation et refus) ; les conditions (adresse, statut, expiration, compte activé) sont vérifiées par + // Accepter_invitation() / Refuser_invitation(). Puis redirection (un rafraîchissement ne rejoue pas l'action). + if ((isset($_POST['accepter_invitation']) || isset($_POST['refuser_invitation'])) && $_SESSION['acces_valide']) + { + if (isset($_POST['accepter_invitation'])) + { + $resultat = Accepter_invitation((int)$_POST['accepter_invitation'], $_SESSION['shipmember']['Cle_primaire'], $_SESSION['shipmember']['Email']); + if ($resultat['ok']) + { + Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); + $_SESSION['Shipmembers']['flash_information'] = t("Invitation acceptée : le bateau est maintenant accessible dans « Mon bateau »."); + } + else $_SESSION['Shipmembers']['flash_erreur'] = $resultat['raison']; + } + else + { + if (Refuser_invitation((int)$_POST['refuser_invitation'], $_SESSION['shipmember']['Email'])) $_SESSION['Shipmembers']['flash_information'] = t("Invitation refusée."); + else $_SESSION['Shipmembers']['flash_erreur'] = t("Cette invitation n'est plus valable."); + } + $_SESSION['Shipmembers']['page'] = "Accueil"; + Fermeture_bdd(); + header('Location: shipmembers.php'); + exit(); + } + + if (isset($_POST['saisie_code_invitation'])) + { + $code = Normaliser_code_invitation($_POST['code_invitation'] ?? ''); + if ($code === false) $message_erreur .= t("Ce code n'a pas le bon format (8 caractères, par exemple K7QX-M3PW)."); + else + { + $_SESSION['code_acces'] = $code; // Examiné ci-dessous (page Accueil, ou bandeau de la page Login) + if ($_SESSION['acces_valide']) $_SESSION['Shipmembers']['page'] = "Accueil"; + } + } + + //--------------------------------------------------------------------------- + // Lecture de l'email et du mot de passe et filtrage contre les injections SQL : + if (isset($_POST['validation_login_shipmember']) AND isset($_POST['email_validation']) AND isset($_POST['mdp_validation'])) + { + // if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email_validation']) != 1) $message_information .= "Erreur de PERG MATCH
"; + + if (($_POST['email_validation'] != NULL) AND + ($_POST['mdp_validation'] != NULL) AND + (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email_validation']) == 1)) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... + { + $email = Protection_mysql(strtolower($_POST['email_validation'])); // On ajoute les caractères d'échappement sur l'email qui sera envoyé dans la requête + $mdp = $_POST['mdp_validation']; // Le MDP n'est pas envoyé... + + $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Email=? '; + // NB : variable dédiée ($reponse_login) - le corps de la boucle exécute d'autres requêtes qui réutilisaient $reponse ; + // la libération finale visait alors un résultat déjà libéré (erreur fatale en PHP 8 - synthèse §47) : + $reponse_login = Requete_preparee_bdd($requete, + array( + array('s', $email)), + __FILE__, __LINE__); + + while ($donnees = Recherche_ligne_bdd($reponse_login)) + { + if (password_verify($mdp, $donnees['Mdp'])) + { + + $_SESSION['shipmember'] = $donnees; // Sauvegarde des informations du ShipMember + + if ($donnees['Compte_a_activer'] != 0) + { + $date = date_create("now"); // Date courante + date_sub($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante - Nb jour configurés + $date_creation = date_create_from_format('Y-m-d H:i:s', $donnees['Date_creation_mdp']); + + if ($date < $date_creation) // Si le Mdp provisoire est toujours valable : + { + $_SESSION['Shipmembers']['page'] = "Activation"; + } + else // Si le Mdp provisoireest expiré : + { + $message_erreur .= t("Désolé, votre compte n'a pas été activé dans le délai maximal.
Vous pouvez demander la génération d'un nouveau mot de passe provisoire en cliquant sur le bouton ci-dessous. Il vous sera adressé immédiatement par email."); + } + } + else + { + // Mémorisation dans l'historique de la connexion : + $requete = 'INSERT INTO TB_Historique(Type, Sous_type, ID_ELEMENT, Valeur, Description) VALUES (?, ?, ?, ?, ?)'; + Requete_preparee_bdd($requete, + array( + array('i', SYSTEME), + array('i', SYSTEME_CONNEXION_USER), + array('i', $_SESSION['shipmember']['Cle_primaire']), + array('i', 0), + array('s', 'Connexion de '.$donnees['Prenom'].' '.$donnees['Nom'].' [N° '.$_SESSION['shipmember']['Cle_primaire'].']')), + __FILE__, __LINE__); + + // Recherche des informations du ShipMember : + $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) $_SESSION['shipmember'] = $donnees; + Liberation_jeu_de_resultat_bdd($reponse); + + // Mise à jour du libellé du pays : + $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['ID_Pays']), + array('s', $_SESSION['langue'])), + __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse); + $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; + Liberation_jeu_de_resultat_bdd($reponse); + + // Message de bienvenue : + $message_information .= t("Bienvenue !"); + + $_SESSION['acces_valide'] = true; + + + Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); // Accès actifs (synthèse §47) + $_SESSION['Shipmembers']['page'] = "Accueil"; + } + + break; // Dans le cas où il y aurait plus d'une entrée avec le bon email ET le bon mdp, on ne traite que le premier... + } + // else $message_information .= "MDP ne matchent pas. "; + } + Liberation_jeu_de_resultat_bdd($reponse_login); + + } + // else $message_information .= "Email ou MDP non valides : [".$_POST['email_validation']."] et [".$_POST['mdp_validation']."]."; + else $message_erreur .= "Email ou MDP non valides"; + } + + + //--------------------------------------------------------------------------- + // Activation Shipmember : + if (isset($_POST['validation_activation_shipmember']) AND + isset($_POST['Mot_de_passe_1']) AND + isset($_POST['Mot_de_passe_2'])) + { + if (($_POST['Mot_de_passe_1'] == $_POST['Mot_de_passe_2']) AND (Check_mdp($_POST['Mot_de_passe_1']) == 1)) + { + $new_mdp = $_POST['Mot_de_passe_1']; + + // Recherche du MDP existant de l'adhérent : + $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) $shipmember = $donnees; + Liberation_jeu_de_resultat_bdd($reponse); + + // Vérification que le mot de passe est changé : +// if (Hash_Mdp($new_mdp) == $shipmember['Mdp']) $message_erreur .= nl2br(Recuperation_texte('all','all','erreurs','pwd_egal_temporaire')); + if (password_verify($new_mdp, $shipmember['Mdp'])) $message_erreur .= t("Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire."); + else + { + // Mise à jour du nouveau mot de passe : + // NB : haché tel quel - l'ancien code hachait la version échappée pour SQL (Protection_mysql), qui ne correspond + // plus au mot de passe saisi à la connexion dès qu'il contient un caractère échappé (synthèse §47) : + $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; + Requete_preparee_bdd($requete, + array( + array('s', password_hash($new_mdp, PASSWORD_DEFAULT)), + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + + $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; + Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + + $_SESSION['acces_valide'] = true; + + Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); // Accès actifs (synthèse §47) + // $_SESSION['acces_valide'] = true; + $_SESSION['Shipmembers']['page'] = "Accueil"; + + + $_SESSION['Shipmembers']['page'] = "Accueil"; + $message_information .= t("Félicitations : votre compte est maintenant activé et vous êtes d'ores et déjà connecté.e.").' !'; + } + } + else + { + if ($_POST['Mot_de_passe_1'] != $_POST['Mot_de_passe_2']) $message_erreur .= t("Les deux mots de passe saisis doivent être identiques."); + else $message_erreur .= nl2br(t("Le mot de passe renseigné n'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.")); + } + } + + //--------------------------------------------------------------------------- + // Regenération du mot de passe : + if (isset($_POST['regenerer_mdp_shipmember']) AND isset($_POST['Email'])) + { + $_SESSION['shipmember']['Email'] = strtolower(trim($_POST['Email'])); + + // Vérifications : + if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_SESSION['shipmember']['Email']) != 1) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... + { + $message_erreur .= t("[Email] est invalide !"); + } + + // Vérification si l'email existe bien dans la base : + if ($message_erreur == "") + { + $nb_emails_valides = 0; + + $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Validite=1 AND Email=? '; + $reponse = Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['shipmember']['Email'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + // Ces informations ne servent qu'à composer l'e-mail : NE PAS écrire + // $_SESSION['shipmember'], pour ne pas laisser en session l'identité d'un + // compte QUE L'ON N'A PAS ENCORE AUTHENTIFIÉ (n'importe qui peut demander la + // réinitialisation du mot de passe d'une adresse qui n'est pas la sienne). + $cle_primaire_demande = $donnees['Cle_primaire']; + $prenom_demande = $donnees['Prenom']; + $nom_demande = $donnees['Nom']; + $nb_emails_valides ++; + } + Liberation_jeu_de_resultat_bdd($reponse); + + if ($nb_emails_valides > 0) + { + // Génération d'un MDP aléatoire : + $password = Mdp_aleatoire(6); // Si l'adresse email est vide, il est inutile de préparer un mdp... + + // Mise à jour du nouveau mot de passe : + $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; + Requete_preparee_bdd($requete, + array( + array('i', $cle_primaire_demande)), + __FILE__, __LINE__); + + $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; + Requete_preparee_bdd($requete, + array( + array('s', password_hash($password, PASSWORD_DEFAULT)), + array('i', $cle_primaire_demande)), + __FILE__, __LINE__); + + $requete = 'INSERT INTO TB_Activation(ID_SHIPMEMBERS) VALUES (?)'; + Requete_preparee_bdd($requete, + array( + array('s', $cle_primaire_demande)), + __FILE__, __LINE__); + + // Mémorisation dans l'historique de la connexion : + $requete = 'INSERT INTO TB_Historique(Type, Sous_type, ID_ELEMENT, Valeur, Description) VALUES (?, ?, ?, ?, ?)'; + Requete_preparee_bdd($requete, + array( + array('i', SYSTEME), + array('i', SYSTEME_REINIT_MDP_USER), + array('i', $cle_primaire_demande), + array('i', 0), + array('s', 'Réinitialisation du mot de passe de '.$prenom_demande.' '.$prenom_demande.' [N° '.$cle_primaire_demande.']')), + __FILE__, __LINE__); + + + // Calcul de la date limite d'activation du compte : + $date = date_create("now"); // Date courante + date_add($date, date_interval_create_from_date_string(''.$_SESSION['Config__Time_out_activation_compte'].' days')); // Date courante + Nb jour configurés + $date_maxi_activation = date_format($date, "d/m/Y à H:i"); + + //......................................................................... + // Préparation et envoi de l'email de regénération de mot de passe : + $texte_email = t("

Bonjour,

+

Le mot de passe de votre compte ShipMember vient d'être réinitialisé à votre demande.

+

Nom : [[Prenom]] [[Nom]]

+

Email : [[Email]]

+

Mot de passe provisoire : [[Password]]

+

Plus qu’un clic : Connectez-vous sur [[Url_site]] pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*).

+

Bienvenue à nouveau parmi nous !

+

L'équipage ShipHeart

+

+

(*) L'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.

"); + + // Mise à jour des parametres du texte : + $texte_email = str_replace("[[Prenom]]", $prenom_demande, $texte_email); + $texte_email = str_replace("[[Nom]]", $nom_demande, $texte_email); + $texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email); + $texte_email = str_replace("[[Password]]", $password, $texte_email); + $texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email); + $texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email); + + Envoi_email('', $_SESSION['shipmember']['Email'], + t("Votre demande concernant votre accès ShipMember"), + $texte_email, + "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); + + //............................................................................ + // Message d'information : + $message = t("Un email vient d'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec les informations relatives à votre inscription.")."
"; + + $message = str_replace("[[Prenom]]", $prenom_demande, $message); + $message = str_replace("[[Nom]]", $nom_demande, $message); + $message = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $message); + + $message_information .= $message; + + //......................................................................... + +// $_SESSION['acces_valide'] = true; +// $_SESSION['Shipmembers']['page'] = "Accueil"; + } + + $_SESSION['Shipmembers']['page'] = "Login"; + } + } + + //--------------------------------------------------------------------------- + // Modifications ShipMember : + if (isset($_POST['validation_modification_shipmember']) AND + isset($_POST['Prenom']) AND + isset($_POST['Nom']) AND + isset($_POST['Entreprise']) AND + isset($_POST['Rue']) AND + isset($_POST['Code_postal']) AND + isset($_POST['Ville']) AND + isset($_POST['ID_Pays']) AND + isset($_POST['Email']) AND + isset($_POST['Telephone']) AND + isset($_POST['Mot_de_passe_1']) AND + isset($_POST['Mot_de_passe_2'])) + { + // Mémorisation des valeurs saisies pour éviter de les perdre en cas d'erreur rendant la création impossible : + $old_email = $_SESSION['shipmember']['Email']; + $_SESSION['shipmember']['Prenom'] = trim($_POST['Prenom']); + $_SESSION['shipmember']['Nom'] = trim($_POST['Nom']); + $_SESSION['shipmember']['Entreprise'] = trim($_POST['Entreprise']); + $_SESSION['shipmember']['Rue'] = trim($_POST['Rue']); + $_SESSION['shipmember']['Code_postal'] = trim($_POST['Code_postal']); + $_SESSION['shipmember']['Ville'] = trim($_POST['Ville']); + $_SESSION['shipmember']['ID_Pays'] = $_POST['ID_Pays']; + $_SESSION['shipmember']['Telephone'] = trim($_POST['Telephone']); + $_SESSION['shipmember']['Email'] = strtolower(trim($_POST['Email'])); + + if ($old_email != $_SESSION['shipmember']['Email']) $flag_new_email = true; + else $flag_new_email = false; + + + // Vérifications : + $message_erreur .= check_longueur_champ('prenom_titre', $_SESSION['shipmember']['Prenom'], MIN_LONGUEUR_PRENOM, MAX_LONGUEUR_PRENOM); + $message_erreur .= check_longueur_champ('nom_titre', $_SESSION['shipmember']['Nom'], MIN_LONGUEUR_NOM, MAX_LONGUEUR_NOM); + $message_erreur .= check_longueur_champ('rue_titre', $_SESSION['shipmember']['Rue'], MIN_LONGUEUR_RUE, MAX_LONGUEUR_RUE); + $message_erreur .= check_longueur_champ('code_postal_titre', $_SESSION['shipmember']['Code_postal'], MIN_LONGUEUR_CODE_POSTAL, MAX_LONGUEUR_CODE_POSTAL); + $message_erreur .= check_longueur_champ('ville_titre', $_SESSION['shipmember']['Ville'], MIN_LONGUEUR_VILLE, MAX_LONGUEUR_VILLE); + $message_erreur .= check_longueur_champ('telephone_titre', $_SESSION['shipmember']['Telephone'], MIN_LONGUEUR_TELEPHONE, MAX_LONGUEUR_TELEPHONE); + + if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_SESSION['shipmember']['Email']) != 1) // Ce Preg-Match semble bien plus efficace que le "filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)"... + { + $message_erreur .= t("[Email] est invalide !"); + } + + // Vérification si l'email n'existe pas déjà : + if (($message_erreur == "") AND ($flag_new_email)) + { + $requete = 'SELECT count(ID) AS Nb_shipmembers FROM TB_Shipmembers WHERE Validite=1 AND Email=?'; + $reponse = Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['shipmember']['Email'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + if ($donnees['Nb_shipmembers'] != 0) + { + $message_erreur .= t("[Email] est déjà utilisée par un ShipMember.
Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse.
Sinon, merci de choisir une autre adresse."); + } + } + Liberation_jeu_de_resultat_bdd($reponse); + } + + // Vérification des nouveaux mots de passe : + $flag_new_pwd = false; + if (strlen($_POST['Mot_de_passe_1']) != 0) // Si le premier mot de passe est vide, on considère qu'aucune mise à jour de MDP n'est demandée. + { + if ($_POST['Mot_de_passe_1'] != $_POST['Mot_de_passe_2']) $message_erreur .= t("Les deux mots de passe saisis doivent être identiques."); + elseif (Check_mdp($_POST['Mot_de_passe_1']) != 1) $message_erreur .= t("Le mot de passe renseigné n'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=."); + else $flag_new_pwd = true; + } + + + + // Si les contrôles ne sont pas invalides, on met à jour le ShipMember : + if ($message_erreur == "") + { + $requete = 'UPDATE TB_Shipmembers SET Prenom=?, Nom=?, Entreprise=?, Rue=?, Code_postal=?, Ville=?, ID_Pays=?, Telephone=?, Email=? WHERE ID=?'; + Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['shipmember']['Prenom']), + array('s', $_SESSION['shipmember']['Nom']), + array('s', $_SESSION['shipmember']['Entreprise']), + array('s', $_SESSION['shipmember']['Rue']), + array('s', $_SESSION['shipmember']['Code_postal']), + array('s', $_SESSION['shipmember']['Ville']), + array('i', $_SESSION['shipmember']['ID_Pays']), + array('s', $_SESSION['shipmember']['Telephone']), + array('s', Protection_mysql($_SESSION['shipmember']['Email'])), // On protège l'Email contre les injections car c'est lui qui va servir aux requetes tant qu'on n'a pas la Clé_primaire. + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + + // Mise à jour du nouveau mot de passe : + if ($flag_new_pwd) + { + $requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?'; + Requete_preparee_bdd($requete, + array( + array('s', password_hash(Protection_mysql($_POST['Mot_de_passe_1']), PASSWORD_DEFAULT)), + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + + $requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?'; + Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + // NB : on met à 0 le flag 'compte_a_activer' car il se peut qu'on soit là juste après la création (en accès temporaire). Dans ce cas, si on a mis à jour les mots de passe, + // il est inutile de demander ensuite une activation. + } + + // Mise à jour du libellé du pays : + $requete = 'SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=?) AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['ID_Pays']), + array('s', $_SESSION['langue'])), + __FILE__, __LINE__); + $donnees = Recherche_ligne_bdd($reponse); + $_SESSION['shipmember']['libelle_pays'] = $donnees['Libelle_pays']; + Liberation_jeu_de_resultat_bdd($reponse); + + // Mise à jour de l'email : + if ($flag_new_email) + { + //......................................................................... + // Préparation et envoi de l'email de modification d'adresse email : + $texte_email = t("

Bonjour,

+

L'adresse email associée à votre compte ShipMember vient d'être modifiée à votre demande :

+

Ancienne adresse : [[Old_email]]

Nouvelle adresse : [[New_email]]

+

Si vous n'êtes pas à l'origine de ce changement d'adresse, merci de contacter sans attendre l'administrateur du site à : [[Adresse_email_alertes]]

+

L'équipage ShipHeart

"); + + // Mise à jour des parametres du texte : + $texte_email = str_replace("[[Old_email]]", $old_email, $texte_email); + $texte_email = str_replace("[[New_email]]", $_SESSION['shipmember']['Email'], $texte_email); + $texte_email = str_replace("[[Adresse_email_alertes]]", $_SESSION['Config__Adresse_email_alertes'], $texte_email); + + Envoi_email('', $_SESSION['shipmember']['Email'], + t("Modifications de votre accès ShipMember"), + $texte_email, + "ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], ''); + //Fin......................................................................... + + } + + $_SESSION['Shipmembers']['page'] = "Profil"; + } + + } + + + + +//************************************************************************************************************************************ +// Traitement des données +//************************************************************************************************************************************ + + // Protection contre les accès directs... : + if (($_SESSION['Shipmembers']['page'] != "Login") AND + ($_SESSION['Shipmembers']['page'] != "Activation") AND + ($_SESSION['Shipmembers']['page'] != "Generation_mdp") AND + (!$_SESSION['acces_valide'])) { Fermeture_bdd(); header('Location:shipmembers.php?action=navigation&destination=Login'); exit(); } + + // $_SESSION['code_acces'] = $_GET['code_acces']; + // if (isset($_GET['code_acces']) && !isset($_SESSION['code_acces'])) $_SESSION['code_acces'] = $_GET['code_acces']; + + switch ($_SESSION['Shipmembers']['page']) + { + //**************************************************************************************************************************** + case "Login": + { + //--------------------------------------------------------------------- + // Saut à l'accueil sans login si on est déjà identifié : + if ($_SESSION['acces_valide']) { Fermeture_bdd(); header('Location:shipmembers.php?action=navigation&destination=Accueil'); exit(); } + + // Lien d'invitation ouvert sans être connecté : bandeau explicatif (synthèse §47) : + $invitation_login = null; + if (isset($_SESSION['code_acces']) && $_SESSION['code_acces'] != '') + { + $invitation_login = Invitation_par_code($_SESSION['code_acces']); + if ($invitation_login === null || $invitation_login['Statut'] != 'en_attente' || $invitation_login['Expiree']) + { + $message_erreur .= t("Cette invitation n'est plus valable (code inconnu, déjà utilisé, révoqué ou expiré)."); + $invitation_login = null; + $_SESSION['code_acces'] = ''; + } + } + //--------------------------------------------------------------------- + // Récupération des informations sur les pays : + $nb_pays = 0; + $requete = 'SELECT ID, ID AS Cle_primaire, Code_alpha2, Code_alpha3, (SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays ORDER BY Nom ASC'; + $reponse = Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['langue'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + $pays[$nb_pays ++] = $donnees; + } + Liberation_jeu_de_resultat_bdd($reponse); + + break; + } + + //**************************************************************************************************************************** + case "Activation": + { + //--------------------------------------------------------------------- + // Saut à l'accueil sans login si on est déjà identifié : + if ($_SESSION['acces_valide']) { Fermeture_bdd(); header('Location:shipmembers.php?action=navigation&destination=Accueil'); exit(); } + + break; + } + + //**************************************************************************************************************************** + case "Generation_mdp": + { + //--------------------------------------------------------------------- + // Saut à l'accueil sans login si on est déjà identifié : + if ($_SESSION['acces_valide']) { Fermeture_bdd(); header('Location:shipmembers.php?action=navigation&destination=Accueil'); exit(); } + + break; + } + + //**************************************************************************************************************************** + case "Accueil": + { + // Mise à jour des données du ShipMember (au cas où) : + $requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?'; + $reponse = Requete_preparee_bdd($requete, + array( + array('i', $_SESSION['shipmember']['Cle_primaire'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + $_SESSION['shipmember'] = $donnees; + } + Liberation_jeu_de_resultat_bdd($reponse); + + + + Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); // Accès actifs (synthèse §47) + + // Code d'invitation reçu par lien ou saisi (synthèse §47) : on explique ce qu'il en est, l'acceptation elle-même + // se fait par le bouton de la liste "Mes invitations" ci-dessous : + if (isset($_SESSION['code_acces']) && $_SESSION['code_acces'] != '') + { + $invitation_code = Invitation_par_code($_SESSION['code_acces']); + if ($invitation_code === null) $message_erreur .= t("Ce code d'invitation est inconnu."); + else if ($invitation_code['Statut'] != 'en_attente') $message_erreur .= t("Cette invitation a déjà été utilisée ou révoquée."); + else if ($invitation_code['Expiree']) $message_erreur .= t("Cette invitation a expiré : demandez-en une nouvelle à la personne qui vous l'a envoyée."); + else if (strtolower($invitation_code['Email_invite']) != strtolower($_SESSION['shipmember']['Email'])) + { + $message_erreur .= str_replace("[[Email]]", Masquer_email($invitation_code['Email_invite']), + t("Cette invitation est réservée à l'adresse [[Email]] : connectez-vous avec le compte ShipMember de cette adresse pour l'accepter.")); + } + else $message_information .= str_replace("[[Bateau]]", htmlspecialchars($invitation_code['Nom_bateau']), + t("Vous avez été invité(e) à accéder au bateau [[Bateau]] : acceptez ou refusez l'invitation ci-dessous.")); + $_SESSION['code_acces'] = ''; + } + + // Invitations en attente adressées à ce compte (seul un compte activé peut en accepter) : + $invitations = Compte_est_active($_SESSION['shipmember']['Cle_primaire']) ? Invitations_en_attente($_SESSION['shipmember']['Email']) : array(); + // $_SESSION['acces_valide'] = true; + + + break; + } + + + + + + //**************************************************************************************************************************** + case "Profil": + { + //--------------------------------------------------------------------- + // Récupération des informations sur les pays : + $nb_pays = 0; + $requete = 'SELECT ID, Code_alpha2, Code_alpha3, (SELECT Texte FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays WHERE ID=?'; + $reponse = Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['langue']), + array('i', $_SESSION['shipmember']['ID_Pays'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + $pays = $donnees; + } + Liberation_jeu_de_resultat_bdd($reponse); + + break; + } + + //**************************************************************************************************************************** + case "Modifier_profil": + { + + //--------------------------------------------------------------------- + // Récupération des informations sur les pays : + $nb_pays = 0; + $requete = 'SELECT ID, ID AS Cle_primaire, Code_alpha2, Code_alpha3, (SELECT Texte AS Libelle_pays FROM TB_Textes_traduction WHERE ID_TEXTES=ID_NOM AND ID_TYPE = 1 AND ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?)) AS Nom FROM TB_Pays ORDER BY Nom ASC'; + $reponse = Requete_preparee_bdd($requete, + array( + array('s', $_SESSION['langue'])), + __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) + { + $pays[$nb_pays ++] = $donnees; + } + Liberation_jeu_de_resultat_bdd($reponse); + + break; + } + + + //**************************************************************************************************************************** + case "Bateau": + { + // Bateaux accessibles : accès ACTIFS uniquement (synthèse §47). Le repli sur le bateau de démonstration + // (liens portant le code "0000") est retiré, comme le bateau 25 de bateaux.php - à reprendre plus tard. + Rafraichir_acces_session($_SESSION['shipmember']['Cle_primaire']); + $nb_bateaux = 0; + foreach ($_SESSION['bateau_shipmember'] as $acces) + { + $reponse = Requete_preparee_bdd('SELECT * FROM TB_Bateaux WHERE Cle_primaire=? AND Validite=1', + array(array('i', $acces['ID_Bateau'])), __FILE__, __LINE__); + while ($donnees = Recherche_ligne_bdd($reponse)) $bateaux[$nb_bateaux ++] = $donnees; + Liberation_jeu_de_resultat_bdd($reponse); + } + break; + } + + default: + { + $_SESSION['Shipmembers']['page'] = "Accueil"; + break; + } + } + + Fermeture_bdd(); // Déconnexion de MySQL + + +//************************************************************************************************************************************ +// Affichage +//************************************************************************************************************************************ + + Entete_page_html(); + + //******************************************************************************************************************************** + // Affichage principal : + echo '
'; + + echo '
'; // Permet de remonter au début de page par défaut + + //========================================================================================= + // Entête : + Entete_page($message_erreur, $message_information); + // if (isset($_SESSION['code_acces'])) echo $_SESSION['code_acces']; + switch ($_SESSION['Shipmembers']['page']) + { + //************************************************************************************************************************ + case "Login": + { + echo '
'; + + echo '

'.t("Connectez-vous").'

'; + + // Lien d'invitation ouvert sans être connecté (synthèse §47) : + if ($invitation_login !== null) + { + $texte = t("Vous avez été invité(e) à accéder au bateau [[Bateau]] ([[Type]]). Pour accepter cette invitation, connectez-vous - ou créez votre compte - avec l'adresse [[Email]]."); + $texte = str_replace("[[Bateau]]", ''.htmlspecialchars($invitation_login['Nom_bateau']).'', $texte); + $texte = str_replace("[[Type]]", htmlspecialchars((string)$invitation_login['Type_acces']), $texte); + $texte = str_replace("[[Email]]", ''.htmlspecialchars(Masquer_email($invitation_login['Email_invite'])).'', $texte); + echo '
'.$texte.'
'; + } + + echo '
'; + + //--------------------------------------------------------------------------- + // Déjà ShipMember : + echo ''; + + + //--------------------------------------------------------------------------- + // Nouveau ShipMember : + echo ''; + + echo '
'; + + break; + } + + + //************************************************************************************************************************ + case "Activation": + { + echo '
'; + + echo '

'.t("Mon espace ShipMember").'

'; + + echo '
'; + + echo '
'; + + echo '

'.t("Activation de mon compte").'

'; + + echo '
+

'.t("Votre compte n'a pas encore été activé. Pour cela, merci de changer votre mot de passe provisoire ci-dessous.").'

+
'; + + echo '
'; + + echo '
+
'.t("Prénom").'
+
'.$_SESSION['shipmember']['Prenom'].'
+
'; + + echo '
+
'.t("Nom").'
+
'.$_SESSION['shipmember']['Nom'].'
+
'; + + echo '
+
'.t("Email").'
+
'.$_SESSION['shipmember']['Email'].'
+
'; + + echo '
+
'.t("Nouveau mot de passe").'
+
+ +
+
'; + + echo '
+
'.t("Nouveau mot de passe (2)").'
+
+ +
+
'; + + echo '
'; + + echo '
+ +
'; + + echo '
'; + + echo '
'; + + echo '
'; + + break; + } + + //************************************************************************************************************************ + case "Generation_mdp": + { + echo '
'; + + echo '

'.t("Mon espace ShipMember").'

'; + + echo '
'; + + echo '
'; + + echo '

'.t("Générer un nouveau mot de passe provisoire").'

'; + + echo '
+

'.t("Renseignez votre adresse email puis confirmez votre demande.
Si votre adresse existe bien dans la liste des ShipMembers, un email vous sera adressé immédiatement avec un nouveau mot de passe provisoire.").'

+

'.t("Attention : dès validation, seul ce nouveau mot de passe provisoire sera valide pour vous connecter. Si vous n'avez pas reçu cet email dans les prochaines minutes, merci de vérifier s'il ne se trouve pas dans vos courriers indésirables. ").'

+
'; + + echo '
'; + + echo '
+
+ '.t("Email").'* +
+
+ +
+
'; + + echo '
'; + + echo '
+ +
'; + + echo '
'; + + echo '
'; + + echo '
'; + + break; + } + + + //************************************************************************************************************************ + case "Accueil": + { + echo '
'; + + echo '

'.t("Mon espace ShipMember").'

'; + + echo '
'; + + echo '
+

'.t("Bienvenue dans votre espace ShipMember !").'

+

'.t("Vous trouverez ici toutes les informations que nous conservons vous concernant. Notre objectif est de ne conserver que celles nécessaires au traitement de vos commandes et, surtout, vous permettant de profiter pleinement de toutes les fonctions de votre ShipHeart.").'

+

'.t("Enfin, nous vous rappelons que Koriolan ne diffuse et ne diffusera jamais la moindre de ces informations à d'autres sociétés. Pour plus de précisions sur le traitement de vos données personnelles, n'hésitez pas à consulter nos mentions légales accessibles en bas de cette page.").'

+
'; + + echo '
'; + + //--------------------------------------------------------------------------- + // Mes invitations (synthèse §47) : + echo '
'; + echo '

'.t("Mes invitations").'

'; + if (count($invitations) == 0) echo '

'.t("Aucune invitation en attente.").'

'; + foreach ($invitations as $invitation) + { + $texte = t("Bateau [[Bateau]] - accès [[Type]], proposé par [[Invitant]] (valable jusqu'au [[Date]])."); + $texte = str_replace("[[Bateau]]", ''.htmlspecialchars($invitation['Nom_bateau']).'', $texte); + $texte = str_replace("[[Type]]", htmlspecialchars((string)$invitation['Type_acces']), $texte); + $texte = str_replace("[[Invitant]]", htmlspecialchars(trim($invitation['Prenom_invitant'].' '.$invitation['Nom_invitant'])), $texte); + $texte = str_replace("[[Date]]", date_format(date_create($invitation['Expiration_invitation']), 'd/m/Y'), $texte); + echo '
'; + echo '

'.$texte.'

'; + echo ' '; + echo ''; + echo '
'; + } + // Saisie manuelle d'un code (invitation papier, sans appareil photo) : + echo '
'; + echo ' '; + echo ' '; + echo ''; + echo '
'; + echo '
'; + + echo '
'; + echo ' + '.t("Mes informations").' + '; + + echo ' + '.t("Mon bateau").' + '; + + echo ' + '.t("Déconnexion").' + '; + + // Accès au menu d'administration : + // if (isset($_SESSION['shipmember']['Niveau_administration']) && $_SESSION['shipmember']['Niveau_administration'] != '') + if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR) + { + echo ' + Administration + '; + } + + echo '
'; + + echo ''; + + break; + } + + + + + + //************************************************************************************************************************ + case "Profil": + { + echo '
'; + + echo '

'.t("Mon espace ShipMember").'

'; + + echo '
'; + + //--------------------------------------------------------------------------- + // Profil ShipMember : + echo '
'; + + echo '

'.t("Mes informations").'

'; + + /* echo '
+
+ '.t("Numéro de ShipMember").' +
+
+ '.$_SESSION['shipmember']['Cle_primaire'].' +
+
'; */ + + echo '
+
+ '.t("Prénom").' +
+
+ '.$_SESSION['shipmember']['Prenom'].' +
+
'; + + echo '
+
+ '.t("Nom").' +
+
+ '.$_SESSION['shipmember']['Nom'].' +
+
'; + + echo '
+
+ '.t("Entreprise").' +
+
+ '.$_SESSION['shipmember']['Entreprise'].' +
+
'; + + echo '
+
+ '.t("Numéro et rue").' +
+
+ '.$_SESSION['shipmember']['Rue'].' +
+
'; + + echo '
+
+ '.t("Code postal").' +
+
+ '.$_SESSION['shipmember']['Code_postal'].' +
+
'; + + echo '
+
+ '.t("Ville").' +
+
+ '.$_SESSION['shipmember']['Ville'].' +
+
'; + + echo '
+
+ '.t("Pays").' +
+
+ '.$pays['Nom'].' +
+
'; + + echo '
+
+ '.t("Téléphone").' +
+
+ '.$_SESSION['shipmember']['Telephone'].' +
+
'; + + echo '
+
+ '.t("Email").' +
+
+ '.$_SESSION['shipmember']['Email'].' +
+
'; + + echo '
'; + + + echo '
'; + echo ' + '.t("Modifier").' + '; + + echo ' + '.t("Retour").' + '; + echo '
'; + + echo '
'; + + break; + } + + //************************************************************************************************************************ + case "Modifier_profil": + { + echo '
'; + + echo '

'.t("Modifier mes informations").'

'; + + echo '
'; + + //--------------------------------------------------------------------------- + // Profil ShipMember : + echo '
'; + + echo '

'.t("Modifier mes informations").'

'; + + echo '
+
+ '.t("Prénom").'* +
+
+ +
+
'; + + echo '
+
+ '.t("Nom").'* +
+
+ +
+
'; + + echo '
+
+ '.t("Entreprise").' +
+
+ +
+
'; + + echo '
+
+ '.t("Numéro et rue").' +
+
+ +
+
'; + + echo '
+
+ '.t("Code postal").' +
+
+ +
+
'; + + echo '
+
+ '.t("Ville").' +
+
+ +
+
'; + + echo '
+
+ '.t("Pays").' +
+
+ +
+
'; + + echo '
+
+ '.t("Téléphone").' +
+
+ +
+
'; + + echo '
+
+ '.t("Email").'* +
+
+ +
+
'; + + + // Modification MDP : + echo '
+

'.t("Si vous souhaitez modifier votre mot de passe, entrez votre nouveau mot de passe deux fois ci-dessous. Sinon, laissez ces deux champs vides.").'

+
'; + + echo '
+
'.t("Nouveau mot de passe").'
+
+ +
+
'; + + echo '
+
'.t("Nouveau mot de passe (2)").'
+
+ +
+
'; + + + echo '
'; + + echo '
'; + echo ''; + + echo ' + '.t("Annuler").' + '; + echo '
'; + + echo '
'; + + break; + } + + + //************************************************************************************************************************ + case "Bateau": + { + echo '
'; + + echo '

'.t("Mon espace ShipMember").'

'; + + echo '
'; + + echo '
'; + + if ($nb_bateaux > 1) echo '

'.t("Accès à mes bateaux").'

'; + else echo '

'.t("Accès à mon bateau").'

'; + + if ($nb_bateaux == 0) // Si aucun bateau n'est configuré pour ce ShipMember : + { + echo '
+

'.t("Vous n'avez pas encore de ShipHeart activé.").'

+

'.t("Mais dès que ce sera le cas, vous trouverez ici l'accès à votre ou vos bateaux.").'

+

'.t("Pour chacun d'eux, vous visualiserez l'état de tous les circuits, leur consommation, le niveau des réservoirs et des batteries, mais aussi toutes les valeurs de vos capteurs : températures, pression atmosphérique, humidité, position géographique, etc...
Vous aurez également accès aux courbes historiques de toutes ces valeurs.").'

+

'.t("C'est également ici que vous pourrez créer des profils [Propriétaire], [Installateur] ou [Skipper] afin de donner accès de façon contrôlée à votre ou à vos bateaux. Sans aucune limite !").'

+
'; + } + else // Si au moins un bateau est configuré pour ce ShipMember + { + for ($i=0; $i<$nb_bateaux; $i ++) + { + + echo ' + '.$bateaux[$i]['Nom'].' + '; + + } + } + + echo '
'; + + echo '
'; + echo ' + '.t("Retour").' + '; + echo '
'; + + echo '
'; + + break; + } + + + } + + + echo '
'; + + echo '
'; + + + //******************************************************************************************************************************** + // Menu de pieds de page : +Pied_de_page(); diff --git a/sql/duree_validite_invitation.sql b/sql/duree_validite_invitation.sql new file mode 100644 index 0000000..86e3031 --- /dev/null +++ b/sql/duree_validite_invitation.sql @@ -0,0 +1,4 @@ +-- Durée de validité (jours) d'une invitation à accéder à un bateau (synthèse §47) +INSERT INTO TB_Configuration (Validite, Nom, Description, Valeur) +VALUES (1, 'Duree_validite_invitation', + 'Nombre de jours pendant lesquels une invitation à accéder à un bateau peut être acceptée', '30'); diff --git a/sql/lien_bateau_shipmember_2_suppression.sql b/sql/lien_bateau_shipmember_2_suppression.sql new file mode 100644 index 0000000..f5b7256 --- /dev/null +++ b/sql/lien_bateau_shipmember_2_suppression.sql @@ -0,0 +1,12 @@ +-- ============================================================================ +-- TB_Lien_bateau_shipmember - refonte, PARTIE 2/2 : suppression des +-- anciennes colonnes (synthèse §47). À exécuter UNIQUEMENT après le +-- déploiement du code PHP utilisant Statut (bateaux.php, shipmembers.php, +-- administration.php) : l'ancien code échouerait sur ces colonnes absentes. +-- ============================================================================ +ALTER TABLE TB_Lien_bateau_shipmember + DROP COLUMN Validite, + DROP COLUMN Validite_acces, + DROP COLUMN Niveau_acces_OLD; + +SHOW CREATE TABLE TB_Lien_bateau_shipmember;