[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/var/www/se3/includes/ -> crob_ldap_functions.php (source)

   1  <?php
   2  
   3  
   4     /**
   5     * Fonctions pour l'import sconet
   6  
   7     * @Version $Id: crob_ldap_functions.php 8300 2014-12-06 15:20:12Z dbo $
   8  
   9     * @Projet LCS / SambaEdu
  10  
  11     * @Auteurs Stephane Boireau
  12  
  13     * @Note
  14  
  15     * @Licence Distribue sous la licence GPL
  16     */
  17  
  18     /**
  19  
  20     * file: crob_ldap_functions.inc.php
  21     * @Repertoire: includes/
  22     */
  23  
  24  
  25  
  26  
  27  //================================================
  28  // Correspondances de caractères accentués/désaccentués
  29  $liste_caracteres_accentues   ="ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸";
  30  $liste_caracteres_desaccentues="AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz";
  31  //================================================
  32  
  33  /**
  34  
  35  * Fonction de generation de mot de passe recuperee sur TotallyPHP
  36  * Aucune mention de licence pour ce script...
  37  
  38  * @Parametres
  39  * @Return 1 ou 0
  40  
  41  * The letter l (lowercase L) and the number 1
  42  * have been removed, as they can be mistaken
  43  * for each other.
  44  */
  45  
  46  function createRandomPassword($nb_chars) {
  47      $chars = "abcdefghijkmnopqrstuvwxyz023456789";
  48      srand((double)microtime()*1000000);
  49      $i = 0;
  50      $pass = '' ;
  51  
  52      //while ($i <= 7) {
  53      //while ($i <= 5) {
  54      while ($i <= $nb_chars) {
  55          $num = rand() % 33;
  56          $tmp = substr($chars, $num, 1);
  57          $pass = $pass . $tmp;
  58          $i++;
  59      }
  60  
  61      return $pass;
  62  }
  63  //================================================
  64  
  65  /**
  66  
  67  * Fonction qui retourne la date et l'heure
  68  
  69  * @Parametres
  70  * @Return jour/moi/annee heure:mn:seconde
  71  
  72  */
  73  
  74  function date_et_heure() {
  75      $instant = getdate();
  76      $annee = $instant['year'];
  77      $mois = sprintf("%02d",$instant['mon']);
  78      $jour = sprintf("%02d",$instant['mday']);
  79      $heure = sprintf("%02d",$instant['hours']);
  80      $minute = sprintf("%02d",$instant['minutes']);
  81      $seconde = sprintf("%02d",$instant['seconds']);
  82  
  83      $retour="$jour/$mois/$annee $heure:$minute:$seconde";
  84  
  85      return $retour;
  86  }
  87  
  88  
  89  //================================================
  90  
  91  /**
  92  
  93  * Lit le fichier ssmtp et en retourne le contenu
  94  
  95  * @Parametres
  96  * @Return
  97  
  98  */
  99  
 100  function lireSSMTP() {
 101      $chemin_ssmtp_conf="/etc/ssmtp/ssmtp.conf";
 102  
 103      $tabssmtp=array();
 104  
 105      if(file_exists($chemin_ssmtp_conf)) {
 106          $fich=fopen($chemin_ssmtp_conf,"r");
 107          if(!$fich){
 108              return false;
 109          }
 110          else{
 111              while(!feof($fich)){
 112                  $ligne=fgets($fich,4096);
 113                  if(strstr($ligne,"root=")){
 114                      unset($tabtmp);
 115                      $tabtmp=explode('=',$ligne);
 116                      $tabssmtp["root"]=trim($tabtmp[1]);
 117                  }
 118                  elseif(strstr($ligne,"mailhub=")){
 119                      unset($tabtmp);
 120                      $tabtmp=explode('=',$ligne);
 121                      $tabssmtp["mailhub"]=trim($tabtmp[1]);
 122                  }
 123                  elseif(strstr($ligne,"rewriteDomain=")){
 124                      unset($tabtmp);
 125                      $tabtmp=explode('=',$ligne);
 126                      $tabssmtp["rewriteDomain"]=trim($tabtmp[1]);
 127                  }
 128              }
 129              fclose($fich);
 130  
 131              return $tabssmtp;
 132          }
 133      }
 134      else {
 135          return false;
 136      }
 137  }
 138  
 139  
 140  //================================================
 141  
 142  /**
 143  
 144  * Affiche le texte ou l ecrit dans un fichier
 145  * @Parametres texte
 146  * @Return
 147  
 148  */
 149  
 150  function my_echo($texte){
 151      global $echo_file, $dest_mode;
 152  
 153      $destination=$dest_mode;
 154  
 155      if((!file_exists($echo_file))||($echo_file=="")){
 156          $destination="";
 157      }
 158  
 159      switch($destination){
 160          case "file":
 161              $fich=fopen($echo_file,"a+");
 162              fwrite($fich,"$texte");
 163              fclose($fich);
 164              break;
 165          default:
 166              echo "$texte";
 167              break;
 168      }
 169  }
 170  
 171  //================================================
 172  
 173  /**
 174  
 175  * Affiche le tableau à la façon de print_r ou l ecrit dans un fichier
 176  * @Parametres tableau
 177  * @Return
 178  
 179  */
 180  
 181  function my_print_r($tab) {
 182      global $echo_file, $dest_mode;
 183  
 184      my_echo("Array<br />(<br />\n");
 185      my_echo("<blockquote>\n");
 186      foreach($tab as $key => $value) {
 187          if(is_array($value)) {
 188              my_echo("[$key] =&gt; ");
 189              my_print_r($value);
 190          }
 191          else {
 192              my_echo("[$key] =&gt; $value<br />\n");
 193          }
 194      }
 195      my_echo("</blockquote>\n");
 196      my_echo(")<br />\n");
 197  }
 198  
 199  
 200  //================================================
 201  
 202  /**
 203  
 204  * remplace les accents
 205  * @Parametres chaine a traiter
 206  * @Return la chaine sans accents
 207  
 208  */
 209  
 210  function remplace_accents($chaine){
 211      global $liste_caracteres_accentues, $liste_caracteres_desaccentues;
 212      //$retour=strtr(ereg_replace("¼","OE",ereg_replace("½","oe",$chaine)),"ÀÄÂÉÈÊËÎÏÔÖÙÛÜÇçàäâéèêëîïôöùûü","AAAEEEEIIOOUUUCcaaaeeeeiioouuu");
 213      //$retour=strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$chaine"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz");
 214      $retour=strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$chaine"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues");
 215      return $retour;
 216  }
 217  
 218  //================================================
 219  
 220  /**
 221  
 222  * dédoublonnage des espaces dans une chaine
 223  * @Parametres chaine a traiter
 224  * @Return la chaine sans doublons d'espaces
 225  
 226  */
 227  
 228  function traite_espaces($chaine) {
 229      //$chaine="  Bla   ble bli  blo      blu  ";
 230      /*
 231      $tab=explode(" ",$chaine);
 232  
 233      $retour=$tab[0];
 234      for($i=1;$i<count($tab);$i++) {
 235          if($tab[$i]!="") {
 236              $retour.=" ".$tab[$i];
 237          }
 238      }
 239      */
 240      $retour=preg_replace("/ {2,}/"," ",$chaine);
 241      $retour=trim($retour);
 242      return $retour;
 243  }
 244  
 245  //================================================
 246  
 247  /**
 248  
 249  * remplacement des apostrophes et espaces par des underscore
 250  * @Parametres chaine a traiter
 251  * @Return la chaine nettoyee
 252  
 253  */
 254  
 255  function apostrophes_espaces_2_underscore($chaine) {
 256      $retour=preg_replace("/'/","_",preg_replace("/ /","_",$chaine));
 257      return $retour;
 258  }
 259  
 260  //================================================
 261  
 262  /**
 263  
 264  * traitement des chaines accentuees (simpleXML recupere des chaines UTF8, meme si l'entete du XML est ISO)
 265  * @Parametres chaine a traiter
 266  * @Return la chaine correctement encodee
 267  
 268  */
 269  
 270  function traite_utf8($chaine) {
 271      // On passe par cette fonction pour pouvoir desactiver rapidement ce traitement s'il ne se revele plus necessaire
 272      //$retour=$chaine;
 273  
 274      // mb_detect_encoding($chaine . 'a' , 'UTF-8, ISO-8859-1');
 275  
 276      //$retour=utf8_decode($chaine);
 277      // utf8_decode() va donner de l'iso-8859-1 d'ou probleme sur quelques caracteres
 278  
 279      //$retour=recode_string("utf8..lat9", $chaine);
 280      //Warning: recode_string(): Illegal recode request 'utf8..lat9' in /var/www/se3/includes/crob_ldap_functions.php on line 277
 281  
 282      $retour=recode_string("utf8..iso-8859-15", $chaine);
 283      return $retour;
 284  }
 285  
 286  //================================================
 287  
 288  /**
 289  
 290  * Retourne des infos sur l'admin ldap
 291  * @Parametres
 292  * @Return
 293  
 294  */
 295  
 296  function get_infos_admin_ldap(){
 297      //global $dn;
 298      global $ldap_base_dn;
 299  
 300      $adminLdap=array();
 301  
 302      // Etablir la connexion au serveur et la selection de la base?
 303  
 304      $sql="SELECT value FROM params WHERE name='adminRdn'";
 305      $res1=mysql_query($sql);
 306      if(mysql_num_rows($res1)==1){
 307          $lig_tmp=mysql_fetch_object($res1);
 308          $adminLdap["adminDn"]=$lig_tmp->value.",".$ldap_base_dn;
 309      }
 310  
 311      $sql="SELECT value FROM params WHERE name='adminPw'";
 312      $res2=mysql_query($sql);
 313      if(mysql_num_rows($res2)==1){
 314          $lig_tmp=mysql_fetch_object($res2);
 315          $adminLdap["adminPw"]=$lig_tmp->value;
 316      }
 317  
 318      return $adminLdap;
 319  }
 320  
 321  
 322  //================================================
 323  
 324  /**
 325  
 326  * test si l'ou trash existe sinon la cree
 327  * @Parametres
 328  * @Return
 329  
 330  */
 331  
 332  
 333  function test_creation_trash(){
 334      global $ldap_server, $ldap_port, $dn, $ldap_base_dn;
 335      global $error;
 336      $error="";
 337  
 338      // Parametres
 339      // Aucun
 340  
 341      // Tableau retourne
 342      $tab=array();
 343  
 344      fich_debug("======================\n");
 345      fich_debug("test_creation_trash:\n");
 346  
 347      $ds=@ldap_connect($ldap_server,$ldap_port);
 348      if($ds){
 349          $r=@ldap_bind($ds);// Bind anonyme
 350          if($r){
 351              $attribut=array("ou","objectClass");
 352  
 353              // A REVOIR... LE TEST MERDOUILLE... IL A L'AIR DE RETOURNER vrai meme si ou=Trash n'existe pas
 354  
 355              $result=ldap_search($ds,$ldap_base_dn,"ou=Trash",$attribut);
 356              fich_debug("ldap_search($ds,\"$ldap_base_dn\",\"ou=Trash\",$attribut)\n");
 357              //echo "<p>ldap_search($ds,$dn[$branche],\"$filtre\",$attribut);</p>";
 358              if($result){
 359                  fich_debug("La branche Trash existe.\n");
 360                  @ldap_free_result($result);
 361              }
 362              else{
 363                  fich_debug("La branche Trash n'existe pas.\n");
 364  
 365                  // On va la creer.
 366                  unset($attributs);
 367                  $attributs=array();
 368                  $attributs["ou"]="Trash";
 369                  $attributs["objectClass"]="organizationalUnit";
 370  
 371                  //$r=@ldap_bind($ds);// Bind anonyme
 372                  $adminLdap=get_infos_admin_ldap();
 373                  $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP
 374                  if($r){
 375                      $dn_entree="ou=Trash,".$ldap_base_dn;
 376                      fich_debug("Cr&#233;ation de la branche: ");
 377                      $result=ldap_add($ds,"$dn_entree",$attributs);
 378                      if(!$result){
 379                          $error="Echec d'ajout de l'entree ou=Trash";
 380                          fich_debug("ECHEC\n");
 381                          fich_debug("\$error=$error\n");
 382                      }
 383                      else{
 384                          fich_debug("SUCCES\n");
 385                      }
 386                      @ldap_free_result($result);
 387                  }
 388                  else{
 389                      $error=gettext("Echec du bind admin LDAP");
 390                      fich_debug("\$error=$error\n");
 391                  }
 392              }
 393          }
 394          else{
 395              $error=gettext("Echec du bind anonyme");
 396              fich_debug("\$error=$error\n");
 397          }
 398          @ldap_close($ds);
 399      }
 400      else{
 401          $error=gettext("Erreur de connection au serveur LDAP");
 402          fich_debug("\$error=$error\n");
 403      }
 404  
 405      if($error!=""){
 406          echo "error=$error<br />\n";
 407      }
 408  }
 409  
 410  
 411  //================================================
 412  
 413  /**
 414  
 415  * Ajoute une entree dans l'annuaire
 416  * @Parametres
 417  * @Return
 418  
 419  */
 420  
 421  
 422  function add_entry ($entree, $branche, $attributs){
 423      global $ldap_server, $ldap_port, $dn;
 424      global $error;
 425      $error="";
 426  
 427      // Parametres:
 428      /*
 429          $entree: uid=toto
 430          $branche: people, groups,... ou rights
 431          $attributs: tableau associatif des attributs
 432      */
 433  
 434      $ds=@ldap_connect($ldap_server,$ldap_port);
 435      if($ds){
 436          //$r=@ldap_bind($ds);// Bind anonyme
 437          $adminLdap=get_infos_admin_ldap();
 438          $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP
 439          if($r){
 440              $dn_entree="$entree,".$dn["$branche"];
 441              $result=ldap_add($ds,"$dn_entree",$attributs);
 442              if(!$result){
 443                  $error="Echec d'ajout de l'entree $entree";
 444              }
 445              @ldap_free_result($result);
 446          }
 447          else{
 448              $error=gettext("Echec du bind admin LDAP");
 449          }
 450          @ldap_close($ds);
 451      }
 452      else{
 453          $error=gettext("Erreur de connection au serveur LDAP");
 454      }
 455  
 456      if($error==""){
 457          return true;
 458      }
 459      else{
 460          //echo "<p>$error</p>";
 461          return false;
 462      }
 463  }
 464  
 465  
 466  //================================================
 467  
 468  /**
 469  
 470  * Supprime une entree de l'annuaire
 471  * @Parametres
 472  * @Return
 473  
 474  */
 475  
 476  function del_entry ($entree, $branche){
 477      global $ldap_server, $ldap_port, $dn;
 478      global $error;
 479      $error="";
 480  
 481      // Parametres:
 482      /*
 483          $entree: uid=toto
 484          $branche: people, groups,... ou rights
 485      */
 486  
 487      $ds=@ldap_connect($ldap_server,$ldap_port);
 488      if($ds){
 489          //$r=@ldap_bind($ds);// Bind anonyme
 490          $adminLdap=get_infos_admin_ldap();
 491          $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP
 492          if($r){
 493              $result=ldap_delete($ds,"$entree,".$dn["$branche"]);
 494              if(!$result){
 495                  $error="Echec de la suppression de l'entree $entree";
 496              }
 497              @ldap_free_result($result);
 498          }
 499          else{
 500              $error=gettext("Echec du bind admin LDAP");
 501          }
 502          @ldap_close($ds);
 503      }
 504      else{
 505          $error=gettext("Erreur de connection au serveur LDAP");
 506      }
 507  
 508      if($error==""){
 509          return true;
 510      }
 511      else{
 512          //echo "<p>$error</p>";
 513          return false;
 514      }
 515  }
 516  
 517  
 518  
 519  //================================================
 520  
 521  /**
 522  
 523  * Modifie une entree dans l'annuaire
 524  * @Parametres
 525  * @Return
 526  
 527  */
 528  
 529  function modify_entry ($entree, $branche, $attributs){
 530      global $ldap_server, $ldap_port, $dn;
 531      global $error;
 532      $error="";
 533  
 534      // Je ne suis pas sur d'avoir bien saisi le fonctionnement de la fonction ldap_modify() de PHP
 535      // Du coup, je lui ai prefere les fonctions ldap_mod_add(), ldap_mod_del() et ldap_mod_replace() utilisees dans ma fonction modify_attribut()
 536  
 537      // Parametres:
 538      /*
 539          $entree: uid=toto
 540          $branche: people, groups,... ou rights
 541          $attributs: tableau associatif des attributs
 542      */
 543  
 544      $ds=@ldap_connect($ldap_server,$ldap_port);
 545      if($ds){
 546          //$r=@ldap_bind($ds);// Bind anonyme
 547          $adminLdap=get_infos_admin_ldap();
 548          $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP
 549          if($r){
 550              $result=ldap_modify($ds,"$entree,".$dn["$branche"],$attributs);
 551              if(!$result){
 552                  $error="Echec d'ajout de l'entree $entree";
 553              }
 554              @ldap_free_result($result);
 555          }
 556          else{
 557              $error=gettext("Echec du bind en admin");
 558          }
 559          @ldap_close($ds);
 560      }
 561      else{
 562          $error=gettext("Erreur de connection au serveur LDAP");
 563      }
 564  
 565      if($error==""){
 566          return true;
 567      }
 568      else{
 569          return false;
 570      }
 571  }
 572  
 573  
 574  //================================================
 575  
 576  /**
 577  
 578  * Modifie un attribut dans l'annuaire
 579  * @Parametres
 580  * @Return
 581  
 582  */
 583  
 584  
 585  function modify_attribut ($entree, $branche, $attributs, $mode){
 586      global $ldap_server, $ldap_port, $dn;
 587      global $error;
 588      $error="";
 589  
 590      // Parametres:
 591      /*
 592          $entree: uid=toto
 593          $branche: people, groups,... ou rights
 594          $attribut: tableau associatif des attributs a modifier
 595          $mode: add replace ou del
 596  
 597          // Pour del aussi, il faut fournir la bonne valeur de l'attribut pour que cela fonctionne
 598          // On peut ajouter, modifier, supprimer plusieurs attributs a la fois.
 599      */
 600  
 601      $ds=@ldap_connect($ldap_server,$ldap_port);
 602      if($ds){
 603          //$r=@ldap_bind($ds);// Bind anonyme
 604          $adminLdap=get_infos_admin_ldap();
 605          $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP
 606          if($r){
 607              switch($mode){
 608                  case "add":
 609                      $result=ldap_mod_add($ds,"$entree,".$dn["$branche"],$attributs);
 610                      break;
 611                  case "del":
 612                      $result=ldap_mod_del($ds,"$entree,".$dn["$branche"],$attributs);
 613                      break;
 614                  case "replace":
 615                      $result=ldap_mod_replace($ds,"$entree,".$dn["$branche"],$attributs);
 616                      break;
 617              }
 618              if(!$result){
 619                  $error="Echec d'ajout de la modification $mode sur $entree";
 620              }
 621              @ldap_free_result($result);
 622          }
 623          else{
 624              $error=gettext("Echec du bind en admin");
 625          }
 626          @ldap_close($ds);
 627      }
 628      else{
 629          $error=gettext("Erreur de connection au serveur LDAP");
 630      }
 631  
 632      if($error==""){
 633          return true;
 634      }
 635      else{
 636          return false;
 637      }
 638  }
 639  
 640  
 641  /*
 642  function crob_init() {
 643      // Recuperation de variables dans la base MySQL se3db
 644      //global $domainsid,$uidPolicy;
 645          global $defaultgid,$domain,$defaultshell,$domainsid;
 646  
 647      $domainsid="";
 648      $sql="select value from params where name='domainsid';";
 649      $res=mysql_query($sql);
 650      if(mysql_num_rows($res)==1){
 651          $lig_tmp=mysql_fetch_object($res);
 652          $domainsid=$lig_tmp->value;
 653      } else {
 654              // Cas d'un LCS ou sambaSID n'est pas dans la table params
 655              unset($retval);
 656              exec ("ldapsearch -x -LLL  objectClass=sambaDomain | grep sambaSID | cut -d ' ' -f 2",$retval);
 657              $domainsid = $retval[0];
 658              // Si il n'y a pas de sambaSID dans l'annuaire, on fixe une valeur factice
 659              // Il faudra appliquer un correct SID lors de l'installation d'un se3
 660              if (!isset($domainsid)) $domainsid ="S-0-0-00-0000000000-000000000-0000000000";
 661          }
 662  
 663      $uidPolicy="";
 664      $sql="select value from params where name='uidPolicy';";
 665      $res=mysql_query($sql);
 666      if(mysql_num_rows($res)==1){
 667          $lig_tmp=mysql_fetch_object($res);
 668          $uidPolicy=$lig_tmp->value;
 669      }
 670  
 671      $defaultgid="";
 672      $sql="select value from params where name='defaultgid';";
 673      $res=mysql_query($sql);
 674      if(mysql_num_rows($res)==1){
 675          $lig_tmp=mysql_fetch_object($res);
 676          $defaultgid=$lig_tmp->value;
 677      } else {
 678              // Cas d'un LCS ou defaultgid n'est pas dans la table params
 679              exec ("getent group lcs-users | cut -d ':' -f 3", $retval);
 680              $defaultgid= $retval[0];
 681          }
 682  
 683      $domain="";
 684      $sql="select value from params where name='domain';";
 685      $res=mysql_query($sql);
 686      if(mysql_num_rows($res)==1){
 687          $lig_tmp=mysql_fetch_object($res);
 688          $domain=$lig_tmp->value;
 689      }
 690  
 691      $defaultshell="";
 692      $sql="select value from params where name='defaultshell';";
 693      $res=mysql_query($sql);
 694      if(mysql_num_rows($res)==1){
 695          $lig_tmp=mysql_fetch_object($res);
 696          $defaultshell=$lig_tmp->value;
 697      }
 698  }
 699  */
 700  
 701  
 702  //================================================
 703  
 704  /**
 705  
 706  * Active le mode debug
 707  * @Parametres
 708  * @Return
 709  
 710  */
 711  
 712  function fich_debug($texte){
 713      // Passer la variable ci-dessous a 1 pour activer l'ecriture d'infos de debuggage dans /tmp/debug_se3lcs.txt
 714      // Il conviendra aussi d'ajouter des appels fich_debug($texte) la ou vous en avez besoin;o).
 715      $debug=0;
 716  
 717      if($debug==1){
 718          $fich=fopen("/tmp/debug_se3lcs.txt","a+");
 719          fwrite($fich,$texte);
 720          fclose($fich);
 721      }
 722  }
 723  
 724  //================================================
 725  
 726  /**
 727  
 728  * Cree l'uid a partir du nom prenom et de la politique de login
 729  * @Parametres
 730  * @Return
 731  
 732  */
 733  
 734  function creer_uid($nom,$prenom){
 735      global $uidPolicy;
 736      global $ldap_server, $ldap_port, $dn;
 737      global $liste_caracteres_accentues, $liste_caracteres_desaccentues;
 738      global $error;
 739      $error="";
 740  
 741      fich_debug("======================\n");
 742      fich_debug("creer_uid:\n");
 743      fich_debug("\$nom=$nom\n");
 744      fich_debug("\$prenom=$prenom\n");
 745  
 746      fich_debug("\$uidPolicy=$uidPolicy\n");
 747      fich_debug("\$ldap_server=$ldap_server\n");
 748      fich_debug("\$ldap_port=$ldap_port\n");
 749      fich_debug("\$error=$error\n");
 750      fich_debug("\$dn=$dn\n");
 751  
 752  /*
 753      # Il faudrait ameliorer la fonction pour gerer les "Le goff Martin" qui devraient donner "Le_goff-Martin"
 754      # Actuellement, on passe tous les espaces a _
 755  */
 756  
 757      // Recuperation de l'uidPolicy (et du sid)
 758      //crob_init(); Ne sert a rien !!!
 759      //echo "<p>\$uidPolicy=$uidPolicy</p>";
 760  
 761      // Filtrer certains caracteres:
 762      //nom=$(echo "$nom" | tr " àâäéèêëîïôöùûü" "-aaaeeeeiioouuu" | sed -e "s/'//g")
 763      //$nom=strtolower(strtr("$nom"," 'àâäéèêëîïôöùûüçÇÂÄÊËÎÏÔÖÙÛÜ","__aaaeeeeiioouuucCAAEEIIOOUUU"));
 764      //$prenom=strtolower(strtr("$prenom"," 'àâäéèêëîïôöùûüçÇÂÄÊËÎÏÔÖÙÛÜ","__aaaeeeeiioouuucCAAEEIIOOUUU"));
 765      //$nom=strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz"));
 766      //$prenom=strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz"));
 767      $nom=strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$nom"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues"));
 768      $prenom=strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$prenom"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues"));
 769  
 770      fich_debug("Apr&#232;s filtrage...\n");
 771      fich_debug("\$nom=$nom\n");
 772      fich_debug("\$prenom=$prenom\n");
 773  
 774      //ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´
 775      //AAAAAAACEEEEIIIINOOOOOSUUUUYYZ
 776      //áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸
 777      //aaaaaaceeeeiiiinoooooosuuuuyyz
 778  
 779      /*
 780      # Valeurs de l'uidPolicy
 781      #    0: prenom.nom
 782      #    1: prenom.nom tronque a 19
 783      #    2: pnom tronque a 19
 784      #    3: pnom tronque a 8
 785      #    4: nomp tronque a 8
 786      #    5: nomprenom tronque a 18
 787      */
 788  
 789      switch($uidPolicy){
 790          case 0:
 791              $uid=$prenom.".".$nom;
 792              break;
 793          case 1:
 794              $uid=$prenom.".".$nom;
 795              $uid=substr($uid,0,19);
 796              break;
 797          case 2:
 798              $ini_prenom=substr($prenom,0,1);
 799              $uid=$ini_prenom.$nom;
 800              $uid=substr($uid,0,19);
 801              break;
 802          case 3:
 803              $ini_prenom=substr($prenom,0,1);
 804              $uid=$ini_prenom.$nom;
 805              $uid=substr($uid,0,8);
 806              break;
 807          case 4:
 808              $debut_nom=substr($nom,0,7);
 809              $ini_prenom=substr($prenom,0,1);
 810              $uid=$debut_nom.$ini_prenom;
 811              break;
 812          case 5:
 813              $uid=$nom.$prenom;
 814              $uid=substr($uid,0,18);
 815              break;
 816          default:
 817              $ERREUR="oui";
 818      }
 819  
 820      fich_debug("\$uid=$uid\n");
 821      if(isset($ERREUR)) {fich_debug("\$ERREUR=$ERREUR\n");}
 822  
 823      // Pour faire disparaitre les caracteres speciaux restants:
 824      $uid=preg_replace("/[^a-z_.-]/","",$uid);
 825  
 826      // Pour eviter les _ en fin d'UID... pb avec des connexions machine de M$7
 827      $uid=preg_replace("/_*$/","",$uid);
 828  
 829      fich_debug("Apr&#232;s filtrage...\n");
 830      fich_debug("\$uid=$uid\n");
 831  
 832      $test_caract1=substr($uid,0,1);
 833      //if(strlen(preg_replace("/[a-z]/","",$test_caract1))!=0){
 834      if($uid=='') {
 835          $error="L'uid obtenu avec le nom '$nom' et le prenom '$prenom' en uidPolicy '$uidPolicy' est vide.";
 836      }
 837      elseif(strlen(preg_replace("/[a-z]/","",$test_caract1))!=0) {
 838          $error="Le premier caract&#232;re de l'uid n'est pas une lettre.";
 839      }
 840      else{
 841          // Debut de l'uid... pour les doublons...
 842          $prefuid=substr($uid,0,strlen($uid)-1);
 843          $prefuid2=substr($uid,0,strlen($uid)-2);
 844          // Ou renseigner un uid_initial ou uid_souche
 845          $uid_souche=$uid;
 846  
 847          //$tab_logins_non_permis=array('prof', 'progs', 'docs', 'classes', 'homes', 'admhomes', 'admse3');
 848          $tab_logins_non_permis=array('prof', 'progs', 'docs', 'classes', 'homes', 'admhomes', 'netlogon','profiles');
 849          if(in_array($uid_souche,$tab_logins_non_permis)) {
 850              $cpt=1;
 851              $uid_souche=substr($uid,0,strlen($uid)-strlen($cpt)).$cpt;
 852          }
 853  
 854          $ok_uid="non";
 855  
 856          $attr=array("uid");
 857  
 858          $ds=@ldap_connect($ldap_server,$ldap_port);
 859          if($ds){
 860              $r=@ldap_bind($ds);// Bind anonyme
 861              //$adminLdap=get_infos_admin_ldap();
 862              //$r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP
 863              if($r){
 864                  $cpt=2;
 865                  //while($ok_uid=="non"){
 866                  //while(($ok_uid=="non")&&($cpt<10)){
 867                  while(($ok_uid=="non")&&($cpt<100)){
 868                      $result=ldap_search($ds,$dn["people"],"uid=$uid*",$attr);
 869                      if ($result) {
 870                          $info=@ldap_get_entries($ds,$result);
 871                          if($info){
 872                              $ok_uid="oui";
 873                              for($i=0;$i<$info["count"];$i++){
 874                                  //echo "<p>";
 875                                  // En principe, il n'y a qu'un uid par entree...
 876                                  for($loop=0;$loop<$info[$i]["uid"]["count"]; $loop++) {
 877                                      //echo "\$info[$i][\"uid\"][$loop]=".$info[$i]["uid"][$loop]."<br />\n";
 878                                      if($info[$i]["uid"][$loop]==$uid){
 879                                          $ok_uid="non";
 880                                          //$uid=substr($uid,0,strlen($uid)-1).$cpt;
 881                                          //$uid=substr($uid,0,strlen($uid)-strlen($cpt)).$cpt;
 882                                          //$uid=$prefuid.$cpt;
 883                                          $uid=substr($uid_souche,0,strlen($uid_souche)-strlen($cpt)).$cpt;
 884  
 885                                          if($uid=="admse3") {$uid="admse4";$cpt++;}
 886  
 887                                          fich_debug("Doublons... \$uid=$uid\n");
 888                                          $cpt++;
 889                                      }
 890                                  }
 891                                  //echo "</p>\n";
 892                              }
 893                          }
 894                      }
 895                      else{
 896                          $error="Echec de la lecture des entr&#233;es...";
 897                          fich_debug("\$error=$error\n");
 898                      }
 899                      @ldap_free_result($result);
 900                  }
 901  
 902                  // Vérification que l'uid n'était pas en Trash
 903                  $result=ldap_search($ds,$dn["trash"],"uid=$uid*",$attr);
 904                  if ($result) {
 905                      $info=@ldap_get_entries($ds,$result);
 906                      if($info){
 907                          $ok_uid="oui";
 908                          for($i=0;$i<$info["count"];$i++){
 909                              //echo "<p>";
 910                              // En principe, il n'y a qu'un uid par entree...
 911                              for($loop=0;$loop<$info[$i]["uid"]["count"]; $loop++) {
 912                                  //echo "\$info[$i][\"uid\"][$loop]=".$info[$i]["uid"][$loop]."<br />\n";
 913                                  if($info[$i]["uid"][$loop]==$uid){
 914                                      $ok_uid="non";
 915                                      $error="L'uid <b style='color:red;'>$uid</b> existe dans la branche Trash.";
 916                                  }
 917                              }
 918                              //echo "</p>\n";
 919                          }
 920                      }
 921                  }
 922  
 923              }
 924              else{
 925                  $error=gettext("Echec du bind anonyme");
 926                  fich_debug("\$error=$error\n");
 927              }
 928              @ldap_close($ds);
 929          }
 930          else{
 931              $error=gettext("Erreur de connection au serveur LDAP");
 932              fich_debug("\$error=$error\n");
 933          }
 934      }
 935  
 936      if($error!=""){
 937          echo "error=$error<br />\n";
 938          fich_debug("\$error=$error\n");
 939          return false;
 940      }
 941      //elseif($cpt>=10){
 942          //$error="Il y a au moins 10 uid en doublon...<br />On en est &#224; $uid<br />Etes-vous s&#251;r qu'il n'y a pas des personnes qui ont quitt&#233; l'&#233;tablissement?";
 943      elseif($cpt>=100){
 944          $error="Il y a au moins 100 uid en doublon...<br />On en est &#224; $uid<br />Etes-vous s&#251;r qu'il n'y a pas des personnes qui ont quitt&#233; l'&#233;tablissement?";
 945          echo "error=$error<br />\n";
 946          fich_debug("\$error=$error\n");
 947          return false;
 948      }
 949      else{
 950          // Retourner $uid
 951          return $uid;
 952      }
 953  }
 954  
 955  
 956  
 957  //================================================
 958  
 959  /**
 960  
 961  * Tester si l'employeeNumber est dans l'annuaire ou non...
 962  * @Parametres
 963  * @Return
 964  
 965  */
 966  
 967  /*
 968  function verif_employeeNumber($employeeNumber){
 969      global $ldap_server, $ldap_port, $dn;
 970      global $error;
 971      $error="";
 972      // Tester si l'employeeNumber est dans l'annuaire ou non...
 973  
 974      //$attribut=array("uid","employeenumber");
 975      //$attribut=array("employeenumber");
 976      $attribut=array("uid");
 977      $tab=get_tab_attribut("people","employeenumber=$employeeNumber",$attribut);
 978  
 979      if(count($tab)>0){return $tab;}else{return false;}
 980  }
 981  */
 982  function verif_employeeNumber($employeeNumber) {
 983      global $ldap_server, $ldap_port, $dn;
 984      global $error;
 985      $error="";
 986      // Tester si l'employeeNumber est dans l'annuaire ou non...
 987  
 988      //$attribut=array("uid","employeenumber");
 989      //$attribut=array("employeenumber");
 990      $attribut=array("uid");
 991      $tab=get_tab_attribut("people","employeenumber=$employeeNumber",$attribut);
 992  
 993      $attribut=array("uid");
 994      $tab2=get_tab_attribut("people","employeenumber=".sprintf("%05d",$employeeNumber),$attribut);
 995  
 996      $attribut=array("uid");
 997      $tab3=get_tab_attribut("trash","employeenumber=".$employeeNumber,$attribut);
 998  
 999      $attribut=array("uid");
1000      $tab4=get_tab_attribut("trash","employeenumber=".sprintf("%05d",$employeeNumber),$attribut);
1001  
1002  
1003      $attribut=array("uid");
1004      $tab5=get_tab_attribut("people","employeenumber=".preg_replace("/^0*/", "", $employeeNumber),$attribut);
1005  
1006      $attribut=array("uid");
1007      $tab6=get_tab_attribut("trash","employeenumber=".preg_replace("/^0*/", "", $employeeNumber),$attribut);
1008  
1009      /*
1010      echo "count($tab)=".count($tab)."<br />\n";
1011      for($i=0;$i<count($tab);$i++){
1012          echo "tab[$i]=$tab[$i]<br />\n";
1013      }
1014      */
1015  
1016      if(count($tab)>0){$tab[-1]="people";return $tab;}
1017      elseif(count($tab2)>0){$tab2[-1]="people";return $tab2;}
1018      elseif(count($tab3)>0){$tab3[-1]="trash";return $tab3;}
1019      elseif(count($tab4)>0){$tab4[-1]="trash";return $tab4;}
1020      elseif(count($tab5)>0){$tab5[-1]="people";return $tab5;}
1021      elseif(count($tab6)>0){$tab6[-1]="trash";return $tab6;}
1022      else{return false;}
1023  }
1024  
1025  
1026  //================================================
1027  
1028  /**
1029  
1030  * Tester si un uid existe ou non dans l'annuaire pour $nom et $prenom sans employeeNumber ... ce qui correspondrait a un compte cree a la main.
1031  * @Parametres
1032  * @Return
1033  
1034  */
1035  
1036  
1037  function verif_nom_prenom_sans_employeeNumber($nom,$prenom){
1038      global $ldap_server, $ldap_port, $dn;
1039      global $error;
1040      $error="";
1041      // Tester si un uid existe ou non dans l'annuaire pour $nom et $prenom sans employeeNumber...
1042      // ... ce qui correspondrait a un compte cree a la main.
1043  
1044      $trouve=0;
1045  
1046      // On fait une recherche avec éventuellement les accents dans les nom/prénom... et on en fait si nécessaire une deuxième sans les accents
1047      $attribut=array("uid");
1048      $tab1=array();
1049      //$tab1=get_tab_attribut("people","cn='$prenom $nom'",$attribut);
1050      $tab1=get_tab_attribut("people","cn=$prenom $nom",$attribut);
1051      /*
1052      if(strtolower($nom)=='andro') {
1053          $fich=fopen("/tmp/verif_nom_prenom_sans_employeeNumber_debug.txt","a+");
1054          fwrite($fich,"Recherche cn=$prenom $nom on recupere count($tab1)=".count($tab1)."<br />\n");
1055          fclose($fich);
1056      }
1057      */
1058  
1059      //echo "<p>error=$error</p>";
1060  
1061      if(count($tab1)>0){
1062          //echo "<p>count(\$tab1)>0</p>";
1063          for($i=0;$i<count($tab1);$i++){
1064              $attribut=array("employeenumber");
1065              $tab2=get_tab_attribut("people","uid=$tab1[$i]",$attribut);
1066              if(count($tab2)==0){
1067                  //echo "<p>count(\$tab2)==0</p>";
1068                  $trouve++;
1069                  $uid=$tab1[$i];
1070                  //echo "<p>uid=$uid</p>";
1071              }
1072          }
1073  
1074          // On ne cherche a traiter que le cas d'une seule correspondance.
1075          // S'il y en a plus, on ne pourra pas identifier...
1076          if($trouve==1){
1077              return $uid;
1078          }
1079          else{
1080              return false;
1081          }
1082      }
1083      else{
1084          // On fait en sorte de ne pas avoir d'accents dans la branche People de l'annuaire
1085          $nom=remplace_accents(traite_espaces($nom));
1086          $prenom=remplace_accents(traite_espaces($prenom));
1087      
1088          $attribut=array("uid");
1089          $tab1=array();
1090          //$tab1=get_tab_attribut("people","cn='$prenom $nom'",$attribut);
1091          $tab1=get_tab_attribut("people","cn=$prenom $nom",$attribut);
1092  
1093          /*
1094          if(strtolower($nom)=='andro') {
1095              $fich=fopen("/tmp/verif_nom_prenom_sans_employeeNumber_debug.txt","a+");
1096              fwrite($fich,"Recherche cn=$prenom $nom on recupere count($tab1)=".count($tab1)."<br />\n");
1097              fclose($fich);
1098          }
1099          */
1100  
1101          //echo "<p>error=$error</p>";
1102      
1103          if(count($tab1)>0){
1104              //echo "<p>count(\$tab1)>0</p>";
1105              for($i=0;$i<count($tab1);$i++){
1106                  $attribut=array("employeenumber");
1107                  $tab2=get_tab_attribut("people","uid=$tab1[$i]",$attribut);
1108                  if(count($tab2)==0){
1109                      //echo "<p>count(\$tab2)==0</p>";
1110                      $trouve++;
1111                      $uid=$tab1[$i];
1112                      //echo "<p>uid=$uid</p>";
1113                  }
1114              }
1115      
1116              // On ne cherche a traiter que le cas d'une seule correspondance.
1117              // S'il y en a plus, on ne pourra pas identifier...
1118              if($trouve==1){
1119                  return $uid;
1120              }
1121              else{
1122                  return false;
1123              }
1124          }
1125          else{
1126              return false;
1127          }
1128      }
1129  }
1130  
1131  
1132  //================================================
1133  
1134  /**
1135  
1136  * Obtient un tableau avecc les attributs
1137  * @Parametres $attribut doit etre un tableau d'une seule valeur  Ex.: $attribut[0]="uidNumber";
1138  
1139  * @Return un tableau avec les attributs
1140  
1141  */
1142  
1143  function get_tab_attribut($branche, $filtre, $attribut){
1144      global $ldap_server, $ldap_port, $dn;
1145      global $error;
1146      $error="";
1147  
1148      // Parametres
1149      // $attribut doit etre un tableau d'une seule valeur.
1150      // Ex.: $attribut[0]="uidNumber";
1151  
1152      // Tableau retourne
1153      $tab=array();
1154  
1155      fich_debug("======================\n");
1156      fich_debug("get_tab_attribut:\n");
1157  
1158      $ds=@ldap_connect($ldap_server,$ldap_port);
1159      if($ds){
1160          $r=@ldap_bind($ds);// Bind anonyme
1161          if($r){
1162              $result=ldap_search($ds,$dn[$branche],"$filtre",$attribut);
1163              fich_debug("ldap_search($ds,".$dn[$branche].",\"$filtre\",$attribut)\n");
1164              //echo "<p>ldap_search($ds,$dn[$branche],\"$filtre\",$attribut);</p>";
1165              if ($result){
1166                  //echo "\$result=$result<br />";
1167                  $info=@ldap_get_entries($ds,$result);
1168                  if($info){
1169                      fich_debug("\$info[\"count\"]=".$info["count"]."\n");
1170                      //echo "<br />".$info["count"]."<br />";
1171                      for($i=0;$i<$info["count"];$i++){
1172                          fich_debug("\$info[$i][$attribut[0]][\"count\"]=".$info[$i][$attribut[0]]["count"]."\n");
1173                          for($loop=0;$loop<$info[$i][$attribut[0]]["count"]; $loop++) {
1174                              $tab[]=$info[$i][$attribut[0]][$loop];
1175                              fich_debug("\$tab[]=".$info[$i][$attribut[0]][$loop]."\n");
1176                          }
1177                      }
1178                      rsort($tab);
1179                  }
1180                  else{
1181                      fich_debug("\$info vide... @ldap_get_entries($ds,$result) n'a rien donn&#233;.\n");
1182                  }
1183              }
1184              else{
1185                  $error="Echec de la lecture des entr&#233;es: ldap_search($ds,".$dn[$branche].",\"$filtre\",$attribut)";
1186                  fich_debug("\$error=$error\n");
1187              }
1188              @ldap_free_result($result);
1189  
1190          }
1191          else{
1192              $error=gettext("Echec du bind anonyme");
1193              fich_debug("\$error=$error\n");
1194          }
1195          @ldap_close($ds);
1196      }
1197      else{
1198          $error=gettext("Erreur de connection au serveur LDAP");
1199          fich_debug("\$error=$error\n");
1200      }
1201  
1202      if($error!=""){
1203          echo "error=$error<br />\n";
1204      }
1205  
1206      return $tab;
1207  }
1208  
1209  
1210  //================================================
1211  
1212  /**
1213  
1214  * Recherche le premier uidNumber disponible  On demarre les uid a 1001, mais admin est en 5000:
1215  * @Parametres
1216  
1217  * @Return
1218  
1219  */
1220  
1221  
1222  function get_first_free_uidNumber(){
1223      global $ldap_server, $ldap_port, $dn;
1224      global $error;
1225      $error="";
1226  
1227      // On demarre les uid a 1001, mais admin est en 5000:
1228      // unattend est en 1000 chez moi... mais cela peut changer avec des etablissements dont l'annuaire SE3 date d'avant l'ajout d'unattend
1229      // on peut aussi avoir un compte de client linux qui n'est pas dans l'annuaire mais a besoin de l'uidNumber 1000... risque de conflit si c'est occupé
1230      $first_uidNumber=1001;
1231      $last_uidNumber=4999;
1232      //$last_uidNumber=1200;
1233  
1234      unset($attribut);
1235      $attribut=array();
1236      $attribut[0]="uidnumber";
1237      //$tab=array();
1238      //$tab=get_tab_attribut("people", "uid=*", $attribut);
1239      $tab1=array();
1240      $tab1=get_tab_attribut("people", "uid=*", $attribut);
1241      $tab2=array();
1242      $tab2=get_tab_attribut("trash", "uid=*", $attribut);
1243      $tab=array_merge($tab1,$tab2);
1244      rsort($tab);
1245  
1246      /*
1247      // Debug:
1248      echo "count(\$tab)=".count($tab)."<br />";
1249      for($i=0;$i<count($tab);$i++){
1250          echo "\$tab[$i]=$tab[$i]<br />";
1251      }
1252      */
1253  
1254      /*
1255      // Methode OK, mais on risque la penurie des uidNumber entre 1000 et 5000
1256      // a ne pas recuperer des uidNumber d'utilisateurs qui ont quitte l'etablissement
1257      //$last_uidNumber=1473;
1258      $uidNumber=$last_uidNumber;
1259      while((!in_array($uidNumber,$tab))&&($uidNumber>$first_uidNumber)){
1260          $uidNumber--;
1261          //echo "\$uidNumber=$uidNumber<br />";
1262      }
1263      $uidNumber++;
1264      if(($uidNumber>$last_uidNumber)||(in_array($uidNumber,$tab))){
1265          $error="Il n'y a plus de plus grand uidNumber libre en dessous de $last_uidNumber";
1266          echo "error=$error<br />";
1267          return false;
1268      }
1269      else{
1270          echo "<p><b>\$uidNumber=$uidNumber</b></p>";
1271          return $uidNumber;
1272      }
1273      */
1274  
1275  
1276      //TEST: $last_uidNumber=1200;
1277      // Ou: on recherche le plus petit uidNumber dispo entre $first_uidNumber et $last_uidNumber
1278      $uidNumber=$first_uidNumber;
1279      while((in_array($uidNumber,$tab))&&($uidNumber<$last_uidNumber)){
1280          $uidNumber++;
1281      }
1282      //echo "<p><b>\$uidNumber=$uidNumber</b></p>";
1283  
1284      if(($uidNumber==$last_uidNumber)&&(in_array($uidNumber,$tab))){
1285          $error="Il n'y a plus d'uidNumber libre";
1286          //echo "error=$error<br />";
1287          return false;
1288      }
1289      else{
1290          return $uidNumber;
1291      }
1292  
1293      /*
1294      // Ou: On mixe les deux methodes:
1295      // C'EST UNE FAUSSE SOLUTION:
1296      // Quand tout va etre rempli la premiere fois, on va commencer a recuperer des uidNumber par le haut des qu'un uidNumber va se liberer et on va re-affecter des uidNumber utilises recemment.
1297      $uidNumber=$last_uidNumber;
1298      while((!in_array($uidNumber,$tab))&&($uidNumber>$first_uidNumber)){
1299          $uidNumber--;
1300          //echo "\$uidNumber=$uidNumber<br />";
1301      }
1302      $uidNumber++;
1303      if(($uidNumber>$last_uidNumber)||(in_array($uidNumber,$tab))){
1304          // On commence a reaffecter des uidNumber libres par le bas
1305          $uidNumber=$first_uidNumber;
1306          while((in_array($uidNumber,$tab))&&($uidNumber<$last_uidNumber)){
1307              $uidNumber++;
1308          }
1309  
1310          if(($uidNumber==$last_uidNumber)&&(in_array($uidNumber,$tab))){
1311              $error="Il n'y a plus d'uidNumber libre";
1312              //echo "error=$error<br />";
1313              return false;
1314          }
1315          else{
1316              return $uidNumber;
1317          }
1318      }
1319      else{
1320          //echo "<p><b>\$uidNumber=$uidNumber</b></p>";
1321          return $uidNumber;
1322      }
1323      */
1324  }
1325  
1326  
1327  //================================================
1328  
1329  /**
1330  
1331  * Recherche le premier gidNumber disponible
1332  * @Parametres
1333  
1334  * @Return
1335  
1336  */
1337  
1338  
1339  function get_first_free_gidNumber($start=NULL){
1340      global $ldap_server, $ldap_port, $dn;
1341      global $error;
1342      $error="";
1343  
1344      /*
1345      # Quelques groupes:
1346      # 5000:admins
1347      # 5001:Eleves
1348      # 5002:Profs
1349      # 5003:Administratifs
1350      # 1560:overfill
1351      # 1000:lcs-users
1352      # 998:machines
1353      */
1354  
1355      $first_gidNumber=2000;
1356      $last_gidNumber=4999;
1357      //$last_gidNumber=2010;
1358  
1359      if((isset($start))&&(strlen(preg_replace("/[0-9]/","",$start))==0)&&($start>=$first_gidNumber)) {
1360          $first_gidNumber=$start;
1361          $last_gidNumber=64000;
1362      }
1363  
1364      unset($attribut);
1365      $attribut=array();
1366      $attribut[0]="gidnumber";
1367  
1368      $tab1=array();
1369      $tab1=get_tab_attribut("people", "uid=*", $attribut);
1370  
1371      $tab=array();
1372      for($i=0;$i<count($tab1);$i++){
1373          //echo "\$tab1[$i]=$tab1[$i]<br />";
1374          $tab[]=$tab1[$i];
1375      }
1376  
1377      //echo "<hr />";
1378  
1379      $tab2=array();
1380      $tab2=get_tab_attribut("groups", "cn=*", $attribut);
1381  
1382      for($i=0;$i<count($tab2);$i++){
1383          //echo "\$tab2[$i]=$tab2[$i]<br />";
1384          if(!in_array($tab2[$i],$tab)){
1385              $tab[]=$tab2[$i];
1386          }
1387      }
1388      rsort($tab);
1389  
1390      /*
1391      // Debug:
1392      echo "count(\$tab)=".count($tab)."<br />";
1393      for($i=0;$i<count($tab);$i++){
1394          echo "\$tab[$i]=$tab[$i]<br />";
1395      }
1396      */
1397  
1398      // On recherche le plus petit gidNumber dispo entre $first_gidNumber et $last_gidNumber
1399      $gidNumber=$first_gidNumber;
1400      while((in_array($gidNumber,$tab))&&($gidNumber<$last_gidNumber)){
1401          $gidNumber++;
1402      }
1403      //echo "<p><b>\$gidNumber=$gidNumber</b></p>";
1404  
1405      if(($gidNumber==$last_gidNumber)&&(in_array($gidNumber,$tab))){
1406          $error="Il n'y a plus de gidNumber libre";
1407          //echo "error=$error<br />";
1408          return false;
1409      }
1410      else{
1411          return $gidNumber;
1412      }
1413      // Pour controler:
1414      // ldapsearch -xLLL gidNumber | grep gidNumber | sed -e "s/^gidNumber: //" | sort -n -r | uniq | head
1415      // ldapsearch -xLLL gidNumber | grep gidNumber | sed -e "s/^gidNumber: //" | sort -n -r | uniq | tail
1416  }
1417  
1418  /*
1419  function add_user($uid,$nom,$prenom,$sexe,$naissance,$password,$employeeNumber){
1420      // Recuperer le gidNumber par defaut -> lcs-users (1000) ou slis (600)
1421      global $defaultgid,$domain,$defaultshell,$domainsid,$uidPolicy;
1422  
1423      fich_debug("================\n");
1424      fich_debug("add_user:\n");
1425      fich_debug("\$defaultgid=$defaultgid\n");
1426      fich_debug("\$domain=$domain\n");
1427      fich_debug("\$defaultshell=$defaultshell\n");
1428      fich_debug("\$domainsid=$domainsid\n");
1429      fich_debug("\$uidPolicy=$uidPolicy\n");
1430  
1431      global $pathscripts;
1432      fich_debug("\$pathscripts=$pathscripts\n");
1433  
1434  
1435      // crob_init(); Ne sert a rien !!!!
1436      $nom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz")));
1437      $prenom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz")));
1438  
1439      $nom=ucfirst(strtolower($nom));
1440      $prenom=ucfirst(strtolower($prenom));
1441  
1442      fich_debug("\$nom=$nom\n");
1443      fich_debug("\$prenom=$prenom\n");
1444  
1445  
1446      // Recuperer un uidNumber:
1447      //$uidNumber=get_first_free_uidNumber();
1448      if(!get_first_free_uidNumber()){return false;exit();}
1449      $uidNumber=get_first_free_uidNumber();
1450      $rid=2*$uidNumber+1000;
1451      $pgrid=2*$defaultgid+1001;
1452  
1453      fich_debug("\$uidNumber=$uidNumber\n");
1454  
1455  
1456      // Faut-il interdire les espaces dans le password? les apostrophes?
1457      // Comment le script ntlmpass.pl prend-il le parametre sans les apostrophes?
1458  
1459      $ntlmpass=explode(" ",exec("$pathscripts/ntlmpass.pl '$password'"));
1460  
1461      $sambaLMPassword=$ntlmpass[0];
1462      $sambaNTPassword=$ntlmpass[1];
1463      $userPassword=exec("$pathscripts/unixPassword.pl '$password'");
1464  
1465      $attribut=array();
1466      $attribut["uid"]="$uid";
1467      $attribut["cn"]="$prenom $nom";
1468  
1469      $attribut["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1));
1470  
1471      $attribut["sn"]="$nom";
1472  
1473      $attribut["mail"]="$uid@$domain";
1474      $attribut["objectClass"]="top";
1475  
1476      // Comme la cle est toujours objectClass, cela pose un probleme: un seul attribut objectClass est ajoute (le dernier defini)
1477      //$attribut["objectClass"]="posixAccount";
1478      //$attribut["objectClass"]="shadowAccount";
1479      //$attribut["objectClass"]="person";
1480      //$attribut["objectClass"]="inetOrgPerson";
1481      //$attribut["objectClass"]="sambaSamAccount";
1482  
1483      $attribut["loginShell"]="$defaultshell";
1484      $attribut["uidNumber"]="$uidNumber";
1485  
1486      $attribut["gidNumber"]="$defaultgid";
1487  
1488      $attribut["homeDirectory"]="/home/$uid";
1489      $attribut["gecos"]="$prenom $nom,$naissance,$sexe,N";
1490  
1491      $attribut["sambaSID"]="$domainsid-$rid";
1492          $attribut["sambaPrimaryGroupSID"]="$domainsid-$pgrid";
1493  
1494      $attribut["sambaPwdLastSet"]="1";
1495      $attribut["sambaPwdMustChange"]="2147483647";
1496      $attribut["sambaAcctFlags"]="[U          ]";
1497      $attribut["sambaLMPassword"]="$sambaLMPassword";
1498      $attribut["sambaNTPassword"]="$sambaNTPassword";
1499      $attribut["userPassword"]="{crypt}$userPassword";
1500  
1501      // IL faut aussi l'employeeNumber
1502      if("$employeeNumber"!=""){
1503          $attribut["employeeNumber"]="$employeeNumber";
1504      }
1505  
1506      $result=add_entry("uid=$uid","people",$attribut);
1507      if($result){
1508          // Reste a ajouter les autres attributs objectClass
1509          unset($attribut);
1510          $attribut=array();
1511          $attribut["objectClass"]="posixAccount";
1512          if(modify_attribut("uid=$uid","people", $attribut, "add")){
1513              unset($attribut);
1514              $attribut=array();
1515              $attribut["objectClass"]="shadowAccount";
1516              if(modify_attribut("uid=$uid","people", $attribut, "add")){
1517                  unset($attribut);
1518                  $attribut=array();
1519                  $attribut["objectClass"]="person";
1520                  if(modify_attribut("uid=$uid","people", $attribut, "add")){
1521                      unset($attribut);
1522                      $attribut=array();
1523                      $attribut["objectClass"]="inetOrgPerson";
1524                      if(modify_attribut("uid=$uid","people", $attribut, "add")){
1525                          unset($attribut);
1526                          $attribut=array();
1527                          $attribut["objectClass"]="sambaSamAccount";
1528                          if(modify_attribut("uid=$uid","people", $attribut, "add"))  return true;
1529                          else return false;
1530                      } else return false;
1531                  } else return false;
1532              } else return false;
1533          } else return false;
1534      } else return false;
1535  }
1536  */
1537  
1538  
1539  //================================================
1540  
1541  /**
1542  
1543  * Ajoute un utilisateur dans l'annuaire LDAP
1544  * @Parametres
1545  
1546  * @Return
1547  
1548  */
1549  
1550  function add_user($uid,$nom,$prenom,$sexe,$naissance,$password,$employeeNumber){
1551      // Recuperer le gidNumber par defaut -> lcs-users (1000) ou slis (600)
1552      global $defaultgid,$domain,$defaultshell,$domainsid,$uidPolicy;
1553      global $attribut_pseudo;
1554      global $liste_caracteres_accentues, $liste_caracteres_desaccentues;
1555  
1556      fich_debug("================\n");
1557      fich_debug("add_user:\n");
1558      fich_debug("\$defaultgid=$defaultgid\n");
1559      fich_debug("\$domain=$domain\n");
1560      fich_debug("\$defaultshell=$defaultshell\n");
1561      fich_debug("\$domainsid=$domainsid\n");
1562      fich_debug("\$uidPolicy=$uidPolicy\n");
1563  
1564      global $pathscripts;
1565      fich_debug("\$pathscripts=$pathscripts\n");
1566  
1567  
1568      // crob_init(); Ne sert a rien !!!!
1569      //$nom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz")));
1570      //$prenom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz")));
1571      //$nom=ereg_replace("[^a-z_ -]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom")))),"'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","_AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz")));
1572      //$prenom=ereg_replace("[^a-z_ -]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom")))),"'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","_AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz")));
1573      $nom=preg_replace("/[^a-z_ -]/","",strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$nom")))),"'$liste_caracteres_accentues","_$liste_caracteres_desaccentues")));
1574      $prenom=preg_replace("/[^a-z_ -]/","",strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$prenom")))),"'$liste_caracteres_accentues","_$liste_caracteres_desaccentues")));
1575  
1576      $nom=ucfirst(strtolower($nom));
1577      $prenom=ucfirst(strtolower($prenom));
1578  
1579      fich_debug("\$nom=$nom\n");
1580      fich_debug("\$prenom=$prenom\n");
1581  
1582  
1583      // Recuperer un uidNumber:
1584      //$uidNumber=get_first_free_uidNumber();
1585      if(!get_first_free_uidNumber()){return false;exit();}
1586      $uidNumber=get_first_free_uidNumber();
1587      $rid=2*$uidNumber+1000;
1588      // On n'utilise plus ce $pgrid: on passe à 513
1589      $pgrid=2*$defaultgid+1001;
1590  
1591      fich_debug("\$uidNumber=$uidNumber\n");
1592  
1593  
1594      // Faut-il interdire les espaces dans le password? les apostrophes?
1595      // Comment le script ntlmpass.pl prend-il le parametre sans les apostrophes?
1596  
1597      //$ntlmpass=explode(" ",exec("$pathscripts/ntlmpass.pl '$password'"));
1598      echo "Preparation du mot de passe pour $nom $prenom\n";
1599      $ntlmpass=explode(" ",exec("export LC_ALL=\"fr_FR.UTF-8\";$pathscripts/ntlmpass.pl '$password'"));
1600  
1601      $sambaLMPassword=$ntlmpass[0];
1602      $sambaNTPassword=$ntlmpass[1];
1603      //$userPassword=exec("$pathscripts/unixPassword.pl '$password'");
1604      $userPassword=exec("export LC_ALL=\"fr_FR.UTF-8\";$pathscripts/unixPassword.pl '$password'");
1605  
1606      $attribut=array();
1607      $attribut["uid"]="$uid";
1608      $attribut["cn"]="$prenom $nom";
1609  
1610      //$attribut["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1));
1611      $attribut["givenName"]=ucfirst(strtolower($prenom));
1612      //$attribut["$attribut_pseudo"]=strtolower($prenom).strtoupper(substr($nom,0,1));
1613      $attribut["$attribut_pseudo"]=preg_replace("/ /","_",strtolower($prenom).strtoupper(substr($nom,0,1)));
1614  
1615      $attribut["sn"]="$nom";
1616  
1617      $attribut["mail"]="$uid@$domain";
1618      //$attribut["objectClass"]="top";
1619      /*
1620      // Comme la cle est toujours objectClass, cela pose un probleme: un seul attribut objectClass est ajoute (le dernier defini)
1621      $attribut["objectClass"]="posixAccount";
1622      $attribut["objectClass"]="shadowAccount";
1623      $attribut["objectClass"]="person";
1624      $attribut["objectClass"]="inetOrgPerson";
1625      $attribut["objectClass"]="sambaSamAccount";
1626      */
1627      $attribut["objectClass"][0]="top";
1628      $attribut["objectClass"][1]="posixAccount";
1629      $attribut["objectClass"][2]="shadowAccount";
1630      $attribut["objectClass"][3]="person";
1631      $attribut["objectClass"][4]="inetOrgPerson";
1632      $attribut["objectClass"][5]="sambaSamAccount";
1633  
1634      $attribut["loginShell"]="$defaultshell";
1635      $attribut["uidNumber"]="$uidNumber";
1636  
1637      $attribut["gidNumber"]="$defaultgid";
1638  
1639      $attribut["homeDirectory"]="/home/$uid";
1640      $attribut["gecos"]="$prenom $nom,$naissance,$sexe,N";
1641  
1642      $attribut["sambaSID"]="$domainsid-$rid";
1643      //$attribut["sambaPrimaryGroupSID"]="$domainsid-$pgrid";
1644      $attribut["sambaPrimaryGroupSID"]="$domainsid-513";
1645  
1646      $attribut["sambaPwdMustChange"]="2147483647";
1647      $attribut["sambaPwdLastSet"]="1";
1648      $attribut["sambaAcctFlags"]="[U          ]";
1649      $attribut["sambaLMPassword"]="$sambaLMPassword";
1650      $attribut["sambaNTPassword"]="$sambaNTPassword";
1651      $attribut["userPassword"]="$userPassword";
1652      $attribut["shadowLastChange"]=time();
1653      // IL faut aussi l'employeeNumber
1654      if("$employeeNumber"!=""){
1655          $attribut["employeeNumber"]="$employeeNumber";
1656      }
1657  
1658      $result=add_entry("uid=$uid","people",$attribut);
1659  
1660      if($result){
1661          /*
1662          // Reste a ajouter les autres attributs objectClass
1663          unset($attribut);
1664          $attribut=array();
1665          $attribut["objectClass"]="posixAccount";
1666          if(modify_attribut("uid=$uid","people", $attribut, "add")){
1667              unset($attribut);
1668              $attribut=array();
1669              $attribut["objectClass"]="shadowAccount";
1670              if(modify_attribut("uid=$uid","people", $attribut, "add")){
1671                  unset($attribut);
1672                  $attribut=array();
1673                  $attribut["objectClass"]="person";
1674                  if(modify_attribut("uid=$uid","people", $attribut, "add")){
1675                      unset($attribut);
1676                      $attribut=array();
1677                      $attribut["objectClass"]="inetOrgPerson";
1678                      if(modify_attribut("uid=$uid","people", $attribut, "add")){
1679                          unset($attribut);
1680                          $attribut=array();
1681                          $attribut["objectClass"]="sambaSamAccount";
1682                          if(modify_attribut("uid=$uid","people", $attribut, "add"))  return true;
1683                          else return false;
1684                      } else return false;
1685                  } else return false;
1686              } else return false;
1687          } else return false;
1688          */
1689          return true;
1690      } else return false;
1691  }
1692  
1693  
1694  //================================================
1695  
1696  /**
1697  
1698  * Verifie et corrige le Gecos
1699  * @Parametres
1700  
1701  * @Return
1702  
1703  */
1704  
1705  function verif_et_corrige_gecos($uid,$nom,$prenom,$naissance,$sexe){
1706      // Verification/correction du GECOS
1707  
1708      global $simulation;
1709      global $infos_corrections_gecos;
1710  
1711      // Correction du nom/prenom fournis
1712      $nom=remplace_accents(traite_espaces($nom));
1713      $prenom=remplace_accents(traite_espaces($prenom));
1714  
1715      $nom=preg_replace("/[^a-z_-]/","",strtolower("$nom"));
1716      $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom"));
1717  
1718      $nom=ucfirst(strtolower($nom));
1719      $prenom=ucfirst(strtolower($prenom));
1720  
1721      unset($attribut);
1722      $attribut=array("gecos");
1723      $tab=get_tab_attribut("people", "uid=$uid", $attribut);
1724      if(count($tab)>0){
1725          if("$tab[0]"!="$prenom $nom,$naissance,$sexe,N"){
1726              unset($attributs);
1727              $attributs=array();
1728              $attributs["gecos"]="$prenom $nom,$naissance,$sexe,N";
1729              $attributs["cn"]="$prenom $nom";
1730              $attributs["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1));
1731              $attributs["sn"]="$nom";
1732              my_echo("Correction de l'attribut 'gecos': ");
1733  
1734              //if($infos_corrections_gecos!="") {$infos_corrections_gecos.="<br />";}
1735              $infos_corrections_gecos.="Correction du nom, prénom, date de naissance ou sexe de <b>$uid</b><br />\n";
1736  
1737              if($simulation!='y') {
1738                  if(modify_attribut ("uid=$uid", "people", $attributs, "replace")){
1739                      my_echo("<font color='green'>SUCCES</font>");
1740                  }
1741                  else{
1742                      my_echo("<font color='red'>ECHEC</font>");
1743                      $nb_echecs++;
1744                  }
1745              }
1746              else {
1747                  my_echo("<font color='blue'>SIMULATION</font>");
1748              }
1749              my_echo("<br />\n");
1750          }
1751      }
1752  }
1753  
1754  /**
1755  
1756  * Verifie et corrige le givenName
1757  * @Parametres
1758  
1759  * @Return
1760  
1761  */
1762  
1763  function verif_et_corrige_givenname($uid,$prenom) {
1764      // Verification/correction du givenName
1765  
1766      global $simulation;
1767  
1768      // Correction du nom/prenom fournis
1769      $prenom=remplace_accents(traite_espaces($prenom));
1770  
1771      $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom"));
1772  
1773      // FAUT-IL LA MAJUSCULE?
1774      $prenom=ucfirst(strtolower($prenom));
1775  
1776      unset($attribut);
1777      //$attribut=array("givenName");
1778      $attribut=array("givenname");
1779      $tab=get_tab_attribut("people", "uid=$uid", $attribut);
1780      //my_echo("\$tab=get_tab_attribut(\"people\", \"uid=$uid\", \$attribut)<br />");
1781      //my_echo("count(\$tab)=".count($tab)."<br />");
1782      if(count($tab)>0){
1783          //my_echo("\$tab[0]=".$tab[0]." et \$prenom=$prenom<br />");
1784          if("$tab[0]"!="$prenom") {
1785              unset($attributs);
1786              $attributs=array();
1787              //$attributs["givenName"]=strtolower($prenom);
1788              $attributs["givenName"]=$prenom;
1789              my_echo("Correction de l'attribut 'givenName': ");
1790              if($simulation!='y') {
1791                  if(modify_attribut ("uid=$uid", "people", $attributs, "replace")) {
1792                      my_echo("<font color='green'>SUCCES</font>");
1793                  }
1794                  else{
1795                      my_echo("<font color='red'>ECHEC</font>");
1796                      $nb_echecs++;
1797                  }
1798              }
1799              else {
1800                  my_echo("<font color='blue'>SIMULATION</font>");
1801              }
1802              my_echo("<br />\n");
1803          }
1804      }
1805  }
1806  
1807  /**
1808  
1809  * Verifie et corrige le pseudo
1810  * @Parametres
1811  
1812  * @Return
1813  
1814  */
1815  
1816  function verif_et_corrige_pseudo($uid,$nom,$prenom) {
1817      // Verification/correction de l'attribut choisi pour le pseudo
1818      global $attribut_pseudo;
1819      global $annuelle;
1820      global $simulation;
1821  
1822      // En minuscules pour la recherche:
1823      $attribut_pseudo_min=strtolower($attribut_pseudo);
1824  
1825      // Correction du nom/prenom fournis
1826      $nom=remplace_accents(traite_espaces($nom));
1827      $prenom=remplace_accents(traite_espaces($prenom));
1828  
1829      $nom=preg_replace("/[^a-z_-]/","",strtolower("$nom"));
1830      $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom"));
1831  
1832      unset($attribut);
1833      $attribut=array("$attribut_pseudo_min");
1834      $tab=get_tab_attribut("people", "uid=$uid", $attribut);
1835      //my_echo("\$tab=get_tab_attribut(\"people\", \"uid=$uid\", \$attribut)<br />");
1836      //my_echo("count(\$tab)=".count($tab)."<br />");
1837  
1838      $tmp_pseudo=strtolower($prenom).strtoupper(substr($nom,0,1));
1839      if(count($tab)>0){
1840          // Si le pseudo existe déjà, on ne réinitialise le pseudo que lors d'un import annuel
1841          if($annuelle=="y") {
1842              //my_echo("\$tab[0]=".$tab[0]." et \$prenom=$prenom<br />");
1843              //$tmp_pseudo=strtolower($prenom).strtoupper(substr($nom,0,1));
1844              if("$tab[0]"!="$tmp_pseudo") {
1845                  unset($attributs);
1846                  $attributs=array();
1847                  $attributs["$attribut_pseudo"]=$tmp_pseudo;
1848                  my_echo("Correction de l'attribut '$attribut_pseudo': ");
1849                  if($simulation!='y') {
1850                      if(modify_attribut ("uid=$uid", "people", $attributs, "replace")) {
1851                          my_echo("<font color='green'>SUCCES</font>");
1852                      }
1853                      else{
1854                          my_echo("<font color='red'>ECHEC</font>");
1855                          $nb_echecs++;
1856                      }
1857                  }
1858                  else {
1859                      my_echo("<font color='blue'>SIMULATION</font>");
1860                  }
1861                  my_echo("<br />\n");
1862              }
1863          }
1864      }
1865      else {
1866          // L'attribut pseudo n'existait pas:
1867          unset($attributs);
1868          $attributs=array();
1869          //$attributs["$tmp_pseudo"]=strtolower($prenom).strtoupper(substr($nom,0,1));
1870          $attributs["$attribut_pseudo"]=$tmp_pseudo;
1871          my_echo("Renseignement de l'attribut '$attribut_pseudo': ");
1872          if($simulation!='y') {
1873              if(modify_attribut("uid=$uid", "people", $attributs, "add")) {
1874                  my_echo("<font color='green'>SUCCES</font>");
1875              }
1876              else{
1877                  my_echo("<font color='red'>ECHEC</font>");
1878                  $nb_echecs++;
1879              }
1880          }
1881          else {
1882              my_echo("<font color='blue'>SIMULATION</font>");
1883          }
1884          my_echo("<br />\n");
1885      }
1886  }
1887  
1888  function get_uid_from_f_uid_file($employeeNumber) {
1889      global $dossier_tmp_import_comptes;
1890  
1891      if(!file_exists("$dossier_tmp_import_comptes/f_uid.txt")) {
1892          return false;
1893      }
1894      else {
1895          $ftmp=fopen("$dossier_tmp_import_comptes/f_uid.txt","r");
1896          while(!feof($ftmp)) {
1897              $ligne=trim(fgets($ftmp,4096));
1898  
1899              if($tab=explode(";",$ligne)) {
1900                  if("$tab[0]"=="$employeeNumber") {
1901                      // On controle le login
1902                      if(strlen(preg_replace("/[A-Za-z0-9._\-]/","",$tab[1]))==0) {
1903                          return $tab[1];
1904                      }
1905                      else {
1906                          return false;
1907                      }
1908                      break;
1909                  }
1910              }
1911          }
1912      }
1913  }
1914  
1915  
1916  /**
1917  * Recherche les compte dans la branche Trash
1918  * @Parametres $filter filtre ldap de recherche
1919  * @return
1920  */
1921  
1922  // Fonction extraite de /annu/ldap_cleaner.php
1923  
1924  function search_people_trash ($filter) {
1925      //global $ldap_server, $ldap_port, $dn, $adminDn, $adminPw;
1926      global $ldap_server, $ldap_port, $dn;
1927      global $error;
1928      $error="";
1929      global $sambadomain;
1930  
1931      $adminLdap=get_infos_admin_ldap();
1932      $adminDn=$adminLdap["adminDn"];
1933      $adminPw=$adminLdap["adminPw"];
1934  
1935      //LDAP attributes
1936  
1937      $ldap_search_people_attr = array(
1938          "sambaacctFlags",
1939          "sambapwdMustChange",
1940          "sambantPassword",
1941          "sambalmPassword",
1942          "sambaSID",
1943          "sambaPrimaryGroupSID",
1944          "userPassword",
1945          "gecos",
1946          "employeenumber",
1947          "homedirectory",
1948          "gidNumber",
1949          "uidNumber",
1950          "loginShell",
1951          "objectClass",
1952          "mail",
1953          "sn",
1954          "givenName",
1955          "cn",
1956          "uid"
1957      );
1958  
1959      $ds = @ldap_connect ( $ldap_server, $ldap_port );
1960      if ( $ds ) {
1961          $r = @ldap_bind ( $ds,$adminDn, $adminPw );
1962          if ($r) {
1963          // Recherche dans la branche trash
1964          $result = @ldap_search ( $ds, $dn["trash"], $filter, $ldap_search_people_attr );
1965          if ($result) {
1966              $info = @ldap_get_entries ( $ds, $result );
1967              if ( $info["count"]) {
1968              for ($loop=0; $loop<$info["count"];$loop++) {
1969                  if ( isset($info[$loop]["employeenumber"][0]) ) {
1970                          $ret[$loop] = array (
1971                          "sambaacctflags"      => $info[$loop]["sambaacctflags"][0],
1972                          "sambapwdmustchange"  => $info[$loop]["sambapwdmustchange"][0],
1973                          "sambantpassword"     => $info[$loop]["sambantpassword"][0],
1974                          "sambalmpassword"     => $info[$loop]["sambalmpassword"][0],
1975                          "sambasid"            => $info[$loop]["sambasid"][0],
1976                          "sambaprimarygroupsid"   => $info[$loop]["sambaprimarygroupsid"][0],
1977                          "userpassword"        => $info[$loop]["userpassword"][0],
1978                          "gecos"               => $info[$loop]["gecos"][0],
1979                          "employeenumber"      => $info[$loop]["employeenumber"][0],
1980                          "homedirectory"       => $info[$loop]["homedirectory"][0],
1981                          "gidnumber"           => $info[$loop]["gidnumber"][0],
1982                          "uidnumber"           => $info[$loop]["uidnumber"][0],
1983                          "loginshell"          => $info[$loop]["loginshell"][0],
1984                          "mail"                => $info[$loop]["mail"][0],
1985                          "sn"                  => $info[$loop]["sn"][0],
1986                          "givenname"           => $info[$loop]["givenname"][0],
1987                          "cn"                  => $info[$loop]["cn"][0],
1988                          "uid"                 => $info[$loop]["uid"][0],
1989                          );
1990                  } else {
1991                          $ret[$loop] = array (
1992                          "sambaacctflags"      => $info[$loop]["sambaacctflags"][0],
1993                          "sambapwdmustchange"  => $info[$loop]["sambapwdmustchange"][0],
1994                          "sambantpassword"     => $info[$loop]["sambantpassword"][0],
1995                          "sambalmpassword"     => $info[$loop]["sambalmpassword"][0],
1996                          "sambasid"            => $info[$loop]["sambasid"][0],
1997                          "sambaprimarygroupsid"   => $info[$loop]["sambaprimarygroupsid"][0],
1998                          "userpassword"        => $info[$loop]["userpassword"][0],
1999                          "gecos"               => $info[$loop]["gecos"][0],
2000                          "homedirectory"       => $info[$loop]["homedirectory"][0],
2001                          "gidnumber"           => $info[$loop]["gidnumber"][0],
2002                          "uidnumber"           => $info[$loop]["uidnumber"][0],
2003                          "loginshell"          => $info[$loop]["loginshell"][0],
2004                          "mail"                => $info[$loop]["mail"][0],
2005                          "sn"                  => $info[$loop]["sn"][0],
2006                          "givenname"           => $info[$loop]["givenname"][0],
2007                          "cn"                  => $info[$loop]["cn"][0],
2008                          "uid"                 => $info[$loop]["uid"][0],
2009                          );
2010                  }
2011              }
2012              }
2013              @ldap_free_result ( $result );
2014          } else $error = "Erreur de lecture dans l'annuaire LDAP";
2015          } else $error = "Echec du bind en admin";
2016          @ldap_close ( $ds );
2017      } else $error = "Erreur de connection au serveur LDAP";
2018      // Tri du tableau par ordre alphabetique
2019      if (count($ret)) usort($ret, "cmp_name");
2020      return $ret;
2021  } // Fin function search_people_trash
2022  
2023  
2024  // Les temps sont durs, il faut faire les poubelles pour en recuperer des choses...
2025  function recup_from_trash($uid) {
2026      global $ldap_server, $ldap_port, $dn, $ldap_base_dn;
2027  
2028      $recup=false;
2029  
2030      $adminLdap=get_infos_admin_ldap();
2031      $adminDn=$adminLdap["adminDn"];
2032      $adminPw=$adminLdap["adminPw"];
2033  
2034      $user = search_people_trash ("uid=$uid");
2035      // Positionnement des constantes "objectclass"
2036      $user[0]["sambaacctflags"]="[U         ]";
2037      $user[0]["objectclass"][0]="top";
2038      $user[0]["objectclass"][1]="posixAccount";
2039      $user[0]["objectclass"][2]="shadowAccount";
2040      $user[0]["objectclass"][3]="person";
2041      $user[0]["objectclass"][4]="inetOrgPerson";
2042      $user[0]["objectclass"][5]="sambaAccount";
2043      $user[0]["objectclass"][5]="sambaSamAccount";
2044  
2045      $f=fopen("/tmp/recup_from_trash.txt","a+");
2046      foreach($user[0] as $key => $value) {
2047          fwrite($f,"\$user[0]['$key']=$value\n");
2048      }
2049      fwrite($f,"=======================\n");
2050      fclose($f);
2051  
2052      $ds = @ldap_connect ( $ldap_server, $ldap_port );
2053      if ( $ds ) {
2054          $f=fopen("/tmp/recup_from_trash.txt","a+");
2055          fwrite($f,"\$ds OK\n");
2056          fwrite($f,"=======================\n");
2057          fclose($f);
2058  
2059          $r = @ldap_bind ( $ds, $adminDn, $adminPw ); // Bind en admin
2060          if ($r) {
2061              $f=fopen("/tmp/recup_from_trash.txt","a+");
2062              fwrite($f,"\$r OK\n");
2063              fwrite($f,"=======================\n");
2064              fclose($f);
2065  
2066              // Ajout dans la branche people
2067              if ( @ldap_add ($ds, "uid=".$user[0]["uid"].",".$dn["people"],$user[0] ) ) {
2068                  $f=fopen("/tmp/recup_from_trash.txt","a+");
2069                  fwrite($f,"\ldap_add OK\n");
2070                  fwrite($f,"=======================\n");
2071                  fclose($f);
2072  
2073                  // Suppression de la branche Trash
2074                  @ldap_delete ($ds, "uid=".$user[0]["uid"].",".$dn["trash"] );
2075                  $recup=true;
2076              }
2077              else {
2078                  $recup=false;
2079              }
2080          }
2081      }
2082      ldap_close($ds);
2083  
2084      return $recup;
2085  }
2086  
2087  //====================================================
2088  function crob_getParam($name) {
2089      $sql="SELECT value FROM params WHERE name='".mysql_real_escape_string($name)."';";
2090      $res=mysql_query($sql);
2091      if(mysql_num_rows($res)>0) {
2092          $lig=mysql_fetch_object($res);
2093          return $lig->value;
2094      }
2095      else {
2096          return "";
2097      }
2098  }
2099  //====================================================
2100  function crob_setParam($name,$value,$descr) {
2101      $sql="DELETE FROM params WHERE name='".mysql_real_escape_string($name)."';";
2102      $del=mysql_query($sql);
2103  
2104      $sql="INSERT INTO params SET name='$name', descr='$descr', cat='0', value='".mysql_real_escape_string($value)."';";
2105      $insert=mysql_query($sql);
2106      if($insert) {return true;} else  {return false;}
2107  }
2108  //====================================================
2109  function formate_date_aaaammjj($date) {
2110      $tab_date=explode("/",$date);
2111  
2112      $retour="";
2113  
2114      if(isset($tab_date[2])) {
2115          $retour.=sprintf("%04d",$tab_date[2]).sprintf("%02d",$tab_date[1]).sprintf("%02d",$tab_date[0]);
2116      }
2117      else {
2118          $retour.=$date;
2119      }
2120  
2121      return $retour;
2122  }
2123  
2124  ?>


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1