[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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 été modifié avec succè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è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 été activé avec succès.") . "</strong><br>\n"; 1081 } else { 1082 echo "<strong>" . gettext("Le compte a été désactivé avec succè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è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élection des groupes sur lesquels fixer les quotas + choix d'un user spé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ères")."</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é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ées retournées est: ".ldap_count_entries($idconnexionldap,$rechercheldap)."\n"; 1341 echo ldap_count_entries($idconnexionldap, $rechercheldap) . " machines trouvées\n"; 1342 echo "</p>\n"; 1343 echo "<p>Parcours des entrées \n"; 1344 //echo "<br />\n"; 1345 $info = ldap_get_entries($idconnexionldap, $rechercheldap); 1346 //================================================== 1347 /* 1348 echo "<p>"; 1349 echo "\tDonnées pour ".$info["count"]." entré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ée (ex.: memberUid) 1354 echo "\t\tLe premier attribut 'cn' de l'entré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ées 1392 // Pour le reste, remplir un autre tableau qui apres validation sert a géné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ésente, conservez une entrée pour chaque n-uplet.<br />Ne cochez pas toutes les entré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ême machine (<i>mê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énage dans l'annuaire.</p>\n"; 1458 } else { 1459 echo ": Aucun doublon trouvé.</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éné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 échoué.<p/>\n"; 1478 } 1479 } 1480 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |