/** * Test si l'accès est bloqué sur demande du webmestre ou d'un administrateur (maintenance, sauvegarde/restauration, ...). * Si tel est le cas, alors exit(). * * Fonction isolée dans ce fichier car il est chargé parmi les premiers. * * Nécessite que la session soit ouverte. * Appelé depuis les pages index.php + ajax.php + lors d'une demande d'identification d'un utilisateur (sauf webmestre) * * En cas de blocage demandé par le webmestre, on ne laisse l'accès que : * - pour le webmestre déjà identifié * - pour la partie publique, si pas une demande d'identification, sauf demande webmestre * * En cas de blocage demandé par un administrateur ou par l'automate (sauvegarde/restauration) pour un établissement donné, on ne laisse l'accès que : * - pour le webmestre déjà identifié * - pour un administrateur déjà identifié * - pour la partie publique, si pas une demande d'identification, sauf demande webmestre ou administrateur * * @param string $BASE car $_SESSION['BASE'] non encore renseigné si demande d'identification * @param string $demande_connexion_profil false si appel depuis index.php ou ajax.php, le profil si demande d'identification * @return void | exit ! */ function tester_blocage_application($BASE,$demande_connexion_profil) { // Blocage demandé par le webmestre pour tous les établissements (multi-structures) ou pour l'établissement (mono-structure). $fichier_blocage = CHEMIN_CONFIG.'blocage_webmestre_0.txt'; if( (is_file($fichier_blocage)) && ($_SESSION['USER_PROFIL']!='webmestre') && (($_SESSION['USER_PROFIL']!='public')||($demande_connexion_profil!=false)) ) { affich_message_exit($titre='Blocage par le webmestre',$contenu='Blocage par le webmestre - '.file_get_contents($fichier_blocage) ); } // Blocage demandé par le webmestre pour un établissement donné (multi-structures). $fichier_blocage = CHEMIN_CONFIG.'blocage_webmestre_'.$BASE.'.txt'; if( (is_file($fichier_blocage)) && ($_SESSION['USER_PROFIL']!='webmestre') && (($_SESSION['USER_PROFIL']!='public')||($demande_connexion_profil!=false)) ) { affich_message_exit($titre='Blocage par le webmestre',$contenu='Blocage par le webmestre - '.file_get_contents($fichier_blocage) ); } // Blocage demandé par un administrateur pour son établissement. $fichier_blocage = CHEMIN_CONFIG.'blocage_administrateur_'.$BASE.'.txt'; if( (is_file($fichier_blocage)) && (!in_array($_SESSION['USER_PROFIL'],array('webmestre','administrateur'))) && (($_SESSION['USER_PROFIL']!='public')||(!in_array($demande_connexion_profil,array(FALSE,'webmestre','administrateur')))) ) { affich_message_exit($titre='Blocage par un administrateur',$contenu='Blocage par un administrateur - '.file_get_contents($fichier_blocage) ); } // Blocage demandé par l'automate pour un établissement donné. $fichier_blocage = CHEMIN_CONFIG.'blocage_automate_'.$BASE.'.txt'; if( (is_file($fichier_blocage)) && (!in_array($_SESSION['USER_PROFIL'],array('webmestre','administrateur'))) && (($_SESSION['USER_PROFIL']!='public')||(!in_array($demande_connexion_profil,array(FALSE,'webmestre','administrateur')))) ) { // Au cas où une procédure de sauvegarde / restauration / nettoyage / tranfert échouerait, un fichier de blocage automatique pourrait être créé et ne pas être effacé. // Pour cette raison on teste une durée de vie anormalement longue d'une tel fichier de blocage (puisqu'il ne devrait être que temporaire). if( time() - filemtime($fichier_blocage) < 5*60 ) { affich_message_exit($titre='Blocage automatique',$contenu='Blocage automatique - '.file_get_contents($fichier_blocage) ); } else { // La fonction debloquer_application sera lancée plus tard car elle requiert des fichiers pas encore chargés. $_SESSION['blocage_anormal'] = TRUE; } } }
function rapporter_erreur_fatale() { $tab_last_error = error_get_last(); // tableau à 4 indices : type ; message ; file ; line if( ($tab_last_error!==NULL) && ($tab_last_error['type']===E_ERROR) && (substr($tab_last_error['message'],0,19)=='Allowed memory size') ) { affich_message_exit($titre='Mémoire insuffisante',$contenu='Mémoire de '.ini_get('memory_limit').' insuffisante ; sélectionner moins d\'élèves à la fois ou demander à votre hébergeur d\'augmenter la valeur "memory_limit".'); } }
// Gestion du single sign-out phpCAS::handleLogoutRequests(false); // Demander à CAS d'aller interroger le serveur // Cette méthode permet de forcer CAS à demander au client de s'authentifier s'il ne trouve aucun client d'authentifié. // (redirige vers le serveur d'authentification si aucun utilisateur authentifié n'a été trouvé par le client CAS) phpCAS::forceAuthentication(); // Rapatrier les informations si elles sont validées par CAS (qui envoie alors un ticket en GET) $auth = phpCAS::checkAuthentication(); // Récupérer l'identifiant (login ou numéro interne...) de l'utilisateur authentifié pour le traiter dans l'application $login = phpCAS::getUser(); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Comparer avec les données de la base // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $connexion = connecter_user($BASE,$login,$password=false,$mode_connection='cas'); // Marqueur pour inviter à la déconnexion de l'ENT ultérieurement. $_SESSION['ALERTE_SSO'] = TRUE; if($connexion=='ok') { // Redirection vers l'espace en cas de succès alert_redirection_exit($texte_alert='',$adresse='index.php?page=compte_accueil&verif_cookie'); } else { // Affichage d'un message d'erreur en cas d'échec affich_message_exit($titre='Compte inaccessible.',$contenu=$connexion); } ?>
function gestion_session($TAB_PROFILS_AUTORISES) { if(!isset($_COOKIE[SESSION_NOM])) { // 1. Aucune session transmise open_new_session(); init_session(); if(!$TAB_PROFILS_AUTORISES['public']) { // 1.1. Demande d'accès à une page réservée, donc besoin d'identification if(isset($_GET['verif_cookie'])) { // 1.1.1. En fait l'utilisateur vient déjà de s'identifier : c'est donc anormal, le cookie de session n'a pas été trouvé car le navigateur client n'enregistre pas les cookies affich_message_exit($titre='Problème de cookies',$contenu='Session non retrouvée !<br />Configurez votre navigateur pour qu\'il accepte les cookies.'); } else { // 1.1.2. Session perdue ou expirée, ou demande d'accès direct (lien profond) : redirection pour une nouvelle identification redirection_SSO_ou_message_exit(); // 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 open_old_session(); if(!isset($_SESSION['USER_PROFIL'])) { // 2.1. Pas de session retrouvée (sinon cette variable serait renseignée) if(!$TAB_PROFILS_AUTORISES['public']) { // 2.1.1. Session perdue ou expirée et demande d'accès à une page réservée : redirection pour une nouvelle identification close_session(); open_new_session(); init_session(); redirection_SSO_ou_message_exit(); // 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 perdue close_session();open_new_session();init_session(); } } elseif($_SESSION['USER_PROFIL'] == 'public') { // 2.2. Session retrouvée, utilisateur non identifié if(!$TAB_PROFILS_AUTORISES['public']) { // 2.2.1. Espace non identifié => Espace identifié : redirection pour identification redirection_SSO_ou_message_exit(); // Pas d'initialisation de session sinon la redirection avec le SSO tourne en boucle. } else { // 2.2.2. Espace non identifié => Espace non identifié : RAS } } else { // 2.3. Session retrouvée, utilisateur identifié if($TAB_PROFILS_AUTORISES[$_SESSION['USER_PROFIL']]) { // 2.3.1. Espace identifié => Espace identifié identique : RAS } elseif($TAB_PROFILS_AUTORISES['public']) { // 2.3.2. Espace identifié => Espace non identifié : création d'une nouvelle session vierge, pas de message d'alerte pour indiquer que la session 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 la 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 close_session();open_new_session();init_session(); if($SimpleSAMLphp_SESSION) { $_SESSION['SimpleSAMLphp_SESSION'] = $SimpleSAMLphp_SESSION; } } elseif(!$TAB_PROFILS_AUTORISES['public']) // (forcément) { // 2.3.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). affich_message_exit($titre='Page interdite avec votre profil',$contenu='Vous avez appelé une page inaccessible avec votre identification actuelle !<br />Déconnectez-vous ou retournez à la page précédente.'); } } } }
$pass = $tab_matches[0]; // mysql_query('CREATE USER '.$user.'@"'.$host.'" IDENTIFIED BY "'.$pass.'"'); // mysql_query('GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$base.'.* TO '.$user.'@"'.$host.'"'); echo'CREATE USER '.$user.'@"'.$host.'" IDENTIFIED BY "'.$pass.'"'.'<br />'; echo'GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$base.'.* TO '.$user.'@"'.$host.'"'.'<br />'; } } } mysql_close($BDlink); } } // FIN A compter du 05/12/2010, 2 users MySQL sont créés par établissement (localhost & %) ; il faut créer les manquants antérieurs sinon erreur lors de la suppression. [à retirer dans quelques mois] } elseif($PAGE!='public_installation') { affich_message_exit($titre='Informations hébergement manquantes',$contenu='Informations concernant l\'hébergeur manquantes.<br /><a href="./index.php?page=public_installation">Procédure d\'installation du site SACoche.</a>'); } ob_start(); // Chargement de la page concernée $filename_php = './pages/'.$PAGE.'.php'; if(!is_file($filename_php)) { $tab_messages_erreur[] = 'Erreur : page "'.$filename_php.'" manquante (supprimée, déplacée, non créée...).'; $PAGE = ($_SESSION['USER_PROFIL']=='public') ? 'public_accueil' :'compte_accueil' ; $filename_php = './pages/'.$PAGE.'.php'; } require($filename_php); // Affichage dans une variable $CONTENU_PAGE = ob_get_contents(); ob_end_clean();