/** * Ajouter une structure (mode multi-structures) * * @param int $base_id Pour forcer l'id de la base de la structure ; normalement transmis à 0 (=> auto-increment), sauf dans un cadre de gestion interne à Sésamath * @param int $geo_id * @param string $structure_uai * @param string $localisation * @param string $denomination * @param string $contact_nom * @param string $contact_prenom * @param string $contact_courriel * @param string $inscription_date Pour forcer la date d'inscription, par exemple en cas de transfert de bases académiques (facultatif). * @return int */ public static function ajouter_structure($base_id,$geo_id,$structure_uai,$localisation,$denomination,$contact_nom,$contact_prenom,$contact_courriel,$inscription_date=0) { // Insérer l'enregistrement d'une nouvelle structure dans la base du webmestre $base_id = DB_WEBMESTRE_WEBMESTRE::DB_ajouter_structure($base_id,$geo_id,$structure_uai,$localisation,$denomination,$contact_nom,$contact_prenom,$contact_courriel,$inscription_date); // Génération des paramètres de connexion à la base de données $BD_name = 'sac_base_'.$base_id; // Limité à 64 caractères (tranquille...) $BD_user = '******'.$base_id; // Limité à 16 caractères (attention !) $BD_pass = fabriquer_mdp(); // Créer le fichier de connexion de la base de données de la structure FileSystem::fabriquer_fichier_connexion_base($base_id,SACOCHE_WEBMESTRE_BD_HOST,SACOCHE_WEBMESTRE_BD_PORT,$BD_name,$BD_user,$BD_pass); // Créer la base de données d'une structure, un utilisateur MySQL, et lui attribuer ses droits. DB_WEBMESTRE_WEBMESTRE::DB_ajouter_base_structure_et_user_mysql($base_id,$BD_name,$BD_user,$BD_pass); /* Il reste à : + Lancer les requêtes pour installer et remplir les tables, éventuellement personnaliser certains paramètres de la structure + Insérer le compte administrateur dans la base de cette structure, éventuellement lui envoyer un courriel + Créer un dossier pour les les vignettes images */ return $base_id; }
if ($box_login) { // Construire puis tester le login (parmi tous les utilisateurs de l'établissement) $login = fabriquer_login($prenom, $nom, $profil); if (DB_STRUCTURE_ADMINISTRATEUR::DB_tester_utilisateur_identifiant('login', $login)) { // Login pris : en chercher un autre en remplaçant la fin par des chiffres si besoin $login = DB_STRUCTURE_ADMINISTRATEUR::DB_rechercher_login_disponible($login); } } else { // Vérifier que le login transmis est disponible (parmi tous les utilisateurs de l'établissement) if (DB_STRUCTURE_ADMINISTRATEUR::DB_tester_utilisateur_identifiant('login', $login)) { exit('Erreur : login déjà existant !'); } } if ($box_password) { // Générer un mdp aléatoire $password = fabriquer_mdp($profil); } else { // Vérifier que le mdp transmis est d'une longueur compatible if (mb_strlen($password) < $_SESSION['TAB_PROFILS_ADMIN']['MDP_LONGUEUR_MINI'][$profil]) { exit('Erreur : mot de passe trop court pour ce profil !'); } } // 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 ($courriel) { if (HEBERGEUR_INSTALLATION == 'multi-structures') { list($mail_domaine, $is_domaine_valide) = tester_domaine_courriel_valide($courriel); if (!$is_domaine_valide) { exit('Erreur avec le domaine "' . $mail_domaine . '" !'); } } }
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. 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>
} $denomination = $DB_ROW['structure_denomination']; $contact_nom = $DB_ROW['structure_contact_nom']; $contact_prenom = $DB_ROW['structure_contact_prenom']; $contact_courriel = $DB_ROW['structure_contact_courriel']; // Informations sur l'admin : nom / prénom / login. $DB_ROW = DB_STRUCTURE_WEBMESTRE::DB_recuperer_admin_identite($admin_id); if(empty($DB_ROW)) { exit('Erreur : administrateur introuvable !'); } $admin_nom = $DB_ROW['user_nom']; $admin_prenom = $DB_ROW['user_prenom']; $admin_login = $DB_ROW['user_login']; // Générer un nouveau mdp de l'admin $admin_password = fabriquer_mdp(); DB_STRUCTURE_WEBMESTRE::DB_modifier_admin_mdp($admin_id,crypter_mdp($admin_password)); // Envoyer un courriel au contact et éventuellement une copie du courriel au webmestre $courriel_contenu = Webmestre::contenu_courriel_nouveau_mdp( $base_id , $denomination , $contact_nom , $contact_prenom , $admin_nom , $admin_prenom , $admin_login , $admin_password , URL_DIR_SACOCHE ); $courriel_titre = 'Modification mdp administrateur - Inscription n°'.$base_id; $courriel_bilan = Sesamail::mail( $contact_courriel , $courriel_titre , $courriel_contenu ); if(!$courriel_bilan) { exit('Erreur lors de l\'envoi du courriel !'); } if($courriel_copie) { $introduction = '================================================================================'."\r\n".'Copie pour information du courriel adressé à '.$contact_courriel."\r\n".'================================================================================'."\r\n\r\n"; $courriel_bilan = Sesamail::mail( WEBMESTRE_COURRIEL , $courriel_titre , $introduction.$courriel_contenu ); if(!$courriel_bilan) {
} DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_user($DB_ROW[$prefixe . 'id'], array(':login' => $login)); $tab_login[$DB_ROW[$prefixe . 'id']] = $login; } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Initialiser plusieurs mots de passe // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'generer_mdp') { $tab_password = array(); // Récupérer les données des utilisateurs concernés (besoin de le faire maintenant, on a besoin des infos pour générer le mdp) $listing_champs = $profil != 'parents' ? 'user_id,user_sconet_id,user_sconet_elenoet,user_reference,user_profil_sigle,user_nom,user_prenom,user_login' : 'parent.user_id AS parent_id,parent.user_sconet_id AS parent_sconet_id,parent.user_sconet_elenoet AS parent_sconet_elenoet,parent.user_reference AS parent_reference,parent.user_profil_sigle AS parent_profil_sigle,parent.user_nom AS parent_nom,parent.user_prenom AS parent_prenom,parent.user_login AS parent_login'; $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles(implode(',', $tab_user), $listing_champs, $avec_info); // Mettre à jour les mots de passe des utilisateurs concernés foreach ($DB_TAB as $DB_ROW) { $password = fabriquer_mdp($DB_ROW[$prefixe . 'profil_sigle']); DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_user($DB_ROW[$prefixe . 'id'], array(':password' => crypter_mdp($password))); $tab_password[$DB_ROW[$prefixe . 'id']] = $password; } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Forcer plusieurs mots de passe avec la date de naissance // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'forcer_mdp_birth') { if ($profil != 'eleves') { exit('Fonctionnalité disponible uniquement pour les élèves !'); } $tab_password = array(); // Récupérer les données des utilisateurs concernés (besoin de le faire maintenant, on a besoin des infos pour générer le mdp) $listing_champs = $profil != 'parents' ? 'user_id,user_sconet_id,user_sconet_elenoet,user_reference,user_profil_sigle,user_nom,user_prenom,user_naissance_date,user_login,user_naissance_date' : 'parent.user_id AS parent_id,parent.user_sconet_id AS parent_sconet_id,parent.user_sconet_elenoet AS parent_sconet_elenoet,parent.user_reference AS parent_reference,parent.user_profil_sigle AS parent_profil_sigle,parent.user_nom AS parent_nom,parent.user_prenom AS parent_prenom,parent.user_login AS parent_login'; $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles(implode(',', $tab_user), $listing_champs, $avec_info);
echo'<td class="nu">'; echo '<q class="modifier" title="Modifier ce partenaire."></q>'; echo '<q class="initialiser_mdp" title="Générer un nouveau mdp pour ce partenaire."></q>'; echo '<q class="supprimer" title="Retirer ce partenaire."></q>'; echo'</td>'; exit(); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Générer un nouveau mdp d'un partenaire conventionné et lui envoyer par courriel // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='initialiser_mdp') && $partenaire_id && $denomination && $nom && $prenom && $courriel ) { // Générer un nouveau mdp $password = fabriquer_mdp(); // Mettre à jour l'enregistrement DB_WEBMESTRE_WEBMESTRE::DB_modifier_partenaire_conventionne_mdp($partenaire_id,crypter_mdp($password)); // Envoyer un courriel $courriel_contenu = Webmestre::contenu_courriel_partenaire_nouveau_mdp( $denomination , $nom , $prenom , $password , URL_DIR_SACOCHE ); $courriel_bilan = Sesamail::mail( $courriel , 'Modification mdp compte partenaire ENT' , $courriel_contenu ); if(!$courriel_bilan) { exit('Erreur lors de l\'envoi du courriel !'); } // On affiche le retour echo'<ok>'; echo'Le mot de passe de<BR />'.html($prenom.' '.$nom).',<BR />partenaire conventionné<BR />"'.html($denomination).'",<BR />vient d\'être réinitialisé.<BR /><BR />'; echo'Les nouveaux identifiants<BR />ont été envoyés<BR />à son adresse de courriel<BR />'.html($courriel).'.'; exit(); }
$tab_nom_classe[$DB_ROW['groupe_id']] = $DB_ROW['groupe_nom']; } } foreach ($tab_add as $i_fichier) { if (isset($tab_memo_analyse['ajouter'][$i_fichier])) { // Il peut théoriquement subsister un conflit de sconet_id pour des users ayant même reference, et réciproquement... // Construire le login $login = fabriquer_login($tab_memo_analyse['ajouter'][$i_fichier]['prenom'], $tab_memo_analyse['ajouter'][$i_fichier]['nom'], $tab_memo_analyse['ajouter'][$i_fichier]['profil_sigle']); // Puis tester le login (parmi tout le personnel de l'établissement) if (DB_STRUCTURE_ADMINISTRATEUR::DB_tester_utilisateur_identifiant('login', $login)) { // Login pris : en chercher un autre en remplaçant la fin par des chiffres si besoin $login = DB_STRUCTURE_ADMINISTRATEUR::DB_rechercher_login_disponible($login); } // Construire le password if ($import_profil != 'eleve' || !$_SESSION['TAB_PROFILS_ADMIN']['MDP_LONGUEUR_MINI']['ELV'] || empty($tab_memo_analyse['ajouter'][$i_fichier]['birth_date'])) { $password = fabriquer_mdp($tab_memo_analyse['ajouter'][$i_fichier]['profil_sigle']); } else { $password = str_replace('/', '', $tab_memo_analyse['ajouter'][$i_fichier]['birth_date']); } // Attention à la date de naissance, définie seulement pour les élèves $birth_date = empty($tab_memo_analyse['ajouter'][$i_fichier]['birth_date']) ? NULL : convert_date_french_to_mysql($tab_memo_analyse['ajouter'][$i_fichier]['birth_date']); // Ajouter l'utilisateur $user_id = DB_STRUCTURE_COMMUN::DB_ajouter_utilisateur($tab_memo_analyse['ajouter'][$i_fichier]['sconet_id'], $tab_memo_analyse['ajouter'][$i_fichier]['sconet_num'], $tab_memo_analyse['ajouter'][$i_fichier]['reference'], $tab_memo_analyse['ajouter'][$i_fichier]['profil_sigle'], $tab_memo_analyse['ajouter'][$i_fichier]['genre'], $tab_memo_analyse['ajouter'][$i_fichier]['nom'], $tab_memo_analyse['ajouter'][$i_fichier]['prenom'], $birth_date, $tab_memo_analyse['ajouter'][$i_fichier]['courriel'], $tab_memo_analyse['ajouter'][$i_fichier]['email_origine'], $login, crypter_mdp($password), $tab_memo_analyse['ajouter'][$i_fichier]['classe']); if ($import_profil == 'professeur') { // Pour les professeurs et directeurs, abonnement obligatoire aux signalements d'un souci pour une appréciation d'un bilan officiel DB_STRUCTURE_NOTIFICATION::DB_ajouter_abonnement($user_id, 'bilan_officiel_appreciation', 'accueil'); } $tab_i_fichier_TO_id_base[$i_fichier] = (int) $user_id; $nb_add++; $tab_password[$user_id] = $password; $classe_ou_profil = $import_profil == 'eleve' ? $tab_nom_classe[$tab_memo_analyse['ajouter'][$i_fichier]['classe']] : $tab_memo_analyse['ajouter'][$i_fichier]['profil_sigle'];
// 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 /*titre*/ , 'Le code transmis est invalide ou périmé (absence de correspondance).' /*contenu*/ ); } 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 /*titre*/ , 'Le code transmis est périmé (incompatible avec les données actuelles).' /*contenu*/ ); } // 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) /*user_password*/ , '' /*user_pass_key*/ ); // 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> <hr /> <p class="hc"><a href="./index.php">[ Retour en page d'accueil ]</a></p>
/** * DB_WEBMESTRE_ajouter_structure * * @param int $base_id Pour forcer l'id de la base de la structure ; normalement transmis à 0 (=> auto-increment), sauf dans un cadre de gestion interne à Sésamath * @param int $geo_id * @param string $structure_uai * @param string $localisation * @param string $denomination * @param string $contact_nom * @param string $contact_prenom * @param string $contact_courriel * @param string $inscription_date Pour forcer la date d'inscription, par exemple en cas de transfert de bases académiques (facultatif). * @return int */ function DB_WEBMESTRE_ajouter_structure($base_id,$geo_id,$structure_uai,$localisation,$denomination,$contact_nom,$contact_prenom,$contact_courriel,$inscription_date=0) { $chaine_date = ($inscription_date) ? ':inscription_date' : 'NOW()' ; // Insérer l'enregistrement dans la base du webmestre if($base_id==0) { $DB_SQL = 'INSERT INTO sacoche_structure(geo_id,structure_uai,structure_localisation,structure_denomination,structure_contact_nom,structure_contact_prenom,structure_contact_courriel,structure_inscription_date) '; $DB_SQL.= 'VALUES(:geo_id,:structure_uai,:localisation,:denomination,:contact_nom,:contact_prenom,:contact_courriel,'.$chaine_date.')'; $DB_VAR = array(':geo_id'=>$geo_id,':structure_uai'=>$structure_uai,':localisation'=>$localisation,':denomination'=>$denomination,':contact_nom'=>$contact_nom,':contact_prenom'=>$contact_prenom,':contact_courriel'=>$contact_courriel,':inscription_date'=>$inscription_date); DB::query(SACOCHE_WEBMESTRE_BD_NAME , $DB_SQL , $DB_VAR); $base_id = DB::getLastOid(SACOCHE_WEBMESTRE_BD_NAME); } else { $DB_SQL = 'INSERT INTO sacoche_structure(sacoche_base,geo_id,structure_uai,structure_localisation,structure_denomination,structure_contact_nom,structure_contact_prenom,structure_contact_courriel,structure_inscription_date) '; $DB_SQL.= 'VALUES(:base_id,:geo_id,:structure_uai,:localisation,:denomination,:contact_nom,:contact_prenom,:contact_courriel,'.$chaine_date.')'; $DB_VAR = array(':base_id'=>$base_id,':geo_id'=>$geo_id,':structure_uai'=>$structure_uai,':localisation'=>$localisation,':denomination'=>$denomination,':contact_nom'=>$contact_nom,':contact_prenom'=>$contact_prenom,':contact_courriel'=>$contact_courriel,':inscription_date'=>$inscription_date); DB::query(SACOCHE_WEBMESTRE_BD_NAME , $DB_SQL , $DB_VAR); } // Génération des paramètres de connexion à la base de données $BD_name = 'sac_base_'.$base_id; // Limité à 64 caractères (tranquille...) $BD_user = '******'.$base_id; // Limité à 16 caractères (attention !) $BD_pass = fabriquer_mdp(); // Créer le fichier de connexion de la base de données de la structure fabriquer_fichier_connexion_base($base_id,SACOCHE_WEBMESTRE_BD_HOST,SACOCHE_WEBMESTRE_BD_PORT,$BD_name,$BD_user,$BD_pass); // Créer la base de données de la structure DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE DATABASE sac_base_'.$base_id ); // Créer un utilisateur pour la base de données de la structure et lui attribuer ses droits // On doit créer en réalité un user sur "localhost" et un autre sur "%" car on doit pouvoir se connecter suivant les configurations depuis la machine locale comme depuis n'importe quel autre serveur (http://dev.mysql.com/doc/refman/5.0/fr/adding-users.html). DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE USER '.$BD_user.'@"localhost" IDENTIFIED BY "'.$BD_pass.'"' ); DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE USER '.$BD_user.'@"%" IDENTIFIED BY "'.$BD_pass.'"' ); DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$BD_name.'.* TO '.$BD_user.'@"localhost"' ); DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$BD_name.'.* TO '.$BD_user.'@"%"' ); /* Il reste à : + Lancer les requêtes pour installer et remplir les tables, éventuellement personnaliser certains paramètres de la structure + Insérer le compte administrateur dans la base de cette structure, éventuellement lui envoyer un courriel + Créer un dossier pour les les vignettes images */ return $base_id; }