Beispiel #1
0
$tab_parametres = array(
  '"connexion_departement"',
  '"connexion_mode"',
  '"connexion_nom"',
  '"cas_serveur_host"',
  '"cas_serveur_port"',
  '"cas_serveur_root"',
  '"cas_serveur_url_login"',
  '"cas_serveur_url_logout"',
  '"cas_serveur_url_validate"',
  '"cas_serveur_verif_certif_ssl"',
  '"gepi_url"',
  '"gepi_rne"',
  '"gepi_certificat_empreinte"',
);
$DB_TAB = DB_STRUCTURE_PUBLIC::DB_lister_parametres( implode(',',$tab_parametres) );
foreach($DB_TAB as $DB_ROW)
{
  ${$DB_ROW['parametre_nom']} = $DB_ROW['parametre_valeur'];
}
if($connexion_mode=='normal')
{
  exit_error( 'Configuration manquante' /*titre*/ , 'Etablissement non paramétré par l\'administrateur pour utiliser un service d\'authentification externe.<br />Un administrateur doit renseigner cette configuration dans le menu [Paramétrages][Mode&nbsp;d\'identification].' /*contenu*/ );
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Identification avec le protocole CAS
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if($connexion_mode=='cas')
{
Beispiel #2
0
    $BASE = isset($_GET['uai']) ? DB_WEBMESTRE_PUBLIC::DB_recuperer_structure_id_base_for_UAI(Clean::uai($_GET['uai'])) : $BASE;
    if (!$BASE) {
        if (isset($_GET['uai'])) {
            exit_error('Paramètre incorrect', 'Le numéro UAI transmis n\'est pas référencé sur cette installation de SACoche : vérifiez son exactitude et si cet établissement est bien inscrit sur ce serveur.');
        } else {
            exit_error('Donnée manquante', 'Référence de base manquante (le paramètre "base" ou "id" n\'a pas été transmis en GET ou n\'est pas un entier et n\'a pas non plus été trouvé dans un Cookie).');
        }
    }
    charger_parametres_mysql_supplementaires($BASE);
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Connexion à la base pour charger les paramètres du SSO demandé
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Mettre à jour la base si nécessaire
maj_base_structure_si_besoin($BASE);
$DB_TAB = DB_STRUCTURE_PUBLIC::DB_lister_parametres('"connexion_mode","cas_serveur_host","cas_serveur_port","cas_serveur_root","cas_serveur_url_login","cas_serveur_url_logout","cas_serveur_url_validate","gepi_url","gepi_rne","gepi_certificat_empreinte"');
// A compléter
foreach ($DB_TAB as $DB_ROW) {
    ${$DB_ROW['parametre_nom']} = $DB_ROW['parametre_valeur'];
}
if ($connexion_mode == 'normal') {
    exit_error('Configuration manquante', 'Etablissement non paramétré par l\'administrateur pour utiliser un service d\'authentification externe.<br />Un administrateur doit renseigner cette configuration dans le menu [Paramétrages][Mode&nbsp;d\'identification].');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Déconnexion avec le protocole CAS
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($connexion_mode == 'cas') {
    // Pour tester, cette méthode statique créé un fichier de log sur ce qui se passe avec CAS
    if (DEBUG_PHPCAS) {
        if (HEBERGEUR_INSTALLATION == 'mono-structure' || !PHPCAS_ETABL_ID_LISTING || strpos(PHPCAS_ETABL_ID_LISTING, ',' . $BASE . ',') !== FALSE) {
            $fichier_nom_debut = 'debugcas_' . $BASE;
Beispiel #3
0
    if (!$result) {
        exit_error($TITRE, 'Le code transmis est invalide ou périmé (base inexistante).');
    }
}
// Récupération des données de l'utilisateur
$DB_ROW = DB_STRUCTURE_PUBLIC::DB_recuperer_user_for_new_mdp('user_pass_key', $user_pass_key);
if (empty($DB_ROW)) {
    exit_error($TITRE, 'Le code transmis est invalide ou périmé (absence de correspondance).');
}
if (crypter_mdp($DB_ROW['user_id'] . $DB_ROW['user_email'] . $DB_ROW['user_password'] . $DB_ROW['user_connexion_date']) != $user_pass_key) {
    exit_error($TITRE, 'Le code transmis est périmé (incompatible avec les données actuelles).');
}
// Prendre en compte la demande de changement de mdp
$newpass = fabriquer_mdp();
// On ne transmet pas de profil car necessite sinon une variable de session non définie à ce stade.
DB_STRUCTURE_PUBLIC::DB_modifier_user_password_or_key($DB_ROW['user_id'], crypter_mdp($newpass), '');
// Affichage du résultat (confirmation + identifiants)
?>
<p><label class="valide">Nouveau mot de passe généré avec succès !</label></p>
<p>Veuillez noter vos identifiants de connexion :</p>
<form>
  <label class="tab">Nom d'utilisateur :</label><b><?php 
echo html($DB_ROW['user_login']);
?>
</b><br />
  <label class="tab">Mot de passe :</label><b><?php 
echo $newpass;
?>
</b>
</form>
<p><span class="astuce">Le code transmis étant à usage unique, il ne peut pas être utilisé de nouveau.</span></p>
    $DB_ROW = DB_STRUCTURE_PUBLIC::DB_recuperer_user_for_new_mdp('user_id', $user_id);
    if (empty($DB_ROW)) {
        $_SESSION['FORCEBRUTE'][$PAGE]['DELAI']++;
        $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] = $_SERVER['REQUEST_TIME'];
        exit_json(FALSE, 'Utilisateur inconnu ! Nouvelle tentative autorisée dans ' . $_SESSION['FORCEBRUTE'][$PAGE]['DELAI'] . 's.');
    }
    // On vérifie que l'adresse mail concorde
    if ($DB_ROW['user_email'] != $courriel) {
        $_SESSION['FORCEBRUTE'][$PAGE]['DELAI']++;
        $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] = $_SERVER['REQUEST_TIME'];
        exit_json(FALSE, 'Adresse mail non concordante ! Nouvelle tentative autorisée dans ' . $_SESSION['FORCEBRUTE'][$PAGE]['DELAI'] . 's.');
    }
    // On enregistre un ticket pour cette demande
    $user_pass_key = crypter_mdp($DB_ROW['user_id'] . $DB_ROW['user_email'] . $DB_ROW['user_password'] . $DB_ROW['user_connexion_date']);
    $code_mdp = $BASE ? $user_pass_key . 'g' . $BASE : $user_pass_key;
    DB_STRUCTURE_PUBLIC::DB_modifier_user_password_or_key($DB_ROW['user_id'], '', $user_pass_key);
    // On envoi le courriel à l'utilisateur
    $mail_contenu = 'Bonjour,' . "\r\n";
    $mail_contenu .= "\r\n";
    $mail_contenu .= 'Une demande de nouveaux identifiants a été formulée pour le compte SACoche de ' . $DB_ROW['user_prenom'] . ' ' . $DB_ROW['user_nom'] . '.' . "\r\n";
    $mail_contenu .= "\r\n";
    $mail_contenu .= 'Pour confirmer la génération d\'un nouveau mot de passe, veuillez cliquer sur ce lien :' . "\r\n";
    $mail_contenu .= URL_DIR_SACOCHE . '?code_mdp=' . $code_mdp . "\r\n";
    $mail_contenu .= Sesamail::texte_pied_courriel(array('excuses_derangement', 'info_connexion', 'no_reply', 'signature'), $DB_ROW['user_email']);
    $courriel_bilan = Sesamail::mail($DB_ROW['user_email'], 'Demande de nouveaux identifiants', $mail_contenu, $DB_ROW['user_email']);
    if (!$courriel_bilan) {
        exit_json(FALSE, 'Erreur lors de l\'envoi du courriel !');
    }
    // OK !
    exit_json(TRUE);
}
    exit_json(TRUE, afficher_formulaire_etablissement($BASE, $profil));
}
// Charger le formulaire pour un établissement donné (installation multi-structures)
if ($action == 'initialiser' && $BASE > 0 && HEBERGEUR_INSTALLATION == 'multi-structures' || $action == 'charger' && $profil) {
    // Une première requête sur SACOCHE_WEBMESTRE_BD_NAME pour vérifier que la structure est référencée
    $structure_denomination = DB_WEBMESTRE_PUBLIC::DB_recuperer_structure_nom_for_Id($BASE);
    if ($structure_denomination === NULL) {
        // Sans doute un établissement supprimé, mais le cookie est encore là
        Cookie::effacer(COOKIE_STRUCTURE);
        exit_json(FALSE, 'Établissement non trouvé dans la base d\'administration !');
    }
    // Mettre à jour la base si nécessaire
    charger_parametres_mysql_supplementaires($BASE);
    maj_base_structure_si_besoin($BASE);
    // Une deuxième requête sur SACOCHE_STRUCTURE_BD_NAME pour savoir si le mode de connexion est SSO ou pas
    $DB_TAB = DB_STRUCTURE_PUBLIC::DB_lister_parametres('"connexion_mode","connexion_nom"');
    foreach ($DB_TAB as $DB_ROW) {
        ${$DB_ROW['parametre_nom']} = $DB_ROW['parametre_valeur'];
    }
    if (isset($connexion_mode, $connexion_nom) == FALSE) {
        exit_json(FALSE, 'Base de l\'établissement incomplète !');
    }
    exit_json(TRUE, afficher_nom_etablissement($BASE, $structure_denomination) . afficher_formulaire_identification($profil, $connexion_mode, $connexion_nom));
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Traiter une demande d'identification
// ////////////////////////////////////////////////////////////////////////////////////////////////////
function adresse_redirection_apres_authentification()
{
    if (empty($_SESSION['MEMO_GET']) || !isset($_SESSION['MEMO_GET']['page'])) {
        $_SESSION['MEMO_GET']['page'] = 'compte_accueil';
    exit_error('Information manquante', 'Profil incorrect ou non transmis dans l\'adresse.');
}
// Récupération du numéro de base
$BASE = isset($_GET['base']) ? Clean::entier($_GET['base']) : 0;
if ($PROFIL == 'structure' && HEBERGEUR_INSTALLATION == 'multi-structures' && !$BASE) {
    exit_error('Information manquante', 'Numéro de base incorrect ou non transmis dans l\'adresse.');
}
// Récupérer la dénomination de l'établissement
if ($PROFIL == 'structure') {
    if (HEBERGEUR_INSTALLATION == 'multi-structures') {
        $structure_denomination = DB_WEBMESTRE_PUBLIC::DB_recuperer_structure_nom_for_Id($BASE);
        if ($structure_denomination === NULL) {
            exit_error('Établissement manquant', 'Établissement non trouvé dans la base d\'administration !');
        }
    } else {
        $DB_TAB = DB_STRUCTURE_PUBLIC::DB_lister_parametres('"webmestre_denomination"');
        if (!empty($DB_TAB)) {
            $structure_denomination = $DB_TAB[0]['parametre_valeur'];
        } else {
            exit_error('Base incomplète', 'Base de l\'établissement incomplète ou non encore installée !');
        }
    }
}
// Protection contre les attaques par force brute des robots (piratage compte ou envoi intempestif de courriels)
list($html_imgs, $captcha_soluce) = captcha();
$_SESSION['FORCEBRUTE'][$PAGE] = array('TIME' => $_SERVER['REQUEST_TIME'], 'DELAI' => 5, 'CAPTCHA' => $captcha_soluce);
$is_etablissement_virtuel = IS_HEBERGEMENT_SESAMATH && ($BASE == ID_DEMO || $BASE >= CONVENTION_ENT_ID_ETABL_MAXI || substr($structure_denomination, 0, 5) == 'Voir ') ? TRUE : FALSE;
?>

<?php 
if ($PROFIL == 'structure' && !$is_etablissement_virtuel) {
Beispiel #7
0
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Basculer vers un autre compte
// ////////////////////////////////////////////////////////////////////////////////////////////////////
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 {
Beispiel #8
0
/**
 * Mettre à jour automatiquement la base si besoin ; à effectuer avant toute récupération des données sinon ça peut poser pb...
 * 
 * @param int   $BASE
 * @return void
 */
function maj_base_structure_si_besoin($BASE)
{
  $version_base_structure = DB_STRUCTURE_PUBLIC::DB_version_base();
  if($version_base_structure != VERSION_BASE_STRUCTURE)
  {
    // On ne met pas à jour la base tant que le webmestre bloque l'accès à l'application, car sinon cela pourrait se produire avant le transfert de tous les fichiers.
    if(LockAcces::tester_blocage('webmestre',0)===NULL)
    {
      // Bloquer l'application
      LockAcces::bloquer_application('automate',$BASE,'Mise à jour de la base en cours.');
      // Lancer une mise à jour de la base
      DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_structure);
      // Log de l'action
      SACocheLog::ajouter('Mise à jour automatique de la base '.SACOCHE_STRUCTURE_BD_NAME.'.');
      // Débloquer l'application
      LockAcces::debloquer_application('automate',$BASE);
    }
  }
}
Beispiel #9
0
 * 
 * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
 * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
 * 
 */
if($_SESSION['SESAMATH_ID']==ID_DEMO){exit('Action désactivée pour la démo...');}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération des informations transmises
// ////////////////////////////////////////////////////////////////////////////////////////////////////

$action = (isset($_POST['f_action'])) ? Clean::texte($_POST['f_action'])  : '';

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Activation du compte
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if($action=='Valider_CNIL')
{
  DB_STRUCTURE_PUBLIC::DB_enregistrer_date_connexion($_SESSION['USER_ID']);
  unset($_SESSION['STOP_CNIL']);
  exit('ok');
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là...
// ////////////////////////////////////////////////////////////////////////////////////////////////////

exit('Erreur avec les données transmises !');
?>
Beispiel #10
0
 /**
  * Enregistrer en session les informations authentifiant un utilisateur (sauf profils webmestre / développeur / partenaire).
  * 
  * @param int     $BASE
  * @param array   $DB_ROW   ligne issue de la table sacoche_user correspondant à l'utilisateur qui se connecte.
  * @return void
  */
 public static function initialiser_utilisateur($BASE,$DB_ROW)
 {
   // Récupérer et Enregistrer en session les données associées à l'établissement (indices du tableau de session en majuscules).
   $DB_TAB_PARAM = DB_STRUCTURE_PUBLIC::DB_lister_parametres();
   $tab_type_entier  = array(
     'SESAMATH_ID',
     'MOIS_BASCULE_ANNEE_SCOLAIRE',
     'DROIT_ELEVE_DEMANDES',
     'CALCUL_VALEUR_RR',
     'CALCUL_VALEUR_R',
     'CALCUL_VALEUR_V',
     'CALCUL_VALEUR_VV',
     'CALCUL_SEUIL_R',
     'CALCUL_SEUIL_V',
     'CALCUL_LIMITE',
     'CAS_SERVEUR_PORT',
     'CAS_SERVEUR_VERIF_CERTIF_SSL',
     'ENVELOPPE_HORIZONTAL_GAUCHE',
     'ENVELOPPE_HORIZONTAL_MILIEU',
     'ENVELOPPE_HORIZONTAL_DROITE',
     'ENVELOPPE_VERTICAL_HAUT',
     'ENVELOPPE_VERTICAL_MILIEU',
     'ENVELOPPE_VERTICAL_BAS',
     'ETABLISSEMENT_IP_VARIABLE',
     'OFFICIEL_ARCHIVE_AJOUT_MESSAGE_COPIE',
     'OFFICIEL_ARCHIVE_RETRAIT_TAMPON_SIGNATURE',
     'OFFICIEL_BULLETIN_ONLY_SOCLE',
     'OFFICIEL_BULLETIN_APPRECIATION_RUBRIQUE_LONGUEUR',
     'OFFICIEL_BULLETIN_APPRECIATION_RUBRIQUE_REPORT',
     'OFFICIEL_BULLETIN_APPRECIATION_GENERALE_LONGUEUR',
     'OFFICIEL_BULLETIN_APPRECIATION_GENERALE_REPORT',
     'OFFICIEL_BULLETIN_ASSIDUITE',
     'OFFICIEL_BULLETIN_BARRE_ACQUISITIONS',
     'OFFICIEL_BULLETIN_ACQUIS_TEXTE_NOMBRE',
     'OFFICIEL_BULLETIN_ACQUIS_TEXTE_CODE',
     'OFFICIEL_BULLETIN_MOYENNE_SCORES',
     'OFFICIEL_BULLETIN_CONVERSION_SUR_20',
     'OFFICIEL_BULLETIN_MOYENNE_CLASSE',
     'OFFICIEL_BULLETIN_MOYENNE_GENERALE',
     'OFFICIEL_BULLETIN_FUSION_NIVEAUX',
     'OFFICIEL_MARGE_GAUCHE',
     'OFFICIEL_MARGE_DROITE',
     'OFFICIEL_MARGE_HAUT',
     'OFFICIEL_MARGE_BAS',
     'OFFICIEL_RELEVE_ONLY_SOCLE',
     'OFFICIEL_RELEVE_APPRECIATION_RUBRIQUE_LONGUEUR',
     'OFFICIEL_RELEVE_APPRECIATION_RUBRIQUE_REPORT',
     'OFFICIEL_RELEVE_APPRECIATION_GENERALE_LONGUEUR',
     'OFFICIEL_RELEVE_APPRECIATION_GENERALE_REPORT',
     'OFFICIEL_RELEVE_ASSIDUITE',
     'OFFICIEL_RELEVE_ETAT_ACQUISITION',
     'OFFICIEL_RELEVE_MOYENNE_SCORES',
     'OFFICIEL_RELEVE_POURCENTAGE_ACQUIS',
     'OFFICIEL_RELEVE_CONVERSION_SUR_20',
     'OFFICIEL_RELEVE_CASES_NB',
     'OFFICIEL_RELEVE_AFF_COEF',
     'OFFICIEL_RELEVE_AFF_SOCLE',
     'OFFICIEL_RELEVE_AFF_DOMAINE',
     'OFFICIEL_RELEVE_AFF_THEME',
     'OFFICIEL_SOCLE_APPRECIATION_RUBRIQUE_LONGUEUR',
     'OFFICIEL_SOCLE_APPRECIATION_RUBRIQUE_REPORT',
     'OFFICIEL_SOCLE_APPRECIATION_GENERALE_LONGUEUR',
     'OFFICIEL_SOCLE_APPRECIATION_GENERALE_REPORT',
     'OFFICIEL_SOCLE_ASSIDUITE',
     'OFFICIEL_SOCLE_ONLY_PRESENCE',
     'OFFICIEL_SOCLE_POURCENTAGE_ACQUIS',
     'OFFICIEL_SOCLE_ETAT_VALIDATION',
     'USER_DALTONISME',
   );
   $tab_type_tableau = array(
     'CSS_BACKGROUND-COLOR',
     'CALCUL_VALEUR',
     'CALCUL_SEUIL',
     'NOTE_IMAGE',
     'NOTE_TEXTE',
     'NOTE_LEGENDE',
     'ACQUIS_TEXTE',
     'ACQUIS_LEGENDE',
     'ETABLISSEMENT',
     'ENVELOPPE',
     'OFFICIEL',
     'CAS_SERVEUR',
   );
   foreach($DB_TAB_PARAM as $DB_ROW_PARAM)
   {
     $parametre_nom = strtoupper($DB_ROW_PARAM['parametre_nom']);
     // Certains paramètres sont de type entier.
     $parametre_valeur = (in_array($parametre_nom,$tab_type_entier)) ? (int) $DB_ROW_PARAM['parametre_valeur'] : $DB_ROW_PARAM['parametre_valeur'] ;
     // Certains paramètres sont à enregistrer sous forme de tableau.
     $find = FALSE;
     foreach($tab_type_tableau as $key1)
     {
       $longueur_key1 = strlen($key1);
       if(substr($parametre_nom,0,$longueur_key1)==$key1)
       {
         $key2 = substr($parametre_nom,$longueur_key1+1);
         $_SESSION[$key1][$key2] = $parametre_valeur ;
         $find = TRUE;
         break;
       }
     }
     // Les autres paramètres sont à enregistrer tels quels.
     if(!$find)
     {
       $_SESSION[$parametre_nom] = $parametre_valeur ;
     }
   }
   // Enregistrer en session le numéro de la base.
   $_SESSION['BASE']                   = $BASE;
   // C'est un utilisateur d'un établissement.
   $_SESSION['USER_ETABLISSEMENT']     = TRUE;
   // Enregistrer en session les données associées au profil de l'utilisateur.
   $_SESSION['USER_PROFIL_SIGLE']      = $DB_ROW['user_profil_sigle'];
   $_SESSION['USER_PROFIL_TYPE']       = $DB_ROW['user_profil_type'];
   $_SESSION['USER_PROFIL_NOM_COURT']  = $DB_ROW['user_profil_nom_court_singulier'];
   $_SESSION['USER_PROFIL_NOM_LONG']   = $DB_ROW['user_profil_nom_long_singulier'];
   $_SESSION['USER_JOIN_GROUPES']      = $DB_ROW['user_profil_join_groupes'];   // Seuls les enseignants sont rattachés à des classes et groupes définis ; les autres le sont à tout l'établissement.
   $_SESSION['USER_JOIN_MATIERES']     = $DB_ROW['user_profil_join_matieres'] ; // Seuls les directeurs sont rattachés à toutes les matières ; les autres le sont à des matières définies.
   $_SESSION['USER_MDP_LONGUEUR_MINI'] = (int) $DB_ROW['user_profil_mdp_longueur_mini'];
   $_SESSION['USER_DUREE_INACTIVITE']  = (int) $DB_ROW['user_profil_duree_inactivite'];
   // Enregistrer en session les données personnelles de l'utilisateur.
   $_SESSION['USER_ID']                = (int) $DB_ROW['user_id'];
   $_SESSION['USER_SWITCH_ID']         = $DB_ROW['user_switch_id'];
   $_SESSION['USER_GENRE']             = $DB_ROW['user_genre'];
   $_SESSION['USER_NOM']               = $DB_ROW['user_nom'];
   $_SESSION['USER_PRENOM']            = $DB_ROW['user_prenom'];
   $_SESSION['USER_NAISSANCE_DATE']    = $DB_ROW['user_naissance_date'];
   $_SESSION['USER_EMAIL']             = $DB_ROW['user_email'];
   $_SESSION['USER_EMAIL_ORIGINE']     = $DB_ROW['user_email_origine'];
   $_SESSION['USER_LOGIN']             = $DB_ROW['user_login'];
   $_SESSION['USER_LANGUE']            = $DB_ROW['user_langue'];
   $_SESSION['USER_DALTONISME']        = $DB_ROW['user_daltonisme'];
   $_SESSION['USER_ID_ENT']            = $DB_ROW['user_id_ent'];
   $_SESSION['USER_ID_GEPI']           = $DB_ROW['user_id_gepi'];
   $_SESSION['USER_PARAM_ACCUEIL']     = $DB_ROW['user_param_accueil'];
   $_SESSION['ELEVE_CLASSE_ID']        = (int) $DB_ROW['eleve_classe_id'];
   $_SESSION['ELEVE_CLASSE_NOM']       = $DB_ROW['groupe_nom'];
   $_SESSION['ELEVE_LANGUE']           = (int) $DB_ROW['eleve_langue'];
   $_SESSION['DELAI_CONNEXION']        = (int) $DB_ROW['delai_connexion_secondes']; // Vaut (int)NULL = 0 à la 1e connexion, mais dans ce cas $_SESSION['FIRST_CONNEXION'] est testé avant.
   $_SESSION['FIRST_CONNEXION']        = ($DB_ROW['user_connexion_date']===NULL) ? TRUE : FALSE ;
   if( ($DB_ROW['user_connexion_date']===NULL) && ($DB_ROW['user_profil_type']!='administrateur') )
   {
     $_SESSION['STOP_CNIL'] = TRUE;
   }
   // Récupérer et Enregistrer en session les données des élèves associées à un responsable légal.
   if($_SESSION['USER_PROFIL_TYPE']=='parent')
   {
     $_SESSION['OPT_PARENT_ENFANTS']   = DB_STRUCTURE_COMMUN::DB_OPT_enfants_parent($_SESSION['USER_ID']);
     $_SESSION['OPT_PARENT_CLASSES']   = DB_STRUCTURE_COMMUN::DB_OPT_classes_parent($_SESSION['USER_ID']);
     $_SESSION['NB_ENFANTS'] = (is_array($_SESSION['OPT_PARENT_ENFANTS'])) ? count($_SESSION['OPT_PARENT_ENFANTS']) : 0 ;
     if( ($_SESSION['NB_ENFANTS']==1) && (is_array($_SESSION['OPT_PARENT_CLASSES'])) )
     {
       $_SESSION['ELEVE_CLASSE_ID']    = (int) $_SESSION['OPT_PARENT_CLASSES'][0]['valeur'];
       $_SESSION['ELEVE_CLASSE_NOM']   = $_SESSION['OPT_PARENT_CLASSES'][0]['texte'];
     }
   }
   // Récupérer et Enregistrer en session les données associées aux profils utilisateurs d'un établissement, activés ou non.
   if($_SESSION['USER_PROFIL_TYPE']=='administrateur')
   {
     $_SESSION['TAB_PROFILS_ADMIN'] = array( 'TYPE'=>array() , 'LOGIN_MODELE'=>array() , 'MDP_LONGUEUR_MINI'=>array() , 'DUREE_INACTIVITE'=>array() );
     $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_profils_parametres( 'user_profil_type,user_profil_login_modele,user_profil_mdp_longueur_mini,user_profil_mdp_date_naissance,user_profil_duree_inactivite' /*listing_champs*/ , FALSE /*only_actif*/ );
     foreach($DB_TAB as $DB_ROW)
     {
       $_SESSION['TAB_PROFILS_ADMIN']['TYPE']              [$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_type'];
       $_SESSION['TAB_PROFILS_ADMIN']['LOGIN_MODELE']      [$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_login_modele'];
       $_SESSION['TAB_PROFILS_ADMIN']['MDP_LONGUEUR_MINI'] [$DB_ROW['user_profil_sigle']] = (int) $DB_ROW['user_profil_mdp_longueur_mini'];
       $_SESSION['TAB_PROFILS_ADMIN']['MDP_DATE_NAISSANCE'][$DB_ROW['user_profil_sigle']] = (int) $DB_ROW['user_profil_mdp_date_naissance'];
       $_SESSION['TAB_PROFILS_ADMIN']['DUREE_INACTIVITE']  [$DB_ROW['user_profil_sigle']] = (int) $DB_ROW['user_profil_duree_inactivite'];
     }
   }
   // Récupérer et Enregistrer en session les noms des profils utilisateurs d'un établissement (activés) pour afficher les droits de certaines pages.
   else
   {
     $_SESSION['TAB_PROFILS_DROIT'] = array( 'TYPE'=>array() , 'JOIN_GROUPES'=>array() , 'JOIN_MATIERES'=>array() , 'NOM_LONG_PLURIEL'=>array() );
     $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_profils_parametres( 'user_profil_type,user_profil_join_groupes,user_profil_join_matieres,user_profil_nom_long_pluriel' /*listing_champs*/ , TRUE /*only_actif*/ );
     foreach($DB_TAB as $DB_ROW)
     {
       $_SESSION['TAB_PROFILS_DROIT']['TYPE']            [$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_type'];
       $_SESSION['TAB_PROFILS_DROIT']['JOIN_GROUPES']    [$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_join_groupes'];
       $_SESSION['TAB_PROFILS_DROIT']['JOIN_MATIERES']   [$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_join_matieres'];
       $_SESSION['TAB_PROFILS_DROIT']['NOM_LONG_PLURIEL'][$DB_ROW['user_profil_sigle']] = $DB_ROW['user_profil_nom_long_pluriel'];
     }
   }
   // Fabriquer $_SESSION['IMG_...'] et $_SESSION['BACKGROUND_...'] en fonction de $_SESSION['USER_DALTONISME'] à partir de $_SESSION['NOTE_IMAGE_...'] et $_SESSION['CSS_BACKGROUND-COLOR']['...']
   // remarque : $_SESSION['USER_DALTONISME'] ne peut être utilisé que pour les profils élèves/parents/profs/directeurs, pas les admins ni le webmestre
   SessionUser::adapter_daltonisme() ;
   // Enregistrer en session le CSS personnalisé
   SessionUser::actualiser_style();
   // Enregistrer en session le menu personnalisé ; détection de la langue remis ici pour le cas de bascule entre comptes.
   Lang::setlocale( LC_MESSAGES, Lang::get_locale_used() );
   SessionUser::memoriser_menu();
   // Juste pour davantage de lisibilité si besoin de debug...
   ksort($_SESSION);
   // Enfin, on profite de cet événement pour faire du ménage ou simuler une tâche planifiée
   SessionUser::cron();
 }
 {
   $_SESSION['FORCEBRUTE'][$PAGE]['DELAI']++;
   $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] = $_SERVER['REQUEST_TIME'];
   exit_json( FALSE , 'Utilisateur inconnu ! Nouvelle tentative autorisée dans '.$_SESSION['FORCEBRUTE'][$PAGE]['DELAI'].'s.' );
 }
 // On vérifie que l'adresse mail concorde
 if( $DB_ROW['user_email'] != $courriel )
 {
   $_SESSION['FORCEBRUTE'][$PAGE]['DELAI']++;
   $_SESSION['FORCEBRUTE'][$PAGE]['TIME'] = $_SERVER['REQUEST_TIME'];
   exit_json( FALSE , 'Adresse mail non concordante ! Nouvelle tentative autorisée dans '.$_SESSION['FORCEBRUTE'][$PAGE]['DELAI'].'s.' );
 }
 // On enregistre un ticket pour cette demande
 $user_pass_key = crypter_mdp($DB_ROW['user_id'].$DB_ROW['user_email'].$DB_ROW['user_password'].$DB_ROW['user_connexion_date']);
 $code_mdp = ($BASE) ? $user_pass_key.'g'.$BASE : $user_pass_key ;
 DB_STRUCTURE_PUBLIC::DB_modifier_user_password_or_key ($DB_ROW['user_id'] , '' /*user_password*/ , $user_pass_key /*user_pass_key*/ );
 // On envoi le courriel à l'utilisateur
 $mail_contenu = 'Bonjour,'."\r\n";
 $mail_contenu.= "\r\n";
 $mail_contenu.= 'Une demande de nouveaux identifiants a été formulée pour le compte SACoche de '.$DB_ROW['user_prenom'].' '.$DB_ROW['user_nom'].'.'."\r\n";
 $mail_contenu.= "\r\n";
 $mail_contenu.= 'Pour confirmer la génération d\'un nouveau mot de passe, veuillez cliquer sur ce lien :'."\r\n";
 $mail_contenu.= URL_DIR_SACOCHE.'?code_mdp='.$code_mdp."\r\n";
 $mail_contenu.= Sesamail::texte_pied_courriel( array('excuses_derangement','info_connexion','no_reply','signature') , $DB_ROW['user_email'] );
 $courriel_bilan = Sesamail::mail( $DB_ROW['user_email'] , 'Demande de nouveaux identifiants' , $mail_contenu , $DB_ROW['user_email'] /*replyto*/ );
 if(!$courriel_bilan)
 {
   exit_json( FALSE , 'Erreur lors de l\'envoi du courriel !' );
 }
 // OK !
 exit_json( TRUE );