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.'); } } } }
// //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'basculer' && $user_id) { // Par sécurité et pour actualiser une éventuelle liaison (dé)faite depuis un autre compte, on ne stocke en session que l'identifiant de la clef des associations // La méthode appelée ci-dessous effectue de multiples vérifications complémentaires list($_SESSION['USER_SWITCH_ID'], $user_liste) = DB_STRUCTURE_SWITCH::DB_recuperer_et_verifier_listing_comptes_associes($_SESSION['USER_ID'], $_SESSION['USER_SWITCH_ID']); if (!$_SESSION['USER_SWITCH_ID']) { exit_json(FALSE, 'Aucune liaison de compte vous concernant n\'a été trouvée !'); } $tab_user = explode(',', $user_liste); if (!in_array($user_id, $tab_user)) { exit_json(FALSE, 'Le compte indiqué n\'est pas relié au votre !'); } // C'est ok $auth_DB_ROW = DB_STRUCTURE_PUBLIC::DB_recuperer_donnees_utilisateur('switch', $user_id); $BASE = $_SESSION['BASE']; Session::close__open_new__init(FALSE); SessionUser::initialiser_utilisateur($BASE, $auth_DB_ROW); exit_json(TRUE); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Ajouter une liaison // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'ajouter' && $login != '' && $password != '') { // initialisation $auth_resultat = 'Erreur avec les données transmises !'; // Protection contre les attaques par force brute (laissé même pour cette page requiérant une authentification car la réponse en cas d'erreur de mdp y fait référence) if (!isset($_SESSION['FORCEBRUTE'][$PAGE])) { exit_json(FALSE, 'Session perdue ou absence de cookie : merci d\'actualiser la page.'); } else { if ($_SERVER['REQUEST_TIME'] - $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] < $_SESSION['FORCEBRUTE'][$PAGE]['DELAI']) { $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] = $_SERVER['REQUEST_TIME'];
// Par sécurité et pour actualiser une éventuelle liaison (dé)faite depuis un autre compte, on ne stocke en session que l'identifiant de la clef des associations // La méthode appelée ci-dessous effectue de multiples vérifications complémentaires list( $_SESSION['USER_SWITCH_ID'] , $user_liste ) = DB_STRUCTURE_SWITCH::DB_recuperer_et_verifier_listing_comptes_associes( $_SESSION['USER_ID'] , $_SESSION['USER_SWITCH_ID'] ); if(!$_SESSION['USER_SWITCH_ID']) { exit_json( FALSE , 'Aucune liaison de compte vous concernant n\'a été trouvée !' ); } $tab_user = explode(',',$user_liste); if( !in_array( $user_id , $tab_user ) ) { exit_json( FALSE , 'Le compte indiqué n\'est pas relié au votre !' ); } // C'est ok $auth_DB_ROW = DB_STRUCTURE_PUBLIC::DB_recuperer_donnees_utilisateur( 'switch' ,$user_id ); $BASE = $_SESSION['BASE']; Session::close__open_new__init( FALSE /*memo_GET*/ ); SessionUser::initialiser_utilisateur($BASE,$auth_DB_ROW); exit_json( TRUE ); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Ajouter une liaison // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='ajouter') && ($login!='') && ($password!='') ) { // initialisation $auth_resultat = 'Erreur avec les données transmises !'; // Protection contre les attaques par force brute (laissé même pour cette page requiérant une authentification car la réponse en cas d'erreur de mdp y fait référence) if(!isset($_SESSION['FORCEBRUTE'][$PAGE])) {