Skip to content
Snippets Groups Projects
process_users_entities_to_maarch.php 14.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alex ORLUC's avatar
    Alex ORLUC committed
    <?php
    session_start();
    //on charge le fichier config.xml du dossier apps/maarch_entreprise/xml pour pouvoir récupérer les données de connexion à la base de données.
    //$xml = simplexml_load_file('../../../apps/maarch_entreprise/xml/config.xml');
    $nomFichier = date('Y-m-d_H-i-s') . '.log'; //nom du fichier log enregistrer dans le dossier logLdap
    
    $fichier = 'ldap_users';
    
    echo "... CHARGEMENT DU FICHIER DE CONFIGURATION ...\n";
    if( !isset($argv) ){
    
        exit(htmlentities("Ce script ne peut-etre appelé qu'en PHP CLI"));
    
    }else if( isset($argv) && count($argv) < 2){
    
        exit("Erreur de Syntaxe !\nLa syntaxe est $argv[0] <fichier de conf xml> <xml de sortie>\n\n");
    
    }else if(!file_exists($argv[1])){
    
        exit("/!\ Le fichier de configuration n'existe pas!\n\n");
    
    }else{
    
        $ldap_conf_file = trim($argv[1]);
        echo "Fichier OK !\n\n";
    }
    //Extraction de /root/config dans le fichier de conf
    $ldap_conf = new DomDocument();
    try
    {
        $ldap_conf->load($ldap_conf_file);
    }
    catch(Exception $e)
    { 
        exit("/!\ Impossible de charger le document : ".$ldap_conf_file."\n
            Erreur : ".$e.getMessage."\n\n");
    }
    
    //**********************************//
    //          FILTER AND DNs          //
    //**********************************//
    $i=0;
    $xp_ldap_conf = new domxpath($ldap_conf);
    foreach( $xp_ldap_conf->query("/root/filter/dn/@id") as $dn)
    {
    
        $type = $xp_ldap_conf->query("/root/filter/dn[@id= '".$dn->nodeValue."']/@type")->item(0)->nodeValue;    //echo "for each filter ok\n";
        //$dn_and_filter[$i][$dn->nodeName] = $dn->nodeValue;
        //echo "nodename : ".$dn_and_filter[$i][$dn->nodeName]."\n";
        if($type=='entities'){
            $dn_and_filter[$i]['id'] = $dn->nodeValue;
        }
    }
    unset($i);
    $DnsEntities=array();
    foreach ($dn_and_filter as $key => $value) {
        $DnsEntities[]=$value['id'];
    }
    //print_r($DnsEntities);
    
    //on charge le fichier config.xml pour pouvoir récupérer les données de connexion à la base de données.
    $xml = simplexml_load_file($ldap_conf_file);
    $host = $xml->config_base->databaseserver;
    $dbname = $xml->config_base->databasename;
    $user= $xml->config_base->databaseuser;
    $password = $xml->config_base->databasepassword;
    
    //echo 'host : '.$host;echo "\n";
    //echo 'dbname :'.$dbname;echo "\n";
    //echo 'user : '.$user;echo "\n";
    //echo 'password :'.$password;echo "\n";
    
    echo "... CONNEXION A LA BASE DE DONNEES MAARCH ...\n";
    
    // Connexion, sélection de la base de données
    try {
        $db = new PDO("pgsql:host=$host;dbname=$dbname", "$user", "$password");
        echo 'Connexion OK'."\n\n";
    }
    catch(PDOException $e) {
        $db = null;
        echo '/!\ Erreur de connexion: ' . $e->getMessage()."\n\n";
        exit;
    }
    
    $xp_ldap_conf = new domxpath($ldap_conf);
    
    foreach($xp_ldap_conf->query("/root/config/*") as $cf)
        ${$cf->nodeName} = $cf->nodeValue;
    
    //Si une class custom est définie
    
    if( file_exists(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php") )
        include(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php");
    
    //Sinon si la class est définie pour le module  
    else if( file_exists(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php") )
        include(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php");
    
    //Sinon
    else
        exit("Impossible de charger class_".$type_ldap.".php\n");
    
    //**********************************//
    //          LDAP CONNECTION         //
    //**********************************//
    
    echo "... CONNEXION A L'ANNUAIRE $type_ldap ...\n";
    //Try to create a new ldap instance
    try
    {
        if($prefix_login != ''){
            $login_admin =$prefix_login."\\".$login_admin;
        }
        $ad = new LDAP($domain,$login_admin,$pass,false);
        echo "Connexion Ldap ok\n\n";
    }
    catch(Exception $con_failure)
    {
        exit("/!\ Impossible de se connecter à l'annuaire\n
            Erreur : ".$con_failure->getMessage()."\n\n");
    }
    
    /**
    Les Fonctions
    */
    
    
    /* 
    Fonction qui permet de récupérer l'information de la balise concernée dans le fichier xml
    **/
    function infoBalise($description, $balise)
    {
        if($description == NULL) {
            return $contenu = '';
    
        }else{
            $contenu = NULL;
            $contenubalise = $description ->getElementsByTagName($balise);
            foreach($contenubalise as $contenu){
                $contenu = $contenu->firstChild->nodeValue . "";
            }
            //echo $contenu."\n";
            return $contenu ;
        }
    }
    
    
        /*Fonction qui va llire les memberofs du ldap.xml*/
        function infoMemberOf($description, $balise,$OU)
        {
            if($description == NULL) {
                return $contenu = '';}
                else{
                    $contenu = NULL;
                    $contenubalise = $description ->getElementsByTagName($balise);
                    foreach($contenubalise as $contenu)
                        $contenu = $contenu->firstChild->nodeValue . "";
                    $nomGroupe = strstr($contenu, $OU, true);
                    if($nomGroupe != false and $contenu != null){return $contenu;}elseif($nomGroupe == false and $contenu == null){return null;}elseif($nomGroupe == false and $contenu !=null){return ok;}
                }
            }
    
    
            /*Fonction qui va vérifier si l'utilisateur est dans la table des users ou non*/
            function verifUser($user_id, $db)
            {
                $qry = $db->prepare("SELECT * from users where upper(user_id) = upper(?)"); 
                $qry->execute(array($user_id));
                while ($row = $qry->fetch()){
                    $user_id = $row['user_id'];
                    if($user_id == null){echo "le pseudo $user_id n'a pas été trouvé dans la base !";
                    return false; }else{echo "le pseudo $user_id a été trouvé dans la base";
                    return true;}
                }
            }
    
            /*Fonction qui va vérifier les données de l'utilisateur dans la table users. Si il y a des données qui ne sont pas à jour, la fonction fait le update pour mettre à jour. */
            function verifUpdate($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$db)
            {
    
                $qry = $db->prepare("SELECT * from users where upper(user_id) = upper(?) and firstname = ? and lastname = ? and phone = ? and mail = ? and custom_t3 = ? and status = 'OK'");   
                $qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber));
                $result = $qry->fetchAll();
                if($result==null){
    
                    echo "les donnees doivent etre mis a jour !";
                    $qry = $db->prepare("UPDATE users set  user_id = ?, firstname = ? , lastname = ? , phone = ? , mail = ?,custom_t3 = ?, status = 'OK', loginmode = 'standard' where upper(user_id) = upper(?) ");    
                    $result = $qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$user_id));
                    $result = $qry->fetchAll();
                    if($result==null){
                        echo "Error, données non mises à jours!";
                    }else{
                        echo "données mises à jour!";
                    }
                }else{
                    echo "les donnees de users sont a jour \n";
                    return true;
                }
            }
    
            /*Function qui va insérer l'utilisateur dans la table des users. Si l'utilisateur n'est pas présent, on lui done le mot de passe de maarch*/
            function insertUser($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$db)
            {
    
                $qry = $db->prepare("INSERT into users (user_id, password, firstname, lastname, phone, mail, custom_t3, enabled, change_password, status,loginmode) values (upper(?),'ef9689be896dacd901cae4f13593e90d',?,?,?,?,?,'Y','Y','OK','standard')");   
                $qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber));
                $result = $qry->fetchAll();
                if($result==null){
                    echo "Error : les donnees n'ont pas ete ajouté !\n";
                    return false;
                }else{
                    echo "la ligne a été ajouté \n";
                    return true;
                }
            }
    
    
    
    Florian Azizian's avatar
    Florian Azizian committed
            /*Fonction qui va supprimer tous les users de la table users_entities lorsque les entitées ne sont pas présente dans le ldap*/
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            function deleteUsersEntities($idEntitiesTab,$user_id, $db)
            {
    
                $qry ="SELECT * from users_entities where user_id ='$user_id' and ";
                $qry .= " entity_id not in ('".implode("','",$idEntitiesTab)."')";
                $qry = $db->prepare($qry);
                $qry->execute();
                $result = $qry->fetchAll();
                if(!empty($result)){
                    echo "Dissociation des anciens services affectes aux utilisateurs ...\n";
                    $qry = "delete from users_entities where user_id ='$user_id' and ";
                    $qry .= " entity_id not in ('".implode("','",$idEntitiesTab)."')";
                    $qry = $db->prepare($qry);
                    $qry->execute();
                    $result = $qry->fetchAll();
                }else{
                    echo "les services sont a jour pour l'utilisateur $user_id! \n";
                }
            }
    
    
    
            /*Fontion qui va écrire dans le fichier log . Cela permet de faire un suivie du processus*/
            function ecrire_log($event,$nomFichier){
    
    /*        $fp = fopen('var/www/html/maarch_entreprise_prod/modules/ldap/logLdap/'.$nomFichier,'a+'); // ouvrir le fichier ou le créer
            fseek($fp,SEEK_END); // poser le point de lecture à la fin du fichier
            $nouverr=date('Y-m-d_H-i-s')." : ".$event."\r\n"; // ajouter un retour à la ligne au fichier
            fputs($fp,$nouverr); // ecrire ce texte
            fclose($fp); //fermer le fichier */
        }
    
    
    
        function seekEntityId($ldap_id, $db){
    
            $qry = $db->prepare("SELECT entity_id, entity_label from entities WHERE ldap_id= ? ");
            if($qry->execute(array($ldap_id))){
              while($row = $qry->fetch()){
                  //echo "la valeur de la requete pour seekParentEntityId est : ".$row['entity_id']."\n";
                  $info = $row['entity_id'];
              }
          }
          return $info;
      }
    
    
      function insertUserEntity($pseudo, $entity_id, $db){
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        $is_primary='Y';
        $qry=$db->prepare("SELECT * from users_entities where user_id = ?");
        $qry->execute(array($pseudo));
        $result = $qry->fetchAll();
        if(empty($result)){
            $is_primary='Y';
        }else{
            $is_primary='N';
        }
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        $qry=$db->prepare("SELECT * from users_entities where user_id = ? and entity_id = ? ");
        $result = null;
        $qry->execute(array($pseudo,$entity_id));
        $result = $qry->fetchAll();
        //print_r($qry->errorInfo());
        if($result != null){
            echo "les donnees de users_entities sont a jour \n";
        }else{
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            echo "les donnees de users_entities doivent etre mis a jour!";
            $qry2=$db->prepare("INSERT into users_entities (user_id,entity_id, primary_entity) values (?,?,?)");
            $result2 = $qry2->execute(array($pseudo, $entity_id, $is_primary));
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            //print_r($qry2->errorInfo());
            $result2 = $qry2->fetchAll();
            if($result2 ==null){
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                echo "Error, aucun users_entities n'a ete ajoute \n";
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            }else{ echo "Insertion du users_entities effectue! \n";}
        }
    }
    
    /**
    Chargement du fichier xml
    */
    
    $dom = new DomDocument();
    echo "... TRAITEMENT du fichier $fichier ...\n";
    if(!($dom->load('../xml/'.$fichier.'.xml')))
    {
        //echo "fichier : ".$fichier;
        $event = "Unable to load : " . $fichier.'.xml'."\n";
        echo $event;
        //ecrire_log($event,$nomFichier);
        exit();
    }else{
        $event = "able to load : " . $fichier.'.xml'."\n";
        echo $event;
        //ecrire_log($event,$nomFichier);
    }
    
    
    /*On compte le nombre d'item dans le fichier xml. Ceci est réalisé car le nom de la balise est item suivi d'un chiffre*/
    for($m = 0; ;$m++)
    {
        $nomItem = 'item_'.$m;
        $list = $dom->getElementsByTagName("ldap_info")->item(0);
        $listItem = $list->getElementsByTagName($nomItem)->item(0);
        if($listItem == NULL){break;}
    }
    
    
    /**
    Lecture du fichier ldap.xml des users pour mise à jours des données des tables users et users_entities
    */
    
    
    $idUsersTab= array('superadmin'); //Ce tableau est initialisé avec superadmin pour qu'il ne soit pas passé en DEL lors de la mise à jour des users.
    /*Boucle qui permet de travailler sur les données contenues dans le fichier xml. On récupère les données puis on les insère dans la table users_entities*/
    for($i = 0; $i<$m ; $i++)
    {
        $nomItem = 'item_'.$i;
    
        $list = $dom->getElementsByTagName("ldap_info")->item(0);
        $listItem = $list->getElementsByTagName($nomItem)->item(0);
    
        $user_id = infoBalise($listItem, 'xml_user_id');
    
        if($user_id == NULL){
            $event = "Id du User de l'$nomItem absent, arret du processus";
            //ecrire_log($event,$nomFichier);break;
        }
        echo("=============== $user_id ===============\n");
        echo("-------------Informations-------------\n");
        echo "+ xml :     $nomItem\n";
        echo "+ user_id : $user_id\n";
        echo("--------------------------------------\n");
        /*On Recherche les memberOf*/
    
        echo ".\n";
        echo ".\n";
        echo ".\n";
        echo "... RECHERCHE DE MEMBER OF ...\n";
        echo ".\n";
        echo ".\n";
        echo ".\n\n";
    
        $user_entity = $listItem->getElementsByTagName('xml_user_entity')->item(0);
    
        /*On initialise le tableau idEntitiesTab pour stocker les entités récupérées des membersOf*/
        $user_entities = array();
    
        //La boucle permet de récupérer les données de chaques memberOf.
        for($j = 0; ; $j++)
        {
            $nomItem = 'xml_'.$j;
            $dnMemberof = infoBalise($user_entity, $nomItem);
            // on arrête la lecture des memberof si cnMemberof est null
            if($dnMemberof == ''){break;}
            //$pos = strpos($cnMemberof, $DnsEntities[$key]);
            if (preg_match('/'.$DnsEntities[0].'/', $dnMemberof)) {
    
                $entity_ldap_id = $ad->group_info($dnMemberof,array('objectguid'),$DnsEntities[0]);
                $entity_ldap_id=$entity_ldap_id['objectguid'];
                $entityId=seekEntityId($entity_ldap_id, $db);
                echo("-------------Entite associee-------------\n");
                echo "+ xml :       $nomItem\n";
                echo "+ DN entity : $dnMemberof\n";
                echo "+ ldap_id :   $entity_ldap_id\n";
                echo "+ entity_id : $entityId\n";
                echo("----------------------------------------\n");
                if(!empty($user_id) and !empty($entityId)){
    
                    insertUserEntity($user_id,$entityId,$db);
                }
                $user_entities[]=$entityId;
            }
    }
    
    if($dnMemberof != ''){
        deleteUsersEntities($user_entities,$user_id,$db);
    }
    
    if($dnMemberof == '' && $j==0){
        echo "... PAS DE MEMBER OF! ...\n";
    }
    echo("========================================\n\n\n");
    }
    
    
    //print_r($idUsersTab);
    
    ?>