Exemplo n.º 1
0
if (HEBERGEUR_INSTALLATION == 'multi-structures') {
    // Lecture d'un cookie sur le poste client servant à retenir le dernier établissement sélectionné si identification avec succès
    $BASE = isset($_COOKIE[COOKIE_STRUCTURE]) ? Clean::entier($_COOKIE[COOKIE_STRUCTURE]) : 0;
    // Test si id d'établissement transmis dans l'URL ; historiquement "id" si connexion normale et "base" si connexion SSO
    $BASE = isset($_GET['id']) ? Clean::entier($_GET['id']) : $BASE;
    $BASE = isset($_GET['base']) ? Clean::entier($_GET['base']) : $BASE;
    // Test si UAI d'établissement transmis dans l'URL
    $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].');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
Exemplo n.º 2
0
// Pas de traduction car pas de choix de langue à ce niveau.
// Récupération du code
$code_mdp = isset($_GET['code_mdp']) ? Clean::texte($_GET['code_mdp']) : '';
if (!$code_mdp) {
    exit_error($TITRE, 'Absence de code transmis dans l\'adresse.');
}
// Vérification de la structure du code
list($user_pass_key, $BASE) = explode('g', $code_mdp) + array_fill(0, 2, NULL);
// Evite des NOTICE en initialisant les valeurs manquantes
$BASE = (int) $BASE;
if (!$user_pass_key || $BASE == 0 && HEBERGEUR_INSTALLATION == 'multi-structures') {
    exit_error($TITRE, 'Le code transmis est incohérent (format inattendu).');
}
// En cas de multi-structures, il faut charger les paramètres de connexion à la base concernée
if (HEBERGEUR_INSTALLATION == 'multi-structures') {
    $result = charger_parametres_mysql_supplementaires($BASE, FALSE);
    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.
        FileSystem::supprimer_dossier($dossier_temp_sql);
        // Pas seulement vider, au cas où il y aurait des sous-dossiers créés par l'archive.
        exit(']¤[' . '<tr>' . $retour_cellules_non . '<td><label class="erreur">Erreur : ' . html($fichier_nom) . ' contient une sauvegarde plus récente que celle supportée par cette installation ! Il faut mettre à jour SACoche.</label></td>' . '</tr>');
    }
    // Insérer l'enregistrement dans la base du webmestre
    // Créer le fichier de connexion de la base de données de la structure
    // Créer la base de données de la structure
    // Créer un utilisateur pour la base de données de la structure et lui attribuer ses droits
    $base_id = Webmestre::ajouter_structure($import_id, $geo_id, $uai, $localisation, $denomination, $contact_nom, $contact_prenom, $contact_courriel, $date);
    // Créer les dossiers de fichiers temporaires par établissement
    foreach (FileSystem::$tab_dossier_tmp_structure as $dossier) {
        FileSystem::creer_dossier($dossier . $base_id);
        FileSystem::ecrire_fichier_index($dossier . $base_id);
    }
    // Charger les paramètres de connexion à cette base afin de pouvoir y effectuer des requêtes
    charger_parametres_mysql_supplementaires($base_id);
    // Restaurer des fichiers de svg et mettre la base à jour si besoin.
    $texte_etape = restaurer_tables_base_etablissement($dossier_temp_sql, 0);
    // Supprimer le dossier temporaire
    FileSystem::supprimer_dossier($dossier_temp_sql);
    // Retour du succès, appel suivant
    $retour_cellules_oui = '<td class="nu"><input type="checkbox" name="f_ids" value="' . $base_id . '" /></td><td class="label">' . $base_id . '</td><td class="label">' . html($localisation . ' | ' . $denomination . ' [' . $uai . ']') . '</td><td class="label">' . html($contact_nom . ' ' . $contact_prenom . ' (' . $contact_courriel . ')') . '</td>';
    exit(']¤[' . '<tr>' . $retour_cellules_oui . '<td class="label"><label class="valide">' . $texte_etape . ' avec succès.</label></td>' . '</tr>');
} elseif ($action == 'importer' && $num && $max && $num == $max) {
    // Supprimer les fichiers zip des bases
    foreach ($_SESSION['tab_info'] as $key => $tab_infos) {
        FileSystem::supprimer_fichier(CHEMIN_DOSSIER_DUMP . $tab_infos['fichier_nom'], TRUE);
    }
    // Game over
    unset($_SESSION['datetime'], $_SESSION['alea'], $_SESSION['tab_info']);
    exit(']¤[' . 'ok');
     <th>Documents générés</th>
     <th>Contrat signé</th>
     <th>Règlement perçu</th>
     <th>Service activé</th>
     <th class="nu"><q class="ajouter" title="Ajouter une convention."></q></th>
   </tr>
 </thead>
 <tbody>
   <?php
   // Récupérer les coordonnées du contact référent
   // Lister les conventions de cet établissement
   $contact_nom = $contact_prenom = $contact_courriel = '' ;
   $DB_TAB = array();
   if( (IS_HEBERGEMENT_SESAMATH) && (HEBERGEUR_INSTALLATION=='multi-structures') )
   {
     charger_parametres_mysql_supplementaires( 0 /*BASE*/ );
     $DB_ROW2 = DB_WEBMESTRE_ADMINISTRATEUR::DB_recuperer_contact_infos($_SESSION['BASE']);
     $contact_nom      = $DB_ROW2['structure_contact_nom'];
     $contact_prenom   = $DB_ROW2['structure_contact_prenom'];
     $contact_courriel = $DB_ROW2['structure_contact_courriel'];
     $DB_TAB = DB_WEBMESTRE_ADMINISTRATEUR::DB_lister_conventions_structure($_SESSION['BASE']);
   }
   if(!empty($DB_TAB))
   {
     foreach($DB_TAB as $DB_ROW)
     {
       // Formater certains éléments
       $texte_signature  = ($DB_ROW['convention_signature']===NULL) ? 'Non réceptionné' : 'Oui, le '.convert_date_mysql_to_french($DB_ROW['convention_signature']) ;
       $texte_paiement   = ($DB_ROW['convention_paiement']===NULL)  ? 'Non réceptionné' : 'Oui, le '.convert_date_mysql_to_french($DB_ROW['convention_paiement']) ;
       $texte_activation = (!$DB_ROW['convention_activation']) ? 'Non' : ( ( ($DB_ROW['convention_date_debut']>TODAY_MYSQL) || ($DB_ROW['convention_date_fin']<TODAY_MYSQL) ) ? 'Non (hors période)' : 'Oui' ) ;
       $class_signature  = (substr($texte_signature ,0,3)=='Non') ? 'br' : 'bv' ;
    }
    if (CONTACT_MODIFICATION_MAIL != 'non') {
        if (!$contact_courriel) {
            exit('Erreur avec les données transmises !');
        }
        if (CONTACT_MODIFICATION_MAIL != 'oui' && strpos($contact_courriel, CONTACT_MODIFICATION_MAIL) === FALSE) {
            exit('Erreur avec le domaine qui est restreint à "' . CONTACT_MODIFICATION_MAIL . '" par le webmestre.');
        }
        // Vérifier le domaine du serveur mail (multi-structures donc serveur ouvert sur l'extérieur).
        list($mail_domaine, $is_domaine_valide) = tester_domaine_courriel_valide($contact_courriel);
        if (!$is_domaine_valide) {
            exit('Erreur avec le domaine "' . $mail_domaine . '" !');
        }
    }
    // On met à jour dans la base du webmestre, sans écraser l'existant.
    charger_parametres_mysql_supplementaires(0);
    $DB_ROW = DB_WEBMESTRE_ADMINISTRATEUR::DB_recuperer_contact_infos($_SESSION['BASE']);
    $contact_nom = CONTACT_MODIFICATION_USER != 'non' ? $contact_nom : $DB_ROW['structure_contact_nom'];
    $contact_prenom = CONTACT_MODIFICATION_USER != 'non' ? $contact_prenom : $DB_ROW['structure_contact_prenom'];
    $contact_courriel = CONTACT_MODIFICATION_MAIL != 'non' ? $contact_courriel : $DB_ROW['structure_contact_courriel'];
    DB_WEBMESTRE_ADMINISTRATEUR::DB_modifier_contact_infos($_SESSION['BASE'], $contact_nom, $contact_prenom, $contact_courriel);
    // Si on arrive là, alors tout s'est bien passé.
    exit('ok');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Mettre à jour les informations form_etablissement
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($etablissement_denomination) {
    // Vérifier le domaine du serveur mail seulement en mode multi-structures car ce peut être sinon une installation sur un serveur local non ouvert sur l'extérieur.
    if ($etablissement_courriel && HEBERGEUR_INSTALLATION == 'multi-structures') {
        list($mail_domaine, $is_domaine_valide) = tester_domaine_courriel_valide($etablissement_courriel);
Exemplo n.º 6
0
 /**
  * Tester si les données transmises permettent d'authentifier un utilisateur (sauf webmestre & développeur).
  * 
  * En cas de connexion avec les identifiants SACoche, la reconnaissance s'effectue sur le couple login/password.
  * En cas de connexion depuis un service SSO extérieur type CAS, la reconnaissance s'effectue en comparant l'identifiant transmis (via $login) avec l'id ENT de jointure connu de SACoche.
  * En cas de connexion utilisant GEPI, la reconnaissance s'effectue en comparant le login GEPI transmis avec l'id Gepi de jointure connu de SACoche.
  * 
  * @param int       $BASE
  * @param string    $login
  * @param string    $password
  * @param string    $mode_connection 'normal' | 'cas' | 'shibboleth' | 'siecle' | 'vecteur_parent' | 'gepi' | 'ldap' (?)
  * @param string    $parent_nom      facultatif, seulement pour $mode_connection = 'vecteur_parent'
  * @param string    $parent_prenom   facultatif, seulement pour $mode_connection = 'vecteur_parent'
  * @return array(string,array)   ('ok',$DB_ROW) ou (message_d_erreur,tableau_vide)
  */
 public static function tester_authentification_utilisateur($BASE,$login,$password,$mode_connection,$parent_nom='',$parent_prenom='')
 {
   // En cas de multi-structures, il faut charger les paramètres de connexion à la base concernée
   // Sauf pour une connexion à un ENT, car alors il a déjà fallu les charger pour récupérer les paramètres de connexion à l'ENT
   if( ($BASE) && ($mode_connection=='normal') )
   {
     charger_parametres_mysql_supplementaires($BASE);
   }
   // Récupérer les données associées à l'utilisateur.
   $DB_ROW = DB_STRUCTURE_PUBLIC::DB_recuperer_donnees_utilisateur($mode_connection,$login,$parent_nom,$parent_prenom);
   // Si login (ou identifiant SSO) non trouvé...
   if(empty($DB_ROW))
   {
     switch($mode_connection)
     {
       case 'normal'         : $message = 'Nom d\'utilisateur incorrect !'; break;
       case 'cas'            : $message = 'Identification réussie mais identifiant CAS "'       .$login.'" inconnu dans SACoche !<br />Un administrateur doit renseigner que l\'identifiant ENT associé à votre compte SACoche est "' .$login.'"&hellip;<br />Il doit pour cela se connecter à SACoche, menu [Gestion&nbsp;courante], et indiquer pour votre compte dans le champ [Id.&nbsp;ENT] la valeur "' .$login.'".'; break;
       case 'shibboleth'     : $message = 'Identification réussie mais identifiant Shibboleth "'.$login.'" inconnu dans SACoche !<br />Un administrateur doit renseigner que l\'identifiant ENT associé à votre compte SACoche est "' .$login.'"&hellip;<br />Il doit pour cela se connecter à SACoche, menu [Gestion&nbsp;courante], et indiquer pour votre compte dans le champ [Id.&nbsp;ENT] la valeur "' .$login.'".'; break;
       case 'siecle'         : $message = 'Identification réussie mais identifiant Sconet "'    .$login.'" inconnu dans SACoche !<br />Un administrateur doit renseigner que l\'identifiant Sconet associé à votre compte SACoche est "' .$login.'"&hellip;<br />Il doit pour cela se connecter à SACoche, menu [Gestion&nbsp;courante], et indiquer pour votre compte dans le champ [Id.&nbsp;Sconet] la valeur "' .$login.'".'; break;
       case 'vecteur_parent' : $message = 'Identification réussie mais compte parent introuvable dans SACoche !<br />Le compte SACoche d\'un responsable légal dont le nom est "' .$parent_nom.'", le prénom est "' .$parent_prenom.'", et ayant la charge d\'un enfant dont l\'identifiant Sconet est "' .$login.'", n\'a pas été trouvé.'; break;
       case 'gepi'           : $message = 'Identification réussie mais login GEPI "'            .$login.'" inconnu dans SACoche !<br />Un administrateur doit renseigner que l\'identifiant GEPI associé à votre compte SACoche est "'.$login.'"&hellip;<br />Il doit pour cela se connecter à SACoche, menu [Gestion&nbsp;courante], et indiquer pour votre compte dans le champ [Id.&nbsp;Gepi] la valeur "'.$login.'".'; break;
     }
     return array($message,array());
   }
   // Blocage éventuel par le webmestre ou un administrateur ou l'automate
   LockAcces::stopper_si_blocage( $BASE , $DB_ROW['user_profil_sigle'] );
   // Si mdp incorrect...
   if( ($mode_connection=='normal') && ($DB_ROW['user_password']!=crypter_mdp($password)) )
   {
     global $PAGE;
     return array( 'Mot de passe incorrect ! Nouvelle tentative autorisée dans '.$_SESSION['FORCEBRUTE'][$PAGE]['DELAI'].'s.' , array() );
   }
   // Si compte desactivé...
   if($DB_ROW['user_sortie_date']<=TODAY_MYSQL)
   {
     return array( 'Identification réussie mais ce compte est desactivé !' , array() );
   }
   // Mémoriser la date de la (dernière) connexion (pour les autres cas, sera enregistré lors de la confirmation de la prise en compte des infos CNIL).
   if( ($DB_ROW['user_connexion_date']!==NULL) || in_array($DB_ROW['user_profil_type'],array('webmestre','administrateur')) )
   {
     DB_STRUCTURE_PUBLIC::DB_enregistrer_date_connexion($DB_ROW['user_id']);
   }
   // Enregistrement d'un cookie sur le poste client servant à retenir le dernier établissement sélectionné si identification avec succès
   Cookie::definir( COOKIE_STRUCTURE , $BASE , 31536000 /* 60*60*24*365 = 1 an */ );
   // Enregistrement d'un cookie sur le poste client servant à retenir le dernier mode de connexion utilisé si identification avec succès
   Cookie::definir( COOKIE_AUTHMODE , $mode_connection );
   // Si on arrive ici c'est que l'identification s'est bien effectuée !
   return array( 'ok' , $DB_ROW );
 }