public static function execute() { if(!isset($_COOKIE[SESSION_NOM])) { // 1. Aucune session transmise Session::open_new(); Session::init(); if(!Session::$tab_droits_page['public']) { // 1.1. Demande d'accès à une page réservée (donc besoin d'identification) : session perdue / expirée, ou demande d'accès direct (lien profond) -> redirection pour une nouvelle identification $_SESSION['MEMO_GET'] = $_GET ; // On mémorise $_GET pour un lien profond hors SSO, mais pas d'initialisation de session sinon la redirection avec le SSO tourne en boucle. Session::exit_sauf_SSO('Session absente / perdue / expirée / incompatible.'); // Si SSO au prochain coup on ne passera plus par là. } else { // 1.2 Accès à une page publique : RAS } } else { // 2. id de session transmis Session::open_old(); if(!isset($_SESSION['USER_PROFIL_SIGLE'])) { // 2.1. Pas de session retrouvée (sinon cette variable serait renseignée) if(!Session::$tab_droits_page['public']) { // 2.1.1. Session perdue ou expirée et demande d'accès à une page réservée : redirection pour une nouvelle identification Session::close__open_new__init( TRUE /*memo_GET*/ ); Session::exit_sauf_SSO('Session absente / perdue / expirée / incompatible.'); // On peut initialiser la session avant car si SSO au prochain coup on ne passera plus par là. } else { // 2.1.2. Session perdue ou expirée et page publique : création d'une nouvelle session, pas de message d'alerte pour indiquer que la session est perdue Session::close__open_new__init( TRUE /*memo_GET*/ ); } } elseif($_SESSION['USER_PROFIL_SIGLE'] == 'OUT') { // 2.2. Session retrouvée, utilisateur non identifié if(!Session::$tab_droits_page['public']) { // 2.2.1. Espace non identifié => Espace identifié : redirection pour identification $_SESSION['MEMO_GET'] = $_GET ; // On mémorise $_GET pour un lien profond hors SSO, mais pas d'initialisation de session sinon la redirection avec le SSO tourne en boucle. Session::exit_sauf_SSO('Authentification manquante ou perdue (onglets incompatibles ouverts ?).'); } else { // 2.2.2. Espace non identifié => Espace non identifié : RAS } } // On ne teste un vol de session que pour les utilisateurs identifiés car un établissement peut paramétrer d'éviter cette vérification elseif( $tab_info_pb = Session::TestAnomalieSession() ) { // 2.3. Session retrouvée, mais pb détecté (IP changée, navigateur différent) list( $msg_pb , $avant , $apres ) = $tab_info_pb; // Enregistrement du détail $fichier_nom = 'session_anomalie_'.$_SESSION['BASE'].'_'.$_SESSION['SESSION_ID'].'.txt'; $fichier_contenu = 'Appel anormal : '.$msg_pb.'.'."\r\n\r\n".'Avant : '.$avant."\r\n".'Après : '.$apres."\r\n"; FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fichier_nom , $fichier_contenu ); // Game over Session::close__open_new__init( TRUE /*memo_GET*/ ); Session::exit_sauf_SSO('Appel anormal : '.$msg_pb.' (<a href="'.URL_DIR_EXPORT.$fichier_nom.'" target="_blank">détail</a>).'); } else { // 2.4. Session retrouvée, utilisateur identifié if(Session::$tab_droits_page[$_SESSION['USER_PROFIL_TYPE']]) { // 2.4.1. Espace identifié => Espace identifié identique : RAS } elseif(Session::$tab_droits_page['public']) { // 2.4.2. Espace identifié => Espace non identifié : création d'une nouvelle session vierge, pas de message d'alerte pour indiquer que la session est perdue // A un moment il fallait tester que ce n'était pas un appel ajax, pour éviter une déconnexion si appel au calendrier qui était dans l'espace public, mais ce n'est plus le cas... // Par contre il faut conserver la session de SimpleSAMLphp pour laisser à l'utilisateur le choix de se déconnecter ou non de son SSO. $SimpleSAMLphp_SESSION = ( ($_SESSION['CONNEXION_MODE']=='gepi') && (isset($_SESSION['SimpleSAMLphp_SESSION'])) ) ? $_SESSION['SimpleSAMLphp_SESSION'] : FALSE ; // isset() pour le cas où l'admin vient de cocher le mode Gepi mais c'est connecté sans juste avant Session::close__open_new__init( FALSE /*memo_GET*/ ); if($SimpleSAMLphp_SESSION) { $_SESSION['SimpleSAMLphp_SESSION'] = $SimpleSAMLphp_SESSION; } } elseif(!Session::$tab_droits_page['public']) // (forcément) { // 2.4.3. Espace identifié => Autre espace identifié incompatible : redirection pour une nouvelle identification // Pas de redirection SSO sinon on tourne en boucle (il faudrait faire une déconnexion SSO préalable). Session::close__open_new__init( FALSE /*memo_GET*/ ); // FALSE car sinon on peut tourner en boucle (toujours redirigé vers une page qui ne correspond pas au profil utilisé) Session::exit_sauf_SSO('Appel incompatible avec votre identification actuelle.'); } } } }