[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

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

   1  <?php
   2  
   3  /**
   4   * Fonctions LDAP
   5  
   6   * @Version $Id: ldap.inc.php 7676 2013-02-19 23:46:17Z keyser $
   7  
   8   * @Projet LCS / SambaEdu
   9  
  10   * @Auteurs Equipe Tice academie de Caen
  11   * @Auteurs jLCF jean-luc.chretien@tice.ac-caen.fr
  12   * @Auteurs oluve olivier.le_monnier@crdp.ac-caen.fr
  13  
  14   * @Note: Ce fichier de fonction doit etre appele par un include
  15  
  16   * @Licence Distribue sous la licence GPL
  17   */
  18  /**
  19  
  20   * file: ldap.inc.php
  21   * @Repertoire: includes/
  22   */
  23  require_once  ("lang.inc.php");
  24  bindtextdomain('se3-core', "/var/www/se3/locale");
  25  textdomain('se3-core');
  26  
  27  // Pour activer/desactiver la modification du givenName (Prenom) lors de la modification dans annu/mod_user_entry.php
  28  $corriger_givenname_si_diff = "n";
  29  
  30  function cmp_fullname($a, $b) {
  31  
  32      /**
  33  
  34       * Fonctions de comparaison utilisees dans la fonction usort, pour trier le fullname
  35  
  36       * @Parametres $a - La premiere entree     $b - La deuxieme entree a comparer
  37  
  38       * @Return < 0 - Si $a est plus petit a $b  > 0 - Si $a est plus grand que $b
  39       */
  40      return strcmp($a["fullname"], $b["fullname"]);
  41  }
  42  
  43  function cmp_name($a, $b) {
  44  
  45  
  46      /**
  47  
  48       * Fonctions de comparaison utilisees dans la fonction usort, pour trier le name
  49  
  50       * @Parametres $a - La premiere entree     $b - La deuxieme entree a comparer
  51  
  52       * @Return < 0 - Si $a est plus petit a $b  > 0 - Si $a est plus grand que $b
  53  
  54       */
  55      return strcmp($a["name"], $b["name"]);
  56  }
  57  
  58  function cmp_cn($a, $b) {
  59  
  60      /**
  61  
  62       * Fonctions de comparaison utilisees dans la fonction usort, pour trier le cn (common name)
  63  
  64       * @Parametres  $a - La premiere entree  $b - La deuxieme entree a comparer
  65  
  66       * @Return  < 0 - Si $a est plus petit a $b   > 0 - Si $a est plus grand que $b
  67  
  68       */
  69      return strcmp($a["cn"], $b["cn"]);
  70  }
  71  
  72  function cmp_group($a, $b) {
  73  
  74      /**
  75  
  76       * Fonctions de comparaison utilisees dans la fonction usort, pour trier les groupes
  77  
  78       * @Parametres  $a - La premiere entree     $b - La deuxieme entree a comparer
  79       * @Return     < 0 - Si $a est plus petit a $b  > 0 - Si $a est plus grand que $b
  80  
  81       */
  82      return strcmp($a["group"], $b["group"]);
  83  }
  84  
  85  function cmp_cat($a, $b) {
  86  
  87  
  88      /**
  89  
  90       * Fonctions de comparaison utilisees dans la fonction usort, pour trier les categories
  91  
  92       * @Parametres  $a - La premiere entree  $b - La deuxieme entree a comparer
  93       * @Return     < 0 - Si $a est plus petit a $b  > 0 - Si $a est plus grand que $b
  94  
  95       */
  96      return strcmp($a["cat"], $b["cat"]);
  97  }
  98  
  99  function cmp_printer($a, $b) {
 100  
 101      /**
 102       * Fonctions de comparaison utilisees dans la fonction usort, pour trier le printer-name, insensible a la case
 103       * @Parametres  $a - La premiere entree  $b - La deuxieme entree a comparer
 104       * @Return  < 0 - Si $a est plus petit a $b   > 0 - Si $a est plus grand que $b
 105       */
 106      return strcasecmp($a["printer-name"], $b["printer-name"]);
 107  }
 108  
 109  function cmp_location($a, $b) {
 110  
 111      /**
 112       * Fonctions de comparaison utilisees dans la fonction usort, pour trier le printer-location, insensible a la case
 113       * @Parametres  $a - La premiere entree  $b - La deuxieme entree a comparer
 114       * @Return  < 0 - Si $a est plus petit a $b   > 0 - Si $a est plus grand que $b
 115       */
 116      return strcasecmp($a["printer-location"], $b["printer-location"]);
 117  }
 118  
 119  function extract_login($dn) {
 120  
 121      /**
 122  
 123       * Retourne un login a partir d'un dn
 124  
 125       * @Parametres $dn - Il est donne sous la forme uid=$login,ou=People,$base_dn
 126       * @Return     Le login de l'utilisateur ($login)
 127  
 128       */
 129      $login = preg_split("/,/", $dn, 4);
 130      $login = preg_split("/=/", $login[0], 2);
 131      return $login[1];
 132  }
 133  
 134  function getprenom($fullname, $name) {
 135  
 136      /**
 137       * Extrait le prenom depuis le nom complet et le nom
 138  
 139       * @Parametres $fullname - Il est donne sous la forme Prenom Nom
 140       * @Parametres $name - Le nom de famille de l'utilisateur
 141  
 142       * @Return     Le prenom de l'utilisateur
 143  
 144       */
 145      $expl = explode(" ", "$fullname");
 146      $namexpl = explode(" ", $name);
 147      $j = 0;
 148      $prenom = "";
 149      for ($i = 0; $i < count($expl); $i++) {
 150          if (strtolower($expl[$i]) != strtolower($namexpl[$j])) {
 151              if ("$prenom" == "")
 152                  $prenom = $expl[$i];
 153              else
 154                  $prenom.=" " . $expl[$i];
 155          } else
 156              $j++;
 157      }
 158  
 159      return $prenom;
 160  }
 161  
 162  function duree($t0, $t1) {
 163  
 164      /**
 165       * Calcule la duree entre t0 et t1
 166  
 167       * @Parametres $t0 - Il est donne sous en seconde
 168       * @Parametres $t1 - Il est donne sous en seconde
 169  
 170       * @Return     La duree en seconde
 171  
 172       */
 173      $result0 = preg_split("/[\ \!\?]/", $t0, 2);
 174      $t0ms = $result0[0];
 175      $t0s = $result0[1];
 176      $result1 = preg_split("/[\ \!\?]/", $t1, 2);
 177      $t1ms = $result1[0];
 178      $t1s = $result1[1];
 179      $tini = ( $t0s + $t0ms );
 180      $tfin = ( $t1s + $t1ms );
 181      $temps = ( $tfin - $tini );
 182      return ($temps);
 183  }
 184  
 185  function people_get_variables($uid, $mode) {
 186  
 187  
 188      /**
 189       * Retourne un tableau avec les variables d'un utilisateur (a partir de l'annuaire LDAP)
 190  
 191       * @Parametres $uid - L'uid de l'utilisateur
 192       * @Parametres $mode : - true => recherche  - de l'ensemble des parametres utilisateur - des groupes d'appartenance - false => recherche  - de quelques parametres utilisateur
 193  
 194  
 195       * @Return  Un tableau contenant les informations sur l'utilisateur (uid)
 196  
 197       */
 198      global $ldap_server, $ldap_port, $dn;
 199      global $error;
 200      $error = "";
 201  
 202      $ret_group=array();
 203      $ret_people=array();
 204  
 205      // LDAP attribute
 206      $ldap_people_attr = array(
 207          "uid", // login
 208          "cn", // Prenom Nom
 209          "sn", // Nom
 210          "givenname", // Pseudo -> Prenom
 211          "mail", // Mail
 212          "telephonenumber", // Num telephone
 213          "homedirectory", // Home directory personnal web space
 214          "description",
 215          "loginshell",
 216          "gecos", // Prenom Nom (cn sans accents ),Date de naissance,Sexe (F/M),Status administrateur Se3/Lcs (Y/N obsolete
 217          "employeeNumber",
 218          "initials"             // pseudo
 219      );
 220  
 221  
 222      $ldap_group_attr = array(
 223          "cn",
 224          //"member",      // Membres du Group Profs
 225          "owner",
 226          "description", // Description de l'equipe
 227          "member"
 228      );
 229  
 230      $ds = @ldap_connect($ldap_server, $ldap_port);
 231      if ($ds) {
 232          $r = @ldap_bind($ds); // Bind anonyme
 233          if ($r) {
 234              $result = @ldap_read($ds, "uid=" . $uid . "," . $dn["people"], "(objectclass=posixAccount)", $ldap_people_attr);
 235              if ($result) {
 236                  $info = @ldap_get_entries($ds, $result);
 237                  if ($info["count"]) {
 238  
 239                      // Traitement du champ gecos pour extraction de date de naissance, sexe, isAdmin
 240                      if(isset($info[0]["gecos"][0])) {
 241                          $gecos = $info[0]["gecos"][0];
 242                          $tmp = preg_split("/,/", $info[0]["gecos"][0], 4);
 243                      }
 244                      $ret_people = array(
 245                          "uid" => $info[0]["uid"][0],
 246                          "nom" => stripslashes(utf8_decode($info[0]["sn"][0])),
 247                          "fullname" => stripslashes(utf8_decode($info[0]["cn"][0])),
 248                          "prenom" => (isset($info[0]["givenname"][0])) ? utf8_decode($info[0]["givenname"][0]) : "",
 249                          "pseudo" => (isset($info[0]["initials"][0]) ? utf8_decode($info[0]["initials"][0]) : ""),
 250                          "gecos" => (isset($info[0]["gecos"][0]) ? utf8_decode($info[0]["gecos"][0]) : ""),
 251                          "email" => $info[0]["mail"][0],
 252                          "tel" => (isset($info[0]["telephonenumber"][0]) ? $info[0]["telephonenumber"][0] : ""),
 253                          "homedirectory" => $info[0]["homedirectory"][0],
 254                          "description" => (isset($info[0]["description"][0]) ? utf8_decode($info[0]["description"][0]) : ""),
 255                          "shell" => $info[0]["loginshell"][0],
 256                          "sexe" => (isset($tmp[2]) ? $tmp[2] : ""),
 257                          "admin" => (isset($tmp[3]) ? $tmp[3] : ""),
 258                          "employeeNumber" => (isset($info[0]["employeenumber"][0]) ? $info[0]["employeenumber"][0] : "")
 259                      );
 260                  }
 261  
 262                  @ldap_free_result($result);
 263              }
 264  
 265              if ($mode) {
 266                  // Recherche des groupes d'appartenance dans la branche Groups
 267                  $filter = "(|(&(objectclass=groupOfNames)(member= uid=$uid," . $dn["people"] . "))(&(objectclass=groupOfNames)(owner= uid=$uid," . $dn["people"] . "))(&(objectclass=posixGroup)(memberuid=$uid)))";
 268                  $result = @ldap_list($ds, $dn["groups"], $filter, $ldap_group_attr);
 269                  if ($result) {
 270                      $info = @ldap_get_entries($ds, $result);
 271                      if ($info["count"]) {
 272                          for ($loop = 0; $loop < $info["count"]; $loop++) {
 273                              if ((!isset($info[$loop]["member"][0]))||($info[$loop]["member"][0] == "")) {
 274                                  $typegr = "posixGroup";
 275                              }
 276                              else {
 277                                  $typegr="groupOfNames";
 278                              }
 279                              $ret_group[$loop] = array(
 280                                  "cn" => $info[$loop]["cn"][0],
 281                                  "owner" => (isset($info[$loop]["owner"][0]) ? $info[$loop]["owner"][0] : ""),
 282                                  "description" => utf8_decode($info[$loop]["description"][0]),
 283                                  "type" => $typegr
 284                              );
 285                          }
 286  
 287                          usort($ret_group, "cmp_cn");
 288                      }
 289  
 290                      @ldap_free_result($result);
 291                  }
 292              } // Fin recherche des groupes
 293          } else {
 294              $error = gettext("Echec du bind anonyme");
 295          }
 296  
 297          @ldap_close($ds);
 298      } else {
 299          $error = gettext("Erreur de connection au serveur LDAP");
 300      }
 301  
 302      return array($ret_people, $ret_group);
 303  }
 304  
 305  function search_people($filter) {
 306  
 307      /**
 308       * Recherche d'utilisateurs dans la branche people
 309  
 310       * @Parametres $filter - Un filtre de recherche permettant l'extraction de l'annuaire des utilisateurs
 311       * @Return  Un tableau contenant les utilisateurs repondant au filtre de recherche ($filter)
 312  
 313       */
 314      global $ldap_server, $ldap_port, $dn;
 315      global $error;
 316      $error = "";
 317  
 318      // Initialisation:
 319      $ret=array();
 320  
 321      //LDAP attributes
 322      $ldap_search_people_attr = array(
 323          "uid", // login
 324          "cn", // Nom complet
 325          "sn"     // Nom
 326      );
 327  
 328      $ds = @ldap_connect($ldap_server, $ldap_port);
 329      if ($ds) {
 330          $r = @ldap_bind($ds); // Bind anonyme
 331          if ($r) {
 332              // Recherche dans la branche people
 333              $result = @ldap_search($ds, $dn["people"], $filter, $ldap_search_people_attr);
 334              if ($result) {
 335                  $info = @ldap_get_entries($ds, $result);
 336                  if ($info["count"]) {
 337                      for ($loop = 0; $loop < $info["count"]; $loop++) {
 338                          $ret[$loop] = array(
 339                              "uid" => $info[$loop]["uid"][0],
 340                              "fullname" => utf8_decode($info[$loop]["cn"][0]),
 341                              "name" => utf8_decode($info[$loop]["sn"][0]),
 342                          );
 343                      }
 344                  }
 345  
 346                  @ldap_free_result($result);
 347              } else {
 348                  $error = gettext("Erreur de lecture dans l'annuaire LDAP");
 349              }
 350          } else {
 351              $error = gettext("Echec du bind anonyme");
 352          }
 353  
 354          @ldap_close($ds);
 355      } else {
 356          $error = gettext("Erreur de connection au serveur LDAP");
 357      }
 358  
 359      // Tri du tableau par ordre alphabetique
 360      if (count($ret)) {
 361          usort($ret, "cmp_name");
 362      }
 363      return $ret;
 364  }
 365  
 366  function search_uids($filter) {
 367  
 368  
 369      /**
 370       * Recherche des uids dans des classes et equipes repondant au critere $filter  dans la branche Groups (posix)
 371  
 372       * @Parametres $filter - Un filtre de recherche permettant l'extraction de l'annuaire des utilisateurs
 373       * @Return  Un tableau contenant les utilisateurs repondant au filtre de recherche ($filter)
 374  
 375       */
 376      global $ldap_server, $ldap_port, $dn, $ldap_classe_attr, $ldap_equipe_attr;
 377      global $error;
 378      $error = "";
 379  
 380      // LDAP attributs
 381      $ldap_classe_attr = array(
 382          "cn",
 383          "memberuid" // Membres du groupe Classe
 384      );
 385  
 386      $ldap_equipe_attr = array(
 387          "cn",
 388          "member", // Membres du groupe Profs
 389          "owner"     // proprietaire du groupe
 390      );
 391  
 392      // echo "filtre : $filter";
 393      $ds = @ldap_connect($ldap_server, $ldap_port);
 394      if ($ds) {
 395          $r = @ldap_bind($ds); // Bind anonyme
 396          if ($r) {
 397              // if ((preg_match("/Matiere/",$filter,$matche) && preg_match("/Equipe/",$filter,$matche))||preg_match("/Classe/",$filter,$matche)) {
 398              // Debug
 399              //echo "filtre 1 memberuid : $filter<BR>";
 400              // Recherche dans la branche Groups Classe_ et Cours_
 401              $result = @ldap_list($ds, $dn["groups"], $filter, $ldap_classe_attr);
 402              if ($result) {
 403                  $info = @ldap_get_entries($ds, $result);
 404                  if ($info["count"]) {
 405                      // Stockage des logins des membres des classes
 406                      //  dans le tableau $ret
 407                      $init = 0;
 408                      for ($loop = 0; $loop < $info["count"]; $loop++) {
 409                          //$group = preg_split("/[\_\]/", $info[$loop]["cn"][0], 2);
 410                          $group = preg_split("/_/", $info[$loop]["cn"][0], 2);
 411                          for ($i = 0; $i < $info[$loop]["memberuid"]["count"]; $i++) {
 412                              // Ajout de wawa : test si le gus est prof
 413                              $filtre1 = "(memberUid=" . $info[$loop]["memberuid"][$i] . ")";
 414                              $result1 = @ldap_read($ds, "cn=Profs," . $dn["groups"], $filtre1);
 415                              $ret[$init]["prof"] = @ldap_count_entries($ds, $result1);
 416                              @ldap_free_result($result1);
 417                              // fin patch a wawa
 418                              $ret[$init]["uid"] = $info[$loop]["memberuid"][$i];
 419                              $ret[$init]["group"] = $group[1];
 420                              $ret[$init]["cat"] = $group[0];
 421                              $init++;
 422                          }
 423                      }
 424                  }
 425  
 426                  ldap_free_result($result);
 427              }
 428              // }
 429              // Passage en posix plus lieu d'etre
 430              // if (ereg("Classe",$filter,$matche)||ereg("Matiere",$filter,$matche)||ereg("Equipe",$filter,$matche)) {
 431              // Modifie par Wawa: filter2 supprime
 432              // $filter2 = ereg_replace("Classe_","Equipe_",$filter);
 433              // Debug
 434              // echo "filtre 2 member : $filter2<BR>";
 435              /*   $result=@ldap_list ($ds, $dn["groups"], $filter, $ldap_equipe_attr);
 436                if ($result) {
 437                $info = @ldap_get_entries( $ds, $result );
 438                if ($info["count"]) {
 439                $init=count($ret);
 440                $owner = extract_login ($info[0]["owner"][0]);
 441                for ($loop=0; $loop < $info["count"]; $loop++) {
 442                $group=split ("[\_\]",$info[$loop]["cn"][0],2);
 443                for ( $i = 0; $i < $info[$loop]["member"]["count"]; $i++ ) {
 444                // Cas ou un champ member est non vide
 445                if ( extract_login ($info[$loop]["member"][$i])!="") {
 446                $ret[$init]["uid"] = extract_login ($info[$loop]["member"][$i]);
 447                if ($owner == extract_login ($info[$loop]["member"][$i])) $ret[$init]["owner"] = true;
 448                $ret[$init]["group"] = $group[1];
 449                $ret[$init]["cat"] = $group[0];
 450                $init++;
 451                }
 452                }
 453                }
 454                }
 455                @ldap_free_result ( $result );
 456                }
 457  
 458                } */
 459          } else {
 460              $error = gettext("Echec du bind anonyme");
 461          }
 462  
 463          @ldap_close($ds);
 464      } else {
 465          $error = gettext("Erreur de connection au serveur LDAP");
 466      }
 467      //$ret = doublon ($ret);
 468      return $ret;
 469  }
 470  
 471  function search_groups($filter) {
 472  
 473      /**
 474       * Recherche une liste de groupes repondants aux criteres fixes par la variable $filter. Les filtres sont les memes que pour ldapsearch.
 475       * Par exemple (&(uidMember=wawa)(uidMember=toto)) recherche le groupe contenant les utilisateurs wawa et toto.
 476  
 477       * @Parametres $filter - Un filtre de recherche permettant l'extraction de l'annuaire des utilisateurs
 478  
 479  
 480       * @Return     Retourne un tableau $groups avec le cn et la description de chaque groupe
 481       */
 482      global $ldap_server, $ldap_port, $dn;
 483      global $error;
 484  
 485      $groups=array();
 486  
 487      // LDAP attributs
 488      $ldap_group_attr = array(
 489          "objectclass",
 490          "cn",
 491          "memberUid",
 492          "gidnumber",
 493          "description"  // Description du groupe
 494      );
 495  
 496      $ds = @ldap_connect($ldap_server, $ldap_port);
 497      if ($ds) {
 498          $r = @ldap_bind($ds); // Bind anonyme
 499          if ($r) {
 500              $result = @ldap_list($ds, $dn["groups"], $filter, $ldap_group_attr);
 501  
 502              if ($result) {
 503                  $info = @ldap_get_entries($ds, $result);
 504                  if ($info["count"]) {
 505                      for ($loop = 0; $loop < $info["count"]; $loop++) {
 506                          $groups[$loop]["cn"] = $info[$loop]["cn"][0];
 507                          $groups[$loop]["gidnumber"] = $info[$loop]["gidnumber"][0];
 508                          if(isset($info[$loop]["description"][0])) {$groups[$loop]["description"] = utf8_decode($info[$loop]["description"][0]);}
 509                          // Recherche de posixGroup ou groupOfNames
 510                          for ($i = 0; $i < $info[$loop]["objectclass"]["count"]; $i++) {
 511                              if ($info[$loop]["objectclass"][$i] != "top")
 512                                  $type = $info[$loop]["objectclass"][$i];
 513                          }
 514                          $groups[$loop]["type"] = $type;
 515                      }
 516                  }
 517  
 518                  @ldap_free_result($result);
 519              }
 520          }
 521  
 522          @ldap_close($ds);
 523      }
 524  
 525      if (count($groups))
 526          usort($groups, "cmp_cn");
 527  
 528      return $groups;
 529  }
 530  
 531  function search_people_groups($uids, $filter, $order) {
 532  
 533  
 534      /**
 535       * Recherche des utilisateurs dans la branche people a partir d'un tableau d'uids nons tries
 536  
 537  
 538       * @Parametres $order - "cat"   => Tri par categorie (Eleves, Equipe...)
 539       * @Parametres       - "group" => Tri par intitule de group (ex: 1GEA, TGEA...)
 540       * @Parametres $uids - Tableau d'uids d'utilisateurs
 541       * @Parametres $filter - Filtre de recherche
 542  
 543       * @Return     Retourne un tableau des utilisateurs repondant au filtre de recherche
 544       */
 545      global $ldap_server, $ldap_port, $dn;
 546      global $error;
 547      $error = "";
 548  
 549      // LDAP attributs
 550      $ldap_user_attr = array(
 551          "cn", // Nom complet
 552          "sn", // Nom
 553          "gecos", // Nom prenom (cn sans accents), Date de naissance,Sexe (F/M),Status administrateur LCS (Y/N)
 554          "employeeNumber"
 555      );
 556  
 557      if (!$filter)
 558          $filter = "(sn=*)";
 559      $ds = @ldap_connect($ldap_server, $ldap_port);
 560      if ($ds) {
 561          $r = @ldap_bind($ds); // Bind anonyme
 562          if ($r) {
 563              $loop1 = 0;
 564              for ($loop = 0; $loop < count($uids); $loop++) {
 565                  $result = @ldap_read($ds, "uid=" . $uids[$loop]["uid"] . "," . $dn["people"], $filter, $ldap_user_attr);
 566                  if ($result) {
 567                      $info = @ldap_get_entries($ds, $result);
 568                      if ($info["count"]) {
 569                          // traitement du gecos pour identification du sexe
 570                          $gecos = $info[0]["gecos"][0];
 571                          //$tmp = preg_split("/[\,\]/", $gecos, 4);
 572                          $tmp = preg_split("/,/", $gecos, 4);
 573                          #echo "debug ".$info["count"]." init ".$init." loop ".$loop."<BR>";
 574                          $ret[$loop1] = array(
 575                              "uid" => $uids[$loop]["uid"],
 576                              "fullname" => utf8_decode($info[0]["cn"][0]),
 577                              "name" => utf8_decode($info[0]["sn"][0]),
 578                              "sexe" => $tmp[2],
 579                              "owner" => $uids[$loop]["owner"],
 580                              "group" => $uids[$loop]["group"],
 581                              "cat" => $uids[$loop]["cat"],
 582                              "gecos" => $gecos,
 583                              "prof" => $uids[$loop]["prof"],
 584                              "employeeNumber" => $info[0]["employeenumber"][0]
 585                          );
 586  
 587                          $loop1++;
 588                      }
 589  
 590                      @ldap_free_result($result);
 591                  }
 592              }
 593          } else {
 594              $error = gettext("Echec du bind anonyme");
 595          }
 596  
 597          @ldap_close($ds);
 598      } else
 599          $error = gettext("Erreur de connection au serveur LDAP");
 600  
 601      if (count($ret)) {
 602  
 603          # Correction tri du tableau
 604          # Tri par critere categorie ou intitule de groupe
 605          if ($order == "cat")
 606              usort($ret, "cmp_cat");
 607          elseif ($order == "group")
 608              usort($ret, "cmp_group");
 609          # Recherche du nombre de categories ou d'intitules de groupe
 610          $i = 0;
 611          for ($loop = 0; $loop < count($ret); $loop++) {
 612              if ($ret[$loop][$order] != $ret[$loop - 1][$order]) {
 613                  $tab_order[$i] = $ret[$loop][$order];
 614                  $i++;
 615              }
 616          }
 617  
 618          if (count($tab_order) > 0) {
 619              $ret_final = array();
 620              # On decoupe le tableau $ret en autant de sous tableaux $tmp que de criteres $order
 621              for ($i = 0; $i < count($tab_order); $i++) {
 622                  $j = 0;
 623                  for ($loop = 0; $loop < count($ret); $loop++) {
 624                      if ($ret[$loop][$order] == $tab_order[$i]) {
 625                          $ret_tmp[$i][$j] = $ret[$loop];
 626                          $j++;
 627                      }
 628                  }
 629              }
 630  
 631              # Tri alpabetique des sous tableaux
 632              for ($loop = 0; $loop < count($ret_tmp); $loop++)
 633                  usort($ret_tmp[$loop], "cmp_name");
 634  
 635              # Reassemblage des tableaux temporaires
 636              for ($loop = 0; $loop < count($tab_order); $loop++)
 637                  $ret_final = array_merge($ret_final, $ret_tmp[$loop]);
 638              return $ret_final;
 639          } else {
 640              usort($ret, "cmp_name");
 641              return $ret;
 642          }
 643      }
 644  }
 645  
 646  // Recherche de machines
 647  function search_computers($filter) {
 648  
 649      /**
 650       * Recherche de machines dans ou computers
 651  
 652       * @Parametres $filter - Un filtre de recherche permettant l'extraction de l'annuaire des machines
 653       * @Return Retourne un tableau avec les machines
 654       */
 655      return search_machines($filter, "computers");
 656  }
 657  
 658  function search_machines($filter, $branch) {
 659  
 660      /**
 661       * Recherche de machines dans l'ou $branch
 662  
 663       * @Parametres $filter - Un filtre de recherche permettant l'extraction de l'annuaire des machines
 664       * @Parametres $branch - L'ou correspondant a l'ou contenant les machines
 665  
 666       * @Return     Retourne un tableau avec les machines
 667       */
 668      global $ldap_server, $ldap_port, $dn;
 669      global $error;
 670  
 671      // Initialisation
 672      $computers=array();
 673  
 674      // LDAP attributs
 675      if ("$branch" == "computers")
 676          $ldap_computer_attr = array(
 677              "cn",
 678              "iphostnumber", // ip Host
 679              "macaddress", // adresse mac
 680              "l", // Status de la machine
 681              "description"        // Description de la machine
 682          );
 683      else
 684          $ldap_computer_attr = array(
 685              "cn"
 686          );
 687  
 688      $ds = @ldap_connect($ldap_server, $ldap_port);
 689      if ($ds) {
 690          $r = @ldap_bind($ds); // Bind anonyme
 691          if ($r) {
 692              $result = @ldap_list($ds, $dn[$branch], $filter, $ldap_computer_attr);
 693              if ($result) {
 694                  $info = @ldap_get_entries($ds, $result);
 695                  if ($info["count"]) {
 696                      for ($loop = 0; $loop < $info["count"]; $loop++) {
 697                          $computers[$loop]["cn"] = $info[$loop]["cn"][0];
 698                          if ("$branch" == "computers") {
 699                              $computers[$loop]["ipHostNumber"] = $info[$loop]["iphostnumber"][0];
 700                              if(isset($info[$loop]["macaddress"][0])) {$computers[$loop]["macAddress"] = $info[$loop]["macaddress"][0];}
 701                              if(isset($info[$loop]["l"][0])) {$computers[$loop]["l"] = $info[$loop]["l"][0];}
 702                              if(isset($info[$loop]["description"][0])) {$computers[$loop]["description"] = utf8_decode($info[$loop]["description"][0]);}
 703                          }
 704                      }
 705                  }
 706  
 707                  @ldap_free_result($result);
 708              }
 709          }
 710  
 711          @ldap_close($ds);
 712      }
 713  
 714      return $computers;
 715  }
 716  
 717  function group_type($groupe) {
 718  
 719      /**
 720       * Recherche le type du goupe ou de l'utilisiateur
 721  
 722       * @Parametres $groupe
 723       * @Return  $type 
 724  
 725       */
 726      global $ldap_server, $ldap_port, $dn;
 727      global $error;
 728      if (($groupe == "base") or ($groupe == "admin") or ($groupe == "eleves") or ($groupe == "profs") or ($groupe == "administratifs") or ($groupe == "overfill")) {
 729  //        echo "groupe : " . $groupe . "-> " . $groupe . "<br>";
 730          return $groupe;
 731      } else {
 732          $ds = @ldap_connect($ldap_server, $ldap_port);
 733          if ($ds) {
 734              $r = @ldap_bind($ds); // Bind anonyme
 735              if ($r) {
 736                  $result = @ldap_list($ds, $dn['groups'], "cn=$groupe", array("cn"));
 737                  if ($result) {
 738                      $info = @ldap_get_entries($ds, $result);
 739                      if ($info["count"]) {
 740                          $type = "groupes";
 741                          @ldap_free_result($result);
 742                      } else {
 743                          $result = @ldap_list($ds, $dn['parcs'], "cn=$groupe", array("cn"));
 744                          if ($result) {
 745                              $info = @ldap_get_entries($ds, $result);
 746                              if ($info["count"]) {
 747                                  $type = "parcs";
 748                                  @ldap_free_result($result);
 749                              } else {
 750                                  $result = @ldap_list($ds, $dn['people'], "uid=$groupe", array("uid"));
 751                                  if ($result) {
 752                                      $info = @ldap_get_entries($ds, $result);
 753                                      if ($info["count"]) {
 754                                          $type = "utilisateur";
 755                                          @ldap_free_result($result);
 756                                      } else {
 757                                          $result = @ldap_list($ds, $dn['computers'], "cn=$groupe", array("cn"));
 758                                          if ($result) {
 759                                              $info = @ldap_get_entries($ds, $result);
 760                                              if ($info["count"]) {
 761                                                  $type = "machine";
 762                                                  @ldap_free_result($result);
 763                                              }
 764                                          }
 765                                      }
 766                                  }
 767                              }
 768                          }
 769                      }
 770                  }
 771              }
 772              @ldap_close($ds);
 773  //            echo "groupe : " . $groupe . "-> " . $type . "<br>";
 774              return $type;
 775          }
 776      }
 777  }
 778  
 779  function search_samba($computername) {
 780  
 781      /**
 782       * Recherche des machines windows dan computers
 783  
 784       * @Parametres $computerbname
 785       * @Return  true si existe
 786  
 787       */
 788      global $ldap_server, $ldap_port, $dn;
 789      global $error;
 790      $error = "";
 791  
 792      //LDAP attributes
 793      $ldap_search_samba_attr = array(
 794          "uid", // login
 795      );
 796  
 797      $ds = @ldap_connect($ldap_server, $ldap_port);
 798      if ($ds) {
 799          $r = @ldap_bind($ds); // Bind anonyme
 800          if ($r) {
 801              // Recherche dans la branche people
 802              $result = @ldap_search($ds, $dn["computers"], "(uid=" . $computername . "$)", $ldap_search_samba_attr);
 803              if ($result) {
 804                  $info = @ldap_get_entries($ds, $result);
 805                  if ($info["count"]) {
 806                      $ret = TRUE;
 807                  }
 808                  @ldap_free_result($result);
 809              } else {
 810                  $ret = FALSE;
 811                  $error = gettext("Erreur de lecture dans l'annuaire LDAP");
 812              }
 813          } else {
 814              $error = gettext("Echec du bind anonyme");
 815              $ret = FALSE;
 816          }
 817  
 818          @ldap_close($ds);
 819      } else {
 820          $error = gettext("Erreur de connection au serveur LDAP");
 821          $ret = FALSE;
 822      }
 823      return $ret;
 824  }
 825  
 826  function search_parcs($machine) {
 827  
 828  
 829      /**
 830       * Recherche les parcs ou se trouve la  machine $machine
 831  
 832       * @Parametres $machine - Le nom de la machine dont on cherche les parcs
 833       * @Return Retourne un tableau avec les parcs contenant la machine
 834       */
 835      global $ldap_server, $ldap_port, $dn;
 836      global $error;
 837  
 838      $ldap_computer_attr = array(
 839          "cn"
 840      );
 841  
 842      $filter = "(&(objectclass=groupOfNames)(member=cn=$machine," . $dn["computers"] . "))";
 843      $ds = @ldap_connect($ldap_server, $ldap_port);
 844      if ($ds) {
 845          $r = @ldap_bind($ds); // Bind anonyme
 846          if ($r) {
 847              $result = @ldap_list($ds, $dn["parcs"], $filter, $ldap_computer_attr);
 848              if ($result) {
 849                  $info = @ldap_get_entries($ds, $result);
 850                  if ($info["count"]) {
 851                      for ($loop = 0; $loop < $info["count"]; $loop++) {
 852                          $computers[$loop]["cn"] = $info[$loop]["cn"][0];
 853                      }
 854                  }
 855  
 856                  @ldap_free_result($result);
 857              }
 858          }
 859  
 860          @ldap_close($ds);
 861      }
 862  
 863      return $computers;
 864  }
 865  
 866  function gof_members($gof, $branch, $extract) {
 867  
 868      /**
 869       * Liste les membres du groupOfNames $gof
 870  
 871       * @Parametres $gof - $gof est le GroupOfNames dans lequel on recherche un objet
 872       * @Parametres $branche - L'ou ou se fait la recherche
 873       * @Parametres $extract - Peut prendre la valeur 1 pour n'extraire qu'un membre.
 874  
 875       * @Return  Retourne un tableau avec les membres du GroupOfNames repondant a la recherche
 876       */
 877      global $ldap_server, $ldap_port, $dn;
 878      global $error;
 879      $error = "";
 880  
 881      // Initialisation:
 882      $ret=array();
 883  
 884      // LDAP attributs
 885      $members_attr = array(
 886          "member"   // Membres du groupe Profs
 887      );
 888      $ds = @ldap_connect($ldap_server, $ldap_port);
 889      if ($ds) {
 890          $r = @ldap_bind($ds); // Bind anonyme
 891          if ($r) {
 892              $result = @ldap_read($ds, "cn=$gof," . $dn[$branch], "cn=*", $members_attr);
 893              if ($result) {
 894                  $info = @ldap_get_entries($ds, $result);
 895                  if ($info["count"] == 1) {
 896                      $init = 0;
 897                      for ($loop = 0; $loop < $info[0]["member"]["count"]; $loop++) {
 898                          if ($extract == 1)
 899                              $ret[$loop] = extract_login($info[0]["member"][$loop]);
 900                          else
 901                              $ret[$loop] = $info[0]["member"][$loop];
 902                      }
 903                  }
 904  
 905                  @ldap_free_result($result);
 906              }
 907          } else {
 908              $error = gettext("Echec du bind anonyme");
 909          }
 910  
 911          @ldap_close($ds);
 912      } else {
 913          $error = gettext("Erreur de connection au serveur LDAP");
 914      }
 915      return $ret;
 916  }
 917  
 918  /**
 919  
 920   * liste les machines d'un parc
 921  
 922   * @Parametres  Nom du parc 
 923   * @Return  tableau['machines', 'printers']
 924   */
 925  function liste_parc($parc) {
 926      $mp_all = gof_members($parc, "parcs", 1);
 927      foreach ($mp_all as $key => $value) {
 928  //        print $value;
 929  //        if (preg_match( "printerName=".$, $value)) {
 930  //            $ret['printers'][]=$value;
 931  //        }
 932  //        else {
 933          $ret['computers'][] = $value;
 934  //        }
 935      }
 936      return $ret;
 937  }
 938  function filter_parcs($filter) {
 939  
 940      /**
 941       * Liste les membres des parcs répondant aux filtre
 942       * @Parametres $filter filtre ldap
 943  
 944       * @Return  Retourne un tableau avec les membres  repondant a la recherche
 945       */
 946      global $ldap_server, $ldap_port, $dn;
 947      global $error;
 948      $error = "";
 949  
 950      // Initialisation:
 951      $ret=array();
 952  
 953      // LDAP attributs
 954      $members_attr = array(
 955          "member"
 956      );
 957      $ds = @ldap_connect($ldap_server, $ldap_port);
 958      if ($ds) {
 959          $r = @ldap_bind($ds); // Bind anonyme
 960          if ($r) {
 961              $result = @ldap_read($ds, $dn["parcs"], $filter, $members_attr);
 962              if ($result) {
 963                  $info = @ldap_get_entries($ds, $result);
 964                  if ($info["count"] == 1) {
 965                      foreach($info[0]["member"] as $value) {
 966                          if ((preg_match( "/cn=/", $value))) {
 967                              $ret[] = extract_login($value);
 968                          }
 969                      }
 970                  }
 971                  @ldap_free_result($result);
 972              }
 973          } else {
 974              $error = gettext("Echec du bind anonyme");
 975          }
 976  
 977          @ldap_close($ds);
 978      } else {
 979          $error = gettext("Erreur de connection au serveur LDAP");
 980      }
 981      return $ret;
 982  }
 983  
 984  
 985  function tstclass($prof, $eleve) {
 986  
 987      /**
 988       * test si $eleve est dans la classe de $prof
 989  
 990       * @note Les tests sont effectues sur l'appartenance a au moins un groupe dans l'ou Groups. Normalement le prof et l'eleve sont tous les deux dans le groupe Cours_
 991       * @note On teste d'abord si le prof est bien dans l'equipe dela classe de l'eleve
 992  
 993       * @Parametres $prof - Le nom du prof suppose etre prof de $eleve
 994       * @Parametres $eleve - L'eleve de $prof a tester.
 995  
 996       * @Return     Retourne 1 si on a une reponse positive
 997  
 998       */
 999      $filtre = "(&(memberUid=$eleve)(cn=Classe_*))";
1000      $classe = search_groups($filtre);
1001      if (count($classe) == 1) {
1002          $equipe = preg_replace("/Classe_/", "Equipe_", $classe[0]["cn"]);
1003          $filtre = "(&(memberUid=$prof)(cn=$equipe))";
1004          $res = search_groups($filtre);
1005          if (count($res) == 1) {
1006              $tstclass = 1;
1007          }
1008      } else {
1009          $filtre = "(&(memberUid=$prof)(memberUid=$eleve))";
1010          $grcomm = search_groups($filtre);
1011          $tstclass = 0;
1012          if (count($grcomm) > 0) {
1013              $i = 0;
1014              while (($i < count($grcomm)) and ($tstclass == 0)) {
1015                  if (preg_match("/Cours/", $grcomm[$i]["cn"], $matche)) {$tstclass = 1;}
1016                  $i++;
1017              }
1018          }
1019      }
1020  
1021      return $tstclass;
1022  }
1023  
1024  function verifGroup($login) {
1025  
1026      /**
1027       * test si $login est dans le groupe Profs
1028  
1029       * @Parametres $login - Le login de l'utilisateur a tester
1030  
1031       * @Return     Retourne True si on a une reponse positive
1032  
1033       */
1034      $group = FALSE;
1035      // verification de l'utilisateur, eleve ou prof
1036      list($user, $groups) = people_get_variables($login, true);
1037      for ($loop = 0; $loop < count($groups); $loop++) {
1038          if ($groups[$loop]["cn"] == "Profs") {
1039              $group = TRUE;
1040          }
1041      }
1042  
1043      return $group;
1044  }
1045  
1046  function userChangedPwd($uid, $userpwd) {
1047  
1048  
1049      /**
1050       * Change le mot de passe d'un utilisateur
1051  
1052       * @Parametres $uid - Le login de la personne
1053       * @Parametres $userpwd - Le mot de passe de la personne
1054  
1055       * @Return     Retourne un affichage HTML
1056  
1057       */
1058      exec("/usr/share/se3/sbin/userChangePwd.pl '$uid' '$userpwd'", $AllOutPut, $ReturnValue);
1059      if ($ReturnValue == "0") {
1060          echo "<strong>" . gettext("Le mot de passe a &#233;t&#233; modifi&#233; avec succ&#232;s.") . "</strong><br>\n";
1061      } else {
1062          echo "<div class='error_msg'>" . gettext("Echec de la modification") . " <font color='black'>(" . gettext("type d'erreur") . " : $ReturnValue)</font>, " . gettext("veuillez contacter") . " <A HREF='mailto:$MelAdminLCS?subject=" . gettext("PB changement mot de passe") . "'>" . gettext("l'administrateur du syst&#232;me") . "</A></div><BR>\n";
1063      }
1064  }
1065  
1066  function userDesactive($uid, $act) {
1067  
1068      /**
1069       * Active ou desactive le compte d'un utilisateur
1070  
1071       * @Parametres $uid - Le login de la personne
1072       * @Parametres $act - Ce qui doit etre fait
1073  
1074       * @Return     Retourne un affichage HTML
1075  
1076       */
1077      exec("/usr/share/se3/sbin/userdesactive.pl '$uid' '$act'", $AllOutPut, $ReturnValue);
1078      if ($ReturnValue == "0") {
1079          if ($act) {
1080              echo "<strong>" . gettext("Le compte a &#233;t&#233; activ&#233; avec succ&#232;s.") . "</strong><br>\n";
1081          } else {
1082              echo "<strong>" . gettext("Le compte a &#233;t&#233; d&#233;sactiv&#233; avec succ&#232;s.") . "</strong><br>\n";
1083          }
1084      } else {
1085          echo "<div class='error_msg'>" . gettext("Echec de la modification") . " <font color='black'>(" . gettext("type d'erreur") . " : $ReturnValue)</font>, " . gettext("veuillez contacter") . " <A HREF='mailto:$MelAdminLCS?subject=" . gettext("PB changement mot de passe") . "'>" . gettext("l'administrateur du syst&#232;me") . "</A></div><BR>\n";
1086      }
1087  }
1088  
1089  function are_you_in_group($login, $group) {
1090  
1091      /**
1092       * Test si $login se trouve dans le groupe $group (de la branche Groups)
1093  
1094       * @Parametres $login - L'uid de l'utilisateur que l'on veut tester
1095       * @Parametres $group - Le groupe dans lequel l'utilisateur doit se trouver
1096  
1097       * @Return     true - Si la personne est dans le groupe  false - Si elle n'est pas dans le groupe
1098       */
1099      $filtre = "(&(memberUid=$login)(cn=$group))";
1100      $grcomm = search_groups($filtre);
1101      if (count($grcomm) > 0) {
1102          return true;
1103      } else {
1104          return false;
1105      }
1106  }
1107  
1108  function search_description_parc($parc) {
1109  
1110  
1111      /**
1112       * Recherche la machine prof d'un parc (champ description)
1113  
1114       * @Parametres $parc - Le nom du parc
1115       * @Return Retourne le nom de la machine prof du parc $parc
1116       */
1117      global $ldap_server, $ldap_port, $dn;
1118      global $error;
1119  
1120      $ldap_computer_attr = array(
1121          "description"
1122      );
1123  
1124      $filter = "(&(cn=$parc)(description=*))";
1125      $ds = @ldap_connect($ldap_server, $ldap_port);
1126      if ($ds) {
1127          $r = @ldap_bind($ds); // Bind anonyme
1128          if ($r) {
1129              $result = ldap_list($ds, $dn["parcs"], $filter, $ldap_computer_attr);
1130              if ($result) {
1131                  $info = @ldap_get_entries($ds, $result);
1132                  if ($info["count"]) {
1133                      return $info[0]["description"][0];
1134                  } else {
1135                      return false;
1136                  }
1137  
1138                  @ldap_free_result($result);
1139              }
1140          }
1141  
1142          @ldap_close($ds);
1143      }
1144  }
1145  
1146  function modif_description_parc($parc, $entree) {
1147  
1148  
1149      /**
1150       * Modifie le champ description de parc
1151  
1152       * @Parametres $parc - Le nom du parc
1153       * @Parametres $entree - La valeur a rentrer, si entree vide on vide le champ
1154       * @Return Retourne 1 ou 0 si pas d'erreur
1155       */
1156      global $ldap_server, $ldap_port, $dn;
1157      global $error;
1158  
1159  
1160      $ds = @ldap_connect($ldap_server, $ldap_port);
1161      if ($ds) {
1162          $adminLdap = get_infos_admin_ldap2();
1163          $r = @ldap_bind($ds, $adminLdap["adminDn"], $adminLdap["adminPw"]); // Bind admin LDAP
1164          // $r = @ldap_bind ( $ds ); // Bind anonyme
1165          if ($r) {
1166              if ($entree == "") {
1167                  $entree = "0";
1168              }
1169              $parc_entree = "cn=$parc," . $dn["parcs"];
1170              $mod_descript = array();
1171              $mod_descript["description"][0] = $entree;
1172              $result = ldap_modify($ds, $parc_entree, $mod_descript);
1173          }
1174  
1175          @ldap_close($ds);
1176      }
1177  }
1178  
1179  /**
1180  
1181   * Retourne des infos sur l'admin ldap, pour une connexion authentifiee
1182   * @Parametres
1183   * @Return un tableau avec les donnees de l'admin ldap
1184  
1185   */
1186  function get_infos_admin_ldap2() {
1187      //global $dn;
1188      global $ldap_base_dn;
1189  
1190      $adminLdap = array();
1191  
1192      // Etablir la connexion au serveur et la selection de la base?
1193      global $dbhost,$dbname,$dbuser,$dbpass;
1194      $authlink = mysql_connect($dbhost,$dbuser,$dbpass);
1195      @mysql_select_db($dbname); 
1196      $sql = "SELECT value FROM params WHERE name='adminRdn'";
1197      $res1 = mysql_query($sql);
1198      if (mysql_num_rows($res1) == 1) {
1199          $lig_tmp = mysql_fetch_object($res1);
1200          $adminLdap["adminDn"] = $lig_tmp->value . "," . $ldap_base_dn;
1201      }
1202  
1203      $sql = "SELECT value FROM params WHERE name='adminPw'";
1204      $res2 = mysql_query($sql);
1205      if (mysql_num_rows($res2) == 1) {
1206          $lig_tmp = mysql_fetch_object($res2);
1207          $adminLdap["adminPw"] = $lig_tmp->value;
1208      }
1209  
1210      return $adminLdap;
1211  }
1212  
1213  
1214  function affiche_all_groups($align,$afftype) {
1215      //// Etablissement des listes des groupes disponibles
1216          $list_groups=search_groups("(&(cn=*) $filter )");
1217          // Etablissement des sous listes de groupes :
1218          $j =0; $k =0;
1219          $m = 0; $l =0; $i=0;
1220          for ($loop=0; $loop < count ($list_groups) ; $loop++) {
1221              // Cours
1222                          if ( preg_match ("/Cours_/", $list_groups[$loop]["cn"]) ) {
1223                                  $cours[$i]["cn"] = $list_groups[$loop]["cn"];
1224                                  $cours[$i]["description"] = $list_groups[$loop]["description"];
1225                                  $i++;}
1226                          //// Classe
1227              if ( preg_match ("/Classe_/", $list_groups[$loop]["cn"]) ) {
1228                  $classe[$j]["cn"] = $list_groups[$loop]["cn"];
1229                  $classe[$j]["description"] = $list_groups[$loop]["description"];
1230                  $j++;}
1231                          // Matiere
1232              elseif ( preg_match ("/Matiere_/", $list_groups[$loop]["cn"]) ) {
1233                  $matiere[$l]["cn"] = $list_groups[$loop]["cn"];
1234                  $matiere[$l]["description"] = $list_groups[$loop]["description"];
1235                  $l++;}
1236              // Equipe
1237              elseif ( preg_match ("/Equipe_/", $list_groups[$loop]["cn"]) ) {
1238                  $equipe[$k]["cn"] = $list_groups[$loop]["cn"];
1239                  $equipe[$k]["description"] = $list_groups[$loop]["description"];
1240                  $k++;}
1241              // Autres
1242              elseif (!preg_match ("/^overfill/", $list_groups[$loop]["cn"]) &&
1243                  !preg_match ("/^lcs-users/", $list_groups[$loop]["cn"]) &&
1244                  !preg_match ("/nogroup/", $list_groups[$loop]["cn"]) &&
1245                  !preg_match ("/Cours_/", $list_groups[$loop]["cn"]) &&
1246                  !preg_match ("/Matiere_/", $list_groups[$loop]["cn"]) &&
1247                  !preg_match ("/root/", $list_groups[$loop]["cn"]) &&
1248                  !preg_match ("/invites/", $list_groups[$loop]["cn"]) &&
1249                  !preg_match ("/^machines/", $list_groups[$loop]["cn"])) {
1250                  $autres[$m]["cn"] = $list_groups[$loop]["cn"];
1251                  $autres[$m]["description"] = $list_groups[$loop]["description"];
1252                  $m++;
1253              }
1254          }
1255  
1256          // Affichage des boites de s&#233;lection des groupes sur lesquels fixer les quotas + choix d'un user sp&#233;cifique
1257          echo "
1258          <table align=\"$align\" border=\"0\" cellspacing=\"10\" style='float: none' >
1259          <tr>
1260          <td>".gettext("Classes")."</td>";
1261                  echo "<td>".gettext("Mati&#232res")."</td>";
1262                  if ($afftype == "cours")  echo "<td>".gettext("Cours")."</td>";
1263                  echo "<td>".gettext("Equipes")."</td>
1264          <td>".gettext("Autres")."</td>";
1265          if ($afftype == "user") echo "<td>".gettext("Utilisateur sp&#233;cifique")."</td>";
1266          echo "</tr>
1267          <tr>
1268          <td valign=\"top\">
1269  
1270          <select name= \"classe_gr[]\" size=\"8\" multiple=\"multiple\">\n";
1271          for ($loop=0; $loop < count ($classe) ; $loop++) {
1272              echo "<option value=".$classe[$loop]["cn"].">".$classe[$loop]["cn"];
1273          }
1274          echo "</select>";
1275          echo "</td>\n";
1276          
1277                  echo "<td valign=\"top\">\n";
1278          echo "<select name= \"matiere_gr[]\" size=\"8\" multiple=\"multiple\">\n";
1279          for ($loop=0; $loop < count ($matiere) ; $loop++) {
1280              echo "<option value=".$matiere[$loop]["cn"].">".$matiere[$loop]["cn"];
1281          }
1282                  echo "</select></td>\n";
1283          //echo "<td valign=\"top\">";
1284                  
1285                  if ($afftype == "cours") {
1286                      echo "<td valign=\"top\">\n";
1287                      echo "<select name= \"cours_gr[]\" value=\"$cours_gr\" size=\"10\" multiple=\"multiple\">";
1288                      for ($loop=0; $loop < count ($cours) ; $loop++) {
1289                      echo "<option value=".$cours[$loop]["cn"].">".$cours[$loop]["cn"];
1290                      }
1291                      echo "</select>";
1292                      echo "</td>";
1293                  }
1294                  
1295                  echo "<td valign=\"top\">\n";
1296          echo "<select name= \"equipe_gr[]\" size=\"8\" multiple=\"multiple\">\n";
1297          for ($loop=0; $loop < count ($equipe) ; $loop++) {
1298              echo "<option value=".$equipe[$loop]["cn"].">".$equipe[$loop]["cn"];
1299          }
1300                  echo "</select></td>\n";
1301          echo "<td valign=\"top\">";
1302                  
1303          echo "<select name=\"autres_gr[]\" size=\"8\" multiple=\"multiple\">";
1304          for ($loop=0; $loop < count ($autres) ; $loop++) {
1305              echo "<option value=".$autres[$loop]["cn"].">".$autres[$loop]["cn"];
1306          }
1307          echo "</select></td>\n";
1308                  if ($afftype == "user")     echo "<td valign=\"top\"><INPUT TYPE=\"TEXT\" NAME=\"user\" size=15></td>\n";
1309          echo "</tr><tr></tr></table>\n\n";
1310  }
1311  
1312  
1313  function search_doublons_mac($generer_csv='n') {
1314  
1315      /**
1316       * Recherche des doublons dans la branche computers: plusieurs noms de machines pour une m�me adresse MAC
1317  
1318       * @Parametres: $generer_csv: Variable � passer � 'y' pour proposer de g�n�rer un CSV (le code correspondant doit exister dans la page cible)
1319  
1320       * @Return     Retourne un formulaire avec tableau des machines en doublons (le code correspondant au traitement du formulaire doit exister dans la page cible)
1321       */
1322      global $ldap_server, $ldap_port, $dn;
1323      global $error;
1324  
1325      $ldap_computer_attr = array("cn", "iphostnumber", "macaddress");
1326      // Connexion au LDAP
1327      $idconnexionldap = @ldap_connect($ldap_server, $ldap_port);
1328  
1329      if ($idconnexionldap) {
1330          //$idliaisonldap=ldap_bind($idconnexionldap,$adminldap,$passadminldap);
1331          //If this is an "anonymous" bind, typically read-only access:
1332          $idliaisonldap = ldap_bind($idconnexionldap);
1333  
1334          echo "<p>";
1335          //echo "Recherche des machines dans la branche ".$dn['computers']."\n";
1336          echo "Recherche des machines dans la branche 'computers': \n";
1337          //echo "<br />\n";
1338  
1339          $rechercheldap = ldap_search($idconnexionldap, $dn['computers'], "(&(macaddress=*)(!(macaddress=--)))");
1340          //echo "Le nombre d'entr&#233;es retourn&#233;es est: ".ldap_count_entries($idconnexionldap,$rechercheldap)."\n";
1341          echo ldap_count_entries($idconnexionldap, $rechercheldap) . " machines trouv&#233;es\n";
1342          echo "</p>\n";
1343          echo "<p>Parcours des entr&#233;es \n";
1344          //echo "<br />\n";
1345          $info = ldap_get_entries($idconnexionldap, $rechercheldap);
1346          //==================================================
1347          /*
1348            echo "<p>";
1349            echo "\tDonn&#233;es pour ".$info["count"]." entr&#233;es:\n";
1350            echo "<br />\n";
1351            for ($i=0; $i<$info["count"]; $i++) {
1352            echo "<p>";
1353            // Il peut y avoir plusieurs attributs de meme nom pour une entr&#233;e (ex.: memberUid)
1354            echo "\t\tLe premier attribut 'cn' de l'entr&#233;e courante est : ". $info[$i]["cn"][0] ."\n";
1355            echo "<br />\n";
1356  
1357            for($k=0;$k<count($ldap_computer_attr);$k++){
1358  
1359            for($j=0;$j<$info[$i][$ldap_computer_attr[$k]]["count"];$j++){
1360            echo "\t\t\t$ldap_computer_attr[$k]: ".$info[$i][$ldap_computer_attr[$k]][$j]."\n";
1361            echo "<br />\n";
1362            }
1363            }
1364            }
1365           */
1366          //==================================================
1367          // Recherche des doublons
1368          $tab_machine = array();
1369          $tab_mac = array();
1370          $tab_doublons_mac = array();
1371          $cpt = 0;
1372          for ($i = 0; $i < $info["count"]; $i++) {
1373              if ((isset($info[$i]["cn"][0])) && (isset($info[$i]["iphostnumber"][0])) && (isset($info[$i]["macaddress"][0]))) {
1374                  //echo $info[$i]["iphostnumber"][0].";".$info[$i]["cn"][0].";".$info[$i]["macaddress"][0]."\n";
1375                  $tab_machine[$cpt] = array();
1376                  $tab_machine[$cpt]['ip'] = $info[$i]["iphostnumber"][0];
1377                  $tab_machine[$cpt]['cn'] = $info[$i]["cn"][0];
1378                  $tab_machine[$cpt]['mac'] = strtolower($info[$i]["macaddress"][0]);
1379  
1380                  if (in_array(strtolower($info[$i]["macaddress"][0]), $tab_mac)) {
1381                      if (!in_array(strtolower($info[$i]["macaddress"][0]), $tab_doublons_mac)) {
1382                          $tab_doublons_mac[] = strtolower($info[$i]["macaddress"][0]);
1383                      }
1384                  } else {
1385                      $tab_mac[] = strtolower($info[$i]["macaddress"][0]);
1386                  }
1387                  $cpt++;
1388              }
1389          }
1390  
1391          // Parcourir $tab_machine et si on tombe sur une valeur dans $tab_doublons_mac, on affiche qu'il y a un pb... proposer de supprimer de l'annuaire des entr&#233;es
1392          // Pour le reste, remplir un autre tableau qui apres validation sert a g&#233;n&#233;rer le CSV.
1393          /*
1394            echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>\n";
1395            for($i=0;$i<count($tab_machine);$i++) {
1396            if(in_array($tab_machine[$i]['macaddress'],$tab_doublons_mac)) {
1397            echo "<input type='checkbox' name='' value='' />\n";
1398            }
1399            }
1400            echo "<input type='submit' name='suppr_doub_ldap' value='Supprimer' />\n";
1401            echo "</form>\n";
1402           */
1403  
1404          // Tableau des doublons pour permettre la suppression
1405          echo "pour rechercher des doublons.";
1406          if (count($tab_doublons_mac) > 0) {
1407              echo "</p>\n";
1408              echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>\n";
1409              echo "<table border='1'>\n";
1410              echo "<tr class=\"menuheader\" height=\"30\">\n";
1411              echo "<th style='text-align:center;'>Nom Netbios</th>\n";
1412              echo "<th style='text-align:center;'>IP</th>\n";
1413              echo "<th style='text-align:center;'>MAC</th>\n";
1414  
1415              echo "<th style='text-align:center;'>Connexion</th>\n";
1416  
1417              echo "<th style='text-align:center;'>Supprimer</th>\n";
1418              echo "</tr>\n";
1419              $alt = 1;
1420              for ($i = 0; $i < count($tab_doublons_mac); $i++) {
1421                  //echo "<tr><td colspan='4'>$tab_doublons_mac[$i]</td></tr>\n";
1422                  $alt = $alt * (-1);
1423  
1424                  for ($j = 0; $j < count($tab_machine); $j++) {
1425                      if ($tab_machine[$j]['mac'] == $tab_doublons_mac[$i]) {
1426                          echo "<tr";
1427                          if ($alt == -1) {
1428                              echo " style='background-color:silver;'";
1429                          }
1430                          echo ">\n";
1431                          echo "<td style='text-align:center;'>" . $tab_machine[$j]['cn'] . "</td>\n";
1432                          echo "<td style='text-align:center;'>" . $tab_machine[$j]['ip'] . "</td>\n";
1433                          echo "<td style='text-align:center;'>" . $tab_machine[$j]['mac'] . "</td>\n";
1434  
1435                          $sql = "SELECT * FROM connexions WHERE netbios_name='" . $tab_machine[$j]['cn'] . "' ORDER BY logintime DESC LIMIT 1;";
1436                          $res_connexion = mysql_query($sql);
1437                          if (mysql_num_rows($res_connexion) == 0) {
1438                              echo "<td style='text-align:center;color:red;'>X</td>\n";
1439                          } else {
1440                              $lig_connexion = mysql_fetch_object($res_connexion);
1441                              echo "<td style='text-align:center;'>" . $lig_connexion->logintime . "</td>\n";
1442                          }
1443  
1444                          echo "<td style='text-align:center;'><input type='checkbox' name='suppr[]' value='" . $tab_machine[$j]['cn'] . "' /></td>\n";
1445                          echo "</tr>\n";
1446                      }
1447                  }
1448              }
1449              echo "<tr><td style='text-align:center;' colspan='5'>";
1450              echo "<input type='submit' name='suppr_doublons_ldap' value=\"Supprimer de l'annuaire LDAP\" />\n";
1451              echo "<br />\n";
1452              echo "<b>ATTENTION:</b> Si la machine est toujours pr&#233;sente, conservez une entr&#233;e pour chaque n-uplet.<br />Ne cochez pas toutes les entr&#233;es sans discernement.\n";
1453              echo "</td></tr>\n";
1454              echo "</table>\n";
1455              echo "</form>\n";
1456  
1457              echo "<p><i>NOTE:</i> Il arrive qu'une m&#234;me machine (<i>m&#234;me adresse MAC</i>) apparaisse avec plusieurs noms dans l'annuaire LDAP.<br />Cela peut se produire lorsque l'on renomme une machine et que l'on ne fait pas le m&#233;nage dans l'annuaire.</p>\n";
1458          } else {
1459              echo ": Aucun doublon trouv&#233;.</p>\n";
1460          }
1461  
1462          if ($generer_csv == 'y') {
1463              if (count($tab_machine) > 0) {
1464                  echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>\n";
1465                  echo "<p>\n";
1466                  for ($j = 0; $j < count($tab_machine); $j++) {
1467                      echo "<input type='hidden' name='cn[$j]' value='" . $tab_machine[$j]['cn'] . "' />\n";
1468                      echo "<input type='hidden' name='ip[$j]' value='" . $tab_machine[$j]['ip'] . "' />\n";
1469                      echo "<input type='hidden' name='mac[$j]' value='" . strtolower($tab_machine[$j]['mac']) . "' />\n";
1470                  }
1471                  echo "<input type='submit' name='genere_csv' value=\"G&#233;n&#233;rer le CSV\" />\n";
1472                  echo "</p>\n";
1473                  echo "</form>\n";
1474              }
1475          }
1476      } else {
1477          echo "<p>ERREUR: La connexion au LDAP a &#233;chou&#233;.<p/>\n";
1478      }
1479  }
1480  ?>


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