(
\n"); my_echo("
\n"); foreach($tab as $key => $value) { if(is_array($value)) { my_echo("[$key] => "); my_print_r($value); } else { my_echo("[$key] => $value
\n"); } } my_echo("
\n"); my_echo(")
\n"); } //================================================ /** * remplace les accents * @Parametres chaine a traiter * @Return la chaine sans accents */ function remplace_accents($chaine){ global $liste_caracteres_accentues, $liste_caracteres_desaccentues; //$retour=strtr(ereg_replace("¼","OE",ereg_replace("½","oe",$chaine)),"ÀÄÂÉÈÊËÎÏÔÖÙÛÜÇçàäâéèêëîïôöùûü","AAAEEEEIIOOUUUCcaaaeeeeiioouuu"); //$retour=strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$chaine"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz"); $retour=strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$chaine"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues"); return $retour; } //================================================ /** * dédoublonnage des espaces dans une chaine * @Parametres chaine a traiter * @Return la chaine sans doublons d'espaces */ function traite_espaces($chaine) { //$chaine=" Bla ble bli blo blu "; /* $tab=explode(" ",$chaine); $retour=$tab[0]; for($i=1;$ivalue.",".$ldap_base_dn; } $sql="SELECT value FROM params WHERE name='adminPw'"; $res2=mysql_query($sql); if(mysql_num_rows($res2)==1){ $lig_tmp=mysql_fetch_object($res2); $adminLdap["adminPw"]=$lig_tmp->value; } return $adminLdap; } //================================================ /** * test si l'ou trash existe sinon la cree * @Parametres * @Return */ function test_creation_trash(){ global $ldap_server, $ldap_port, $dn, $ldap_base_dn; global $error; $error=""; // Parametres // Aucun // Tableau retourne $tab=array(); fich_debug("======================\n"); fich_debug("test_creation_trash:\n"); $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ $r=@ldap_bind($ds);// Bind anonyme if($r){ $attribut=array("ou","objectClass"); // A REVOIR... LE TEST MERDOUILLE... IL A L'AIR DE RETOURNER vrai meme si ou=Trash n'existe pas $result=ldap_search($ds,$ldap_base_dn,"ou=Trash",$attribut); fich_debug("ldap_search($ds,\"$ldap_base_dn\",\"ou=Trash\",$attribut)\n"); //echo "

ldap_search($ds,$dn[$branche],\"$filtre\",$attribut);

"; if($result){ fich_debug("La branche Trash existe.\n"); @ldap_free_result($result); } else{ fich_debug("La branche Trash n'existe pas.\n"); // On va la creer. unset($attributs); $attributs=array(); $attributs["ou"]="Trash"; $attributs["objectClass"]="organizationalUnit"; //$r=@ldap_bind($ds);// Bind anonyme $adminLdap=get_infos_admin_ldap(); $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP if($r){ $dn_entree="ou=Trash,".$ldap_base_dn; fich_debug("Création de la branche: "); $result=ldap_add($ds,"$dn_entree",$attributs); if(!$result){ $error="Echec d'ajout de l'entree ou=Trash"; fich_debug("ECHEC\n"); fich_debug("\$error=$error\n"); } else{ fich_debug("SUCCES\n"); } @ldap_free_result($result); } else{ $error=gettext("Echec du bind admin LDAP"); fich_debug("\$error=$error\n"); } } } else{ $error=gettext("Echec du bind anonyme"); fich_debug("\$error=$error\n"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); fich_debug("\$error=$error\n"); } if($error!=""){ echo "error=$error
\n"; } } //================================================ /** * Ajoute une entree dans l'annuaire * @Parametres * @Return */ function add_entry ($entree, $branche, $attributs){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Parametres: /* $entree: uid=toto $branche: people, groups,... ou rights $attributs: tableau associatif des attributs */ $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ //$r=@ldap_bind($ds);// Bind anonyme $adminLdap=get_infos_admin_ldap(); $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP if($r){ $dn_entree="$entree,".$dn["$branche"]; $result=ldap_add($ds,"$dn_entree",$attributs); if(!$result){ $error="Echec d'ajout de l'entree $entree"; } @ldap_free_result($result); } else{ $error=gettext("Echec du bind admin LDAP"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); } if($error==""){ return true; } else{ //echo "

$error

"; return false; } } //================================================ /** * Supprime une entree de l'annuaire * @Parametres * @Return */ function del_entry ($entree, $branche){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Parametres: /* $entree: uid=toto $branche: people, groups,... ou rights */ $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ //$r=@ldap_bind($ds);// Bind anonyme $adminLdap=get_infos_admin_ldap(); $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]); // Bind admin LDAP if($r){ $result=ldap_delete($ds,"$entree,".$dn["$branche"]); if(!$result){ $error="Echec de la suppression de l'entree $entree"; } @ldap_free_result($result); } else{ $error=gettext("Echec du bind admin LDAP"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); } if($error==""){ return true; } else{ //echo "

$error

"; return false; } } //================================================ /** * Modifie une entree dans l'annuaire * @Parametres * @Return */ function modify_entry ($entree, $branche, $attributs){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Je ne suis pas sur d'avoir bien saisi le fonctionnement de la fonction ldap_modify() de PHP // Du coup, je lui ai prefere les fonctions ldap_mod_add(), ldap_mod_del() et ldap_mod_replace() utilisees dans ma fonction modify_attribut() // Parametres: /* $entree: uid=toto $branche: people, groups,... ou rights $attributs: tableau associatif des attributs */ $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ //$r=@ldap_bind($ds);// Bind anonyme $adminLdap=get_infos_admin_ldap(); $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP if($r){ $result=ldap_modify($ds,"$entree,".$dn["$branche"],$attributs); if(!$result){ $error="Echec d'ajout de l'entree $entree"; } @ldap_free_result($result); } else{ $error=gettext("Echec du bind en admin"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); } if($error==""){ return true; } else{ return false; } } //================================================ /** * Modifie un attribut dans l'annuaire * @Parametres * @Return */ function modify_attribut ($entree, $branche, $attributs, $mode){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Parametres: /* $entree: uid=toto $branche: people, groups,... ou rights $attribut: tableau associatif des attributs a modifier $mode: add replace ou del // Pour del aussi, il faut fournir la bonne valeur de l'attribut pour que cela fonctionne // On peut ajouter, modifier, supprimer plusieurs attributs a la fois. */ $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ //$r=@ldap_bind($ds);// Bind anonyme $adminLdap=get_infos_admin_ldap(); $r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP if($r){ switch($mode){ case "add": $result=ldap_mod_add($ds,"$entree,".$dn["$branche"],$attributs); break; case "del": $result=ldap_mod_del($ds,"$entree,".$dn["$branche"],$attributs); break; case "replace": $result=ldap_mod_replace($ds,"$entree,".$dn["$branche"],$attributs); break; } if(!$result){ $error="Echec d'ajout de la modification $mode sur $entree"; } @ldap_free_result($result); } else{ $error=gettext("Echec du bind en admin"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); } if($error==""){ return true; } else{ return false; } } /* function crob_init() { // Recuperation de variables dans la base MySQL se3db //global $domainsid,$uidPolicy; global $defaultgid,$domain,$defaultshell,$domainsid; $domainsid=""; $sql="select value from params where name='domainsid';"; $res=mysql_query($sql); if(mysql_num_rows($res)==1){ $lig_tmp=mysql_fetch_object($res); $domainsid=$lig_tmp->value; } else { // Cas d'un LCS ou sambaSID n'est pas dans la table params unset($retval); exec ("ldapsearch -x -LLL objectClass=sambaDomain | grep sambaSID | cut -d ' ' -f 2",$retval); $domainsid = $retval[0]; // Si il n'y a pas de sambaSID dans l'annuaire, on fixe une valeur factice // Il faudra appliquer un correct SID lors de l'installation d'un se3 if (!isset($domainsid)) $domainsid ="S-0-0-00-0000000000-000000000-0000000000"; } $uidPolicy=""; $sql="select value from params where name='uidPolicy';"; $res=mysql_query($sql); if(mysql_num_rows($res)==1){ $lig_tmp=mysql_fetch_object($res); $uidPolicy=$lig_tmp->value; } $defaultgid=""; $sql="select value from params where name='defaultgid';"; $res=mysql_query($sql); if(mysql_num_rows($res)==1){ $lig_tmp=mysql_fetch_object($res); $defaultgid=$lig_tmp->value; } else { // Cas d'un LCS ou defaultgid n'est pas dans la table params exec ("getent group lcs-users | cut -d ':' -f 3", $retval); $defaultgid= $retval[0]; } $domain=""; $sql="select value from params where name='domain';"; $res=mysql_query($sql); if(mysql_num_rows($res)==1){ $lig_tmp=mysql_fetch_object($res); $domain=$lig_tmp->value; } $defaultshell=""; $sql="select value from params where name='defaultshell';"; $res=mysql_query($sql); if(mysql_num_rows($res)==1){ $lig_tmp=mysql_fetch_object($res); $defaultshell=$lig_tmp->value; } } */ //================================================ /** * Active le mode debug * @Parametres * @Return */ function fich_debug($texte){ // Passer la variable ci-dessous a 1 pour activer l'ecriture d'infos de debuggage dans /tmp/debug_se3lcs.txt // Il conviendra aussi d'ajouter des appels fich_debug($texte) la ou vous en avez besoin;o). $debug=0; if($debug==1){ $fich=fopen("/tmp/debug_se3lcs.txt","a+"); fwrite($fich,$texte); fclose($fich); } } //================================================ /** * Cree l'uid a partir du nom prenom et de la politique de login * @Parametres * @Return */ function creer_uid($nom,$prenom){ global $uidPolicy; global $ldap_server, $ldap_port, $dn; global $liste_caracteres_accentues, $liste_caracteres_desaccentues; global $error; $error=""; fich_debug("======================\n"); fich_debug("creer_uid:\n"); fich_debug("\$nom=$nom\n"); fich_debug("\$prenom=$prenom\n"); fich_debug("\$uidPolicy=$uidPolicy\n"); fich_debug("\$ldap_server=$ldap_server\n"); fich_debug("\$ldap_port=$ldap_port\n"); fich_debug("\$error=$error\n"); fich_debug("\$dn=$dn\n"); /* # Il faudrait ameliorer la fonction pour gerer les "Le goff Martin" qui devraient donner "Le_goff-Martin" # Actuellement, on passe tous les espaces a _ */ // Recuperation de l'uidPolicy (et du sid) //crob_init(); Ne sert a rien !!! //echo "

\$uidPolicy=$uidPolicy

"; // Filtrer certains caracteres: //nom=$(echo "$nom" | tr " àâäéèêëîïôöùûü" "-aaaeeeeiioouuu" | sed -e "s/'//g") //$nom=strtolower(strtr("$nom"," 'àâäéèêëîïôöùûüçÇÂÄÊËÎÏÔÖÙÛÜ","__aaaeeeeiioouuucCAAEEIIOOUUU")); //$prenom=strtolower(strtr("$prenom"," 'àâäéèêëîïôöùûüçÇÂÄÊËÎÏÔÖÙÛÜ","__aaaeeeeiioouuucCAAEEIIOOUUU")); //$nom=strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz")); //$prenom=strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","__AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz")); $nom=strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$nom"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues")); $prenom=strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$prenom"))))," '$liste_caracteres_accentues","__$liste_caracteres_desaccentues")); fich_debug("Après filtrage...\n"); fich_debug("\$nom=$nom\n"); fich_debug("\$prenom=$prenom\n"); //ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´ //AAAAAAACEEEEIIIINOOOOOSUUUUYYZ //áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸ //aaaaaaceeeeiiiinoooooosuuuuyyz /* # Valeurs de l'uidPolicy # 0: prenom.nom # 1: prenom.nom tronque a 19 # 2: pnom tronque a 19 # 3: pnom tronque a 8 # 4: nomp tronque a 8 # 5: nomprenom tronque a 18 */ switch($uidPolicy){ case 0: $uid=$prenom.".".$nom; break; case 1: $uid=$prenom.".".$nom; $uid=substr($uid,0,19); break; case 2: $ini_prenom=substr($prenom,0,1); $uid=$ini_prenom.$nom; $uid=substr($uid,0,19); break; case 3: $ini_prenom=substr($prenom,0,1); $uid=$ini_prenom.$nom; $uid=substr($uid,0,8); break; case 4: $debut_nom=substr($nom,0,7); $ini_prenom=substr($prenom,0,1); $uid=$debut_nom.$ini_prenom; break; case 5: $uid=$nom.$prenom; $uid=substr($uid,0,18); break; default: $ERREUR="oui"; } fich_debug("\$uid=$uid\n"); if(isset($ERREUR)) {fich_debug("\$ERREUR=$ERREUR\n");} // Pour faire disparaitre les caracteres speciaux restants: $uid=preg_replace("/[^a-z_.-]/","",$uid); // Pour eviter les _ en fin d'UID... pb avec des connexions machine de M$7 $uid=preg_replace("/_*$/","",$uid); fich_debug("Après filtrage...\n"); fich_debug("\$uid=$uid\n"); $test_caract1=substr($uid,0,1); //if(strlen(preg_replace("/[a-z]/","",$test_caract1))!=0){ if($uid=='') { $error="L'uid obtenu avec le nom '$nom' et le prenom '$prenom' en uidPolicy '$uidPolicy' est vide."; } elseif(strlen(preg_replace("/[a-z]/","",$test_caract1))!=0) { $error="Le premier caractère de l'uid n'est pas une lettre."; } else{ // Debut de l'uid... pour les doublons... $prefuid=substr($uid,0,strlen($uid)-1); $prefuid2=substr($uid,0,strlen($uid)-2); // Ou renseigner un uid_initial ou uid_souche $uid_souche=$uid; //$tab_logins_non_permis=array('prof', 'progs', 'docs', 'classes', 'homes', 'admhomes', 'admse3'); $tab_logins_non_permis=array('prof', 'progs', 'docs', 'classes', 'homes', 'admhomes', 'netlogon','profiles'); if(in_array($uid_souche,$tab_logins_non_permis)) { $cpt=1; $uid_souche=substr($uid,0,strlen($uid)-strlen($cpt)).$cpt; } $ok_uid="non"; $attr=array("uid"); $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ $r=@ldap_bind($ds);// Bind anonyme //$adminLdap=get_infos_admin_ldap(); //$r=@ldap_bind($ds,$adminLdap["adminDn"],$adminLdap["adminPw"]);// Bind admin LDAP if($r){ $cpt=2; //while($ok_uid=="non"){ //while(($ok_uid=="non")&&($cpt<10)){ while(($ok_uid=="non")&&($cpt<100)){ $result=ldap_search($ds,$dn["people"],"uid=$uid*",$attr); if ($result) { $info=@ldap_get_entries($ds,$result); if($info){ $ok_uid="oui"; for($i=0;$i<$info["count"];$i++){ //echo "

"; // En principe, il n'y a qu'un uid par entree... for($loop=0;$loop<$info[$i]["uid"]["count"]; $loop++) { //echo "\$info[$i][\"uid\"][$loop]=".$info[$i]["uid"][$loop]."
\n"; if($info[$i]["uid"][$loop]==$uid){ $ok_uid="non"; //$uid=substr($uid,0,strlen($uid)-1).$cpt; //$uid=substr($uid,0,strlen($uid)-strlen($cpt)).$cpt; //$uid=$prefuid.$cpt; $uid=substr($uid_souche,0,strlen($uid_souche)-strlen($cpt)).$cpt; if($uid=="admse3") {$uid="admse4";$cpt++;} fich_debug("Doublons... \$uid=$uid\n"); $cpt++; } } //echo "

\n"; } } } else{ $error="Echec de la lecture des entrées..."; fich_debug("\$error=$error\n"); } @ldap_free_result($result); } // Vérification que l'uid n'était pas en Trash $result=ldap_search($ds,$dn["trash"],"uid=$uid*",$attr); if ($result) { $info=@ldap_get_entries($ds,$result); if($info){ $ok_uid="oui"; for($i=0;$i<$info["count"];$i++){ //echo "

"; // En principe, il n'y a qu'un uid par entree... for($loop=0;$loop<$info[$i]["uid"]["count"]; $loop++) { //echo "\$info[$i][\"uid\"][$loop]=".$info[$i]["uid"][$loop]."
\n"; if($info[$i]["uid"][$loop]==$uid){ $ok_uid="non"; $error="L'uid $uid existe dans la branche Trash."; } } //echo "

\n"; } } } } else{ $error=gettext("Echec du bind anonyme"); fich_debug("\$error=$error\n"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); fich_debug("\$error=$error\n"); } } if($error!=""){ echo "error=$error
\n"; fich_debug("\$error=$error\n"); return false; } //elseif($cpt>=10){ //$error="Il y a au moins 10 uid en doublon...
On en est à $uid
Etes-vous sûr qu'il n'y a pas des personnes qui ont quitté l'établissement?"; elseif($cpt>=100){ $error="Il y a au moins 100 uid en doublon...
On en est à $uid
Etes-vous sûr qu'il n'y a pas des personnes qui ont quitté l'établissement?"; echo "error=$error
\n"; fich_debug("\$error=$error\n"); return false; } else{ // Retourner $uid return $uid; } } //================================================ /** * Tester si l'employeeNumber est dans l'annuaire ou non... * @Parametres * @Return */ /* function verif_employeeNumber($employeeNumber){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Tester si l'employeeNumber est dans l'annuaire ou non... //$attribut=array("uid","employeenumber"); //$attribut=array("employeenumber"); $attribut=array("uid"); $tab=get_tab_attribut("people","employeenumber=$employeeNumber",$attribut); if(count($tab)>0){return $tab;}else{return false;} } */ function verif_employeeNumber($employeeNumber) { global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Tester si l'employeeNumber est dans l'annuaire ou non... //$attribut=array("uid","employeenumber"); //$attribut=array("employeenumber"); $attribut=array("uid"); $tab=get_tab_attribut("people","employeenumber=$employeeNumber",$attribut); $attribut=array("uid"); $tab2=get_tab_attribut("people","employeenumber=".sprintf("%05d",$employeeNumber),$attribut); $attribut=array("uid"); $tab3=get_tab_attribut("trash","employeenumber=".$employeeNumber,$attribut); $attribut=array("uid"); $tab4=get_tab_attribut("trash","employeenumber=".sprintf("%05d",$employeeNumber),$attribut); $attribut=array("uid"); $tab5=get_tab_attribut("people","employeenumber=".preg_replace("/^0*/", "", $employeeNumber),$attribut); $attribut=array("uid"); $tab6=get_tab_attribut("trash","employeenumber=".preg_replace("/^0*/", "", $employeeNumber),$attribut); /* echo "count($tab)=".count($tab)."
\n"; for($i=0;$i\n"; } */ if(count($tab)>0){$tab[-1]="people";return $tab;} elseif(count($tab2)>0){$tab2[-1]="people";return $tab2;} elseif(count($tab3)>0){$tab3[-1]="trash";return $tab3;} elseif(count($tab4)>0){$tab4[-1]="trash";return $tab4;} elseif(count($tab5)>0){$tab5[-1]="people";return $tab5;} elseif(count($tab6)>0){$tab6[-1]="trash";return $tab6;} else{return false;} } //================================================ /** * Tester si un uid existe ou non dans l'annuaire pour $nom et $prenom sans employeeNumber ... ce qui correspondrait a un compte cree a la main. * @Parametres * @Return */ function verif_nom_prenom_sans_employeeNumber($nom,$prenom){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Tester si un uid existe ou non dans l'annuaire pour $nom et $prenom sans employeeNumber... // ... ce qui correspondrait a un compte cree a la main. $trouve=0; // On fait une recherche avec éventuellement les accents dans les nom/prénom... et on en fait si nécessaire une deuxième sans les accents $attribut=array("uid"); $tab1=array(); //$tab1=get_tab_attribut("people","cn='$prenom $nom'",$attribut); $tab1=get_tab_attribut("people","cn=$prenom $nom",$attribut); /* if(strtolower($nom)=='andro') { $fich=fopen("/tmp/verif_nom_prenom_sans_employeeNumber_debug.txt","a+"); fwrite($fich,"Recherche cn=$prenom $nom on recupere count($tab1)=".count($tab1)."
\n"); fclose($fich); } */ //echo "

error=$error

"; if(count($tab1)>0){ //echo "

count(\$tab1)>0

"; for($i=0;$icount(\$tab2)==0

"; $trouve++; $uid=$tab1[$i]; //echo "

uid=$uid

"; } } // On ne cherche a traiter que le cas d'une seule correspondance. // S'il y en a plus, on ne pourra pas identifier... if($trouve==1){ return $uid; } else{ return false; } } else{ // On fait en sorte de ne pas avoir d'accents dans la branche People de l'annuaire $nom=remplace_accents(traite_espaces($nom)); $prenom=remplace_accents(traite_espaces($prenom)); $attribut=array("uid"); $tab1=array(); //$tab1=get_tab_attribut("people","cn='$prenom $nom'",$attribut); $tab1=get_tab_attribut("people","cn=$prenom $nom",$attribut); /* if(strtolower($nom)=='andro') { $fich=fopen("/tmp/verif_nom_prenom_sans_employeeNumber_debug.txt","a+"); fwrite($fich,"Recherche cn=$prenom $nom on recupere count($tab1)=".count($tab1)."
\n"); fclose($fich); } */ //echo "

error=$error

"; if(count($tab1)>0){ //echo "

count(\$tab1)>0

"; for($i=0;$icount(\$tab2)==0

"; $trouve++; $uid=$tab1[$i]; //echo "

uid=$uid

"; } } // On ne cherche a traiter que le cas d'une seule correspondance. // S'il y en a plus, on ne pourra pas identifier... if($trouve==1){ return $uid; } else{ return false; } } else{ return false; } } } //================================================ /** * Obtient un tableau avecc les attributs * @Parametres $attribut doit etre un tableau d'une seule valeur Ex.: $attribut[0]="uidNumber"; * @Return un tableau avec les attributs */ function get_tab_attribut($branche, $filtre, $attribut){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // Parametres // $attribut doit etre un tableau d'une seule valeur. // Ex.: $attribut[0]="uidNumber"; // Tableau retourne $tab=array(); fich_debug("======================\n"); fich_debug("get_tab_attribut:\n"); $ds=@ldap_connect($ldap_server,$ldap_port); if($ds){ $r=@ldap_bind($ds);// Bind anonyme if($r){ $result=ldap_search($ds,$dn[$branche],"$filtre",$attribut); fich_debug("ldap_search($ds,".$dn[$branche].",\"$filtre\",$attribut)\n"); //echo "

ldap_search($ds,$dn[$branche],\"$filtre\",$attribut);

"; if ($result){ //echo "\$result=$result
"; $info=@ldap_get_entries($ds,$result); if($info){ fich_debug("\$info[\"count\"]=".$info["count"]."\n"); //echo "
".$info["count"]."
"; for($i=0;$i<$info["count"];$i++){ fich_debug("\$info[$i][$attribut[0]][\"count\"]=".$info[$i][$attribut[0]]["count"]."\n"); for($loop=0;$loop<$info[$i][$attribut[0]]["count"]; $loop++) { $tab[]=$info[$i][$attribut[0]][$loop]; fich_debug("\$tab[]=".$info[$i][$attribut[0]][$loop]."\n"); } } rsort($tab); } else{ fich_debug("\$info vide... @ldap_get_entries($ds,$result) n'a rien donné.\n"); } } else{ $error="Echec de la lecture des entrées: ldap_search($ds,".$dn[$branche].",\"$filtre\",$attribut)"; fich_debug("\$error=$error\n"); } @ldap_free_result($result); } else{ $error=gettext("Echec du bind anonyme"); fich_debug("\$error=$error\n"); } @ldap_close($ds); } else{ $error=gettext("Erreur de connection au serveur LDAP"); fich_debug("\$error=$error\n"); } if($error!=""){ echo "error=$error
\n"; } return $tab; } //================================================ /** * Recherche le premier uidNumber disponible On demarre les uid a 1001, mais admin est en 5000: * @Parametres * @Return */ function get_first_free_uidNumber(){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; // On demarre les uid a 1001, mais admin est en 5000: // unattend est en 1000 chez moi... mais cela peut changer avec des etablissements dont l'annuaire SE3 date d'avant l'ajout d'unattend // on peut aussi avoir un compte de client linux qui n'est pas dans l'annuaire mais a besoin de l'uidNumber 1000... risque de conflit si c'est occupé $first_uidNumber=1001; $last_uidNumber=4999; //$last_uidNumber=1200; unset($attribut); $attribut=array(); $attribut[0]="uidnumber"; //$tab=array(); //$tab=get_tab_attribut("people", "uid=*", $attribut); $tab1=array(); $tab1=get_tab_attribut("people", "uid=*", $attribut); $tab2=array(); $tab2=get_tab_attribut("trash", "uid=*", $attribut); $tab=array_merge($tab1,$tab2); rsort($tab); /* // Debug: echo "count(\$tab)=".count($tab)."
"; for($i=0;$i"; } */ /* // Methode OK, mais on risque la penurie des uidNumber entre 1000 et 5000 // a ne pas recuperer des uidNumber d'utilisateurs qui ont quitte l'etablissement //$last_uidNumber=1473; $uidNumber=$last_uidNumber; while((!in_array($uidNumber,$tab))&&($uidNumber>$first_uidNumber)){ $uidNumber--; //echo "\$uidNumber=$uidNumber
"; } $uidNumber++; if(($uidNumber>$last_uidNumber)||(in_array($uidNumber,$tab))){ $error="Il n'y a plus de plus grand uidNumber libre en dessous de $last_uidNumber"; echo "error=$error
"; return false; } else{ echo "

\$uidNumber=$uidNumber

"; return $uidNumber; } */ //TEST: $last_uidNumber=1200; // Ou: on recherche le plus petit uidNumber dispo entre $first_uidNumber et $last_uidNumber $uidNumber=$first_uidNumber; while((in_array($uidNumber,$tab))&&($uidNumber<$last_uidNumber)){ $uidNumber++; } //echo "

\$uidNumber=$uidNumber

"; if(($uidNumber==$last_uidNumber)&&(in_array($uidNumber,$tab))){ $error="Il n'y a plus d'uidNumber libre"; //echo "error=$error
"; return false; } else{ return $uidNumber; } /* // Ou: On mixe les deux methodes: // C'EST UNE FAUSSE SOLUTION: // Quand tout va etre rempli la premiere fois, on va commencer a recuperer des uidNumber par le haut des qu'un uidNumber va se liberer et on va re-affecter des uidNumber utilises recemment. $uidNumber=$last_uidNumber; while((!in_array($uidNumber,$tab))&&($uidNumber>$first_uidNumber)){ $uidNumber--; //echo "\$uidNumber=$uidNumber
"; } $uidNumber++; if(($uidNumber>$last_uidNumber)||(in_array($uidNumber,$tab))){ // On commence a reaffecter des uidNumber libres par le bas $uidNumber=$first_uidNumber; while((in_array($uidNumber,$tab))&&($uidNumber<$last_uidNumber)){ $uidNumber++; } if(($uidNumber==$last_uidNumber)&&(in_array($uidNumber,$tab))){ $error="Il n'y a plus d'uidNumber libre"; //echo "error=$error
"; return false; } else{ return $uidNumber; } } else{ //echo "

\$uidNumber=$uidNumber

"; return $uidNumber; } */ } //================================================ /** * Recherche le premier gidNumber disponible * @Parametres * @Return */ function get_first_free_gidNumber($start=NULL){ global $ldap_server, $ldap_port, $dn; global $error; $error=""; /* # Quelques groupes: # 5000:admins # 5001:Eleves # 5002:Profs # 5003:Administratifs # 1560:overfill # 1000:lcs-users # 998:machines */ $first_gidNumber=2000; $last_gidNumber=4999; //$last_gidNumber=2010; if((isset($start))&&(strlen(preg_replace("/[0-9]/","",$start))==0)&&($start>=$first_gidNumber)) { $first_gidNumber=$start; $last_gidNumber=64000; } unset($attribut); $attribut=array(); $attribut[0]="gidnumber"; $tab1=array(); $tab1=get_tab_attribut("people", "uid=*", $attribut); $tab=array(); for($i=0;$i"; $tab[]=$tab1[$i]; } //echo "
"; $tab2=array(); $tab2=get_tab_attribut("groups", "cn=*", $attribut); for($i=0;$i"; if(!in_array($tab2[$i],$tab)){ $tab[]=$tab2[$i]; } } rsort($tab); /* // Debug: echo "count(\$tab)=".count($tab)."
"; for($i=0;$i"; } */ // On recherche le plus petit gidNumber dispo entre $first_gidNumber et $last_gidNumber $gidNumber=$first_gidNumber; while((in_array($gidNumber,$tab))&&($gidNumber<$last_gidNumber)){ $gidNumber++; } //echo "

\$gidNumber=$gidNumber

"; if(($gidNumber==$last_gidNumber)&&(in_array($gidNumber,$tab))){ $error="Il n'y a plus de gidNumber libre"; //echo "error=$error
"; return false; } else{ return $gidNumber; } // Pour controler: // ldapsearch -xLLL gidNumber | grep gidNumber | sed -e "s/^gidNumber: //" | sort -n -r | uniq | head // ldapsearch -xLLL gidNumber | grep gidNumber | sed -e "s/^gidNumber: //" | sort -n -r | uniq | tail } /* function add_user($uid,$nom,$prenom,$sexe,$naissance,$password,$employeeNumber){ // Recuperer le gidNumber par defaut -> lcs-users (1000) ou slis (600) global $defaultgid,$domain,$defaultshell,$domainsid,$uidPolicy; fich_debug("================\n"); fich_debug("add_user:\n"); fich_debug("\$defaultgid=$defaultgid\n"); fich_debug("\$domain=$domain\n"); fich_debug("\$defaultshell=$defaultshell\n"); fich_debug("\$domainsid=$domainsid\n"); fich_debug("\$uidPolicy=$uidPolicy\n"); global $pathscripts; fich_debug("\$pathscripts=$pathscripts\n"); // crob_init(); Ne sert a rien !!!! $nom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz"))); $prenom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz"))); $nom=ucfirst(strtolower($nom)); $prenom=ucfirst(strtolower($prenom)); fich_debug("\$nom=$nom\n"); fich_debug("\$prenom=$prenom\n"); // Recuperer un uidNumber: //$uidNumber=get_first_free_uidNumber(); if(!get_first_free_uidNumber()){return false;exit();} $uidNumber=get_first_free_uidNumber(); $rid=2*$uidNumber+1000; $pgrid=2*$defaultgid+1001; fich_debug("\$uidNumber=$uidNumber\n"); // Faut-il interdire les espaces dans le password? les apostrophes? // Comment le script ntlmpass.pl prend-il le parametre sans les apostrophes? $ntlmpass=explode(" ",exec("$pathscripts/ntlmpass.pl '$password'")); $sambaLMPassword=$ntlmpass[0]; $sambaNTPassword=$ntlmpass[1]; $userPassword=exec("$pathscripts/unixPassword.pl '$password'"); $attribut=array(); $attribut["uid"]="$uid"; $attribut["cn"]="$prenom $nom"; $attribut["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1)); $attribut["sn"]="$nom"; $attribut["mail"]="$uid@$domain"; $attribut["objectClass"]="top"; // Comme la cle est toujours objectClass, cela pose un probleme: un seul attribut objectClass est ajoute (le dernier defini) //$attribut["objectClass"]="posixAccount"; //$attribut["objectClass"]="shadowAccount"; //$attribut["objectClass"]="person"; //$attribut["objectClass"]="inetOrgPerson"; //$attribut["objectClass"]="sambaSamAccount"; $attribut["loginShell"]="$defaultshell"; $attribut["uidNumber"]="$uidNumber"; $attribut["gidNumber"]="$defaultgid"; $attribut["homeDirectory"]="/home/$uid"; $attribut["gecos"]="$prenom $nom,$naissance,$sexe,N"; $attribut["sambaSID"]="$domainsid-$rid"; $attribut["sambaPrimaryGroupSID"]="$domainsid-$pgrid"; $attribut["sambaPwdLastSet"]="1"; $attribut["sambaPwdMustChange"]="2147483647"; $attribut["sambaAcctFlags"]="[U ]"; $attribut["sambaLMPassword"]="$sambaLMPassword"; $attribut["sambaNTPassword"]="$sambaNTPassword"; $attribut["userPassword"]="{crypt}$userPassword"; // IL faut aussi l'employeeNumber if("$employeeNumber"!=""){ $attribut["employeeNumber"]="$employeeNumber"; } $result=add_entry("uid=$uid","people",$attribut); if($result){ // Reste a ajouter les autres attributs objectClass unset($attribut); $attribut=array(); $attribut["objectClass"]="posixAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="shadowAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="person"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="inetOrgPerson"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="sambaSamAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")) return true; else return false; } else return false; } else return false; } else return false; } else return false; } else return false; } */ //================================================ /** * Ajoute un utilisateur dans l'annuaire LDAP * @Parametres * @Return */ function add_user($uid,$nom,$prenom,$sexe,$naissance,$password,$employeeNumber){ // Recuperer le gidNumber par defaut -> lcs-users (1000) ou slis (600) global $defaultgid,$domain,$defaultshell,$domainsid,$uidPolicy; global $attribut_pseudo; global $liste_caracteres_accentues, $liste_caracteres_desaccentues; fich_debug("================\n"); fich_debug("add_user:\n"); fich_debug("\$defaultgid=$defaultgid\n"); fich_debug("\$domain=$domain\n"); fich_debug("\$defaultshell=$defaultshell\n"); fich_debug("\$domainsid=$domainsid\n"); fich_debug("\$uidPolicy=$uidPolicy\n"); global $pathscripts; fich_debug("\$pathscripts=$pathscripts\n"); // crob_init(); Ne sert a rien !!!! //$nom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz"))); //$prenom=ereg_replace("[^a-z_-]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom"))))," 'ÂÄÀÁÃÄÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕ¦ÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõ¨ûüùúýÿ¸","__AAAAAAACEEEEIIIINOOOOOSUUUUYYZaaaaaaceeeeiiiinoooooosuuuuyyz"))); //$nom=ereg_replace("[^a-z_ -]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$nom")))),"'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","_AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz"))); //$prenom=ereg_replace("[^a-z_ -]","",strtolower(strtr(ereg_replace("Æ","AE",ereg_replace("æ","ae",ereg_replace("¼","OE",ereg_replace("½","oe","$prenom")))),"'ÂÄÀÁÃÅÇÊËÈÉÎÏÌÍÑÔÖÒÓÕئÛÜÙÚݾ´áàâäãåçéèêëîïìíñôöðòóõø¨ûüùúýÿ¸","_AAAAAACEEEEIIIINOOOOOOSUUUUYYZaaaaaaceeeeiiiinooooooosuuuuyyz"))); $nom=preg_replace("/[^a-z_ -]/","",strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$nom")))),"'$liste_caracteres_accentues","_$liste_caracteres_desaccentues"))); $prenom=preg_replace("/[^a-z_ -]/","",strtolower(strtr(preg_replace("/Æ/","AE",preg_replace("/æ/","ae",preg_replace("/¼/","OE",preg_replace("/½/","oe","$prenom")))),"'$liste_caracteres_accentues","_$liste_caracteres_desaccentues"))); $nom=ucfirst(strtolower($nom)); $prenom=ucfirst(strtolower($prenom)); fich_debug("\$nom=$nom\n"); fich_debug("\$prenom=$prenom\n"); // Recuperer un uidNumber: //$uidNumber=get_first_free_uidNumber(); if(!get_first_free_uidNumber()){return false;exit();} $uidNumber=get_first_free_uidNumber(); $rid=2*$uidNumber+1000; // On n'utilise plus ce $pgrid: on passe à 513 $pgrid=2*$defaultgid+1001; fich_debug("\$uidNumber=$uidNumber\n"); // Faut-il interdire les espaces dans le password? les apostrophes? // Comment le script ntlmpass.pl prend-il le parametre sans les apostrophes? //$ntlmpass=explode(" ",exec("$pathscripts/ntlmpass.pl '$password'")); echo "Preparation du mot de passe pour $nom $prenom\n"; $ntlmpass=explode(" ",exec("export LC_ALL=\"fr_FR.UTF-8\";$pathscripts/ntlmpass.pl '$password'")); $sambaLMPassword=$ntlmpass[0]; $sambaNTPassword=$ntlmpass[1]; //$userPassword=exec("$pathscripts/unixPassword.pl '$password'"); $userPassword=exec("export LC_ALL=\"fr_FR.UTF-8\";$pathscripts/unixPassword.pl '$password'"); $attribut=array(); $attribut["uid"]="$uid"; $attribut["cn"]="$prenom $nom"; //$attribut["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1)); $attribut["givenName"]=ucfirst(strtolower($prenom)); //$attribut["$attribut_pseudo"]=strtolower($prenom).strtoupper(substr($nom,0,1)); $attribut["$attribut_pseudo"]=preg_replace("/ /","_",strtolower($prenom).strtoupper(substr($nom,0,1))); $attribut["sn"]="$nom"; $attribut["mail"]="$uid@$domain"; //$attribut["objectClass"]="top"; /* // Comme la cle est toujours objectClass, cela pose un probleme: un seul attribut objectClass est ajoute (le dernier defini) $attribut["objectClass"]="posixAccount"; $attribut["objectClass"]="shadowAccount"; $attribut["objectClass"]="person"; $attribut["objectClass"]="inetOrgPerson"; $attribut["objectClass"]="sambaSamAccount"; */ $attribut["objectClass"][0]="top"; $attribut["objectClass"][1]="posixAccount"; $attribut["objectClass"][2]="shadowAccount"; $attribut["objectClass"][3]="person"; $attribut["objectClass"][4]="inetOrgPerson"; $attribut["objectClass"][5]="sambaSamAccount"; $attribut["loginShell"]="$defaultshell"; $attribut["uidNumber"]="$uidNumber"; $attribut["gidNumber"]="$defaultgid"; $attribut["homeDirectory"]="/home/$uid"; $attribut["gecos"]="$prenom $nom,$naissance,$sexe,N"; $attribut["sambaSID"]="$domainsid-$rid"; //$attribut["sambaPrimaryGroupSID"]="$domainsid-$pgrid"; $attribut["sambaPrimaryGroupSID"]="$domainsid-513"; $attribut["sambaPwdMustChange"]="2147483647"; $attribut["sambaPwdLastSet"]="1"; $attribut["sambaAcctFlags"]="[U ]"; $attribut["sambaLMPassword"]="$sambaLMPassword"; $attribut["sambaNTPassword"]="$sambaNTPassword"; $attribut["userPassword"]="$userPassword"; $attribut["shadowLastChange"]=time(); // IL faut aussi l'employeeNumber if("$employeeNumber"!=""){ $attribut["employeeNumber"]="$employeeNumber"; } $result=add_entry("uid=$uid","people",$attribut); if($result){ /* // Reste a ajouter les autres attributs objectClass unset($attribut); $attribut=array(); $attribut["objectClass"]="posixAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="shadowAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="person"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="inetOrgPerson"; if(modify_attribut("uid=$uid","people", $attribut, "add")){ unset($attribut); $attribut=array(); $attribut["objectClass"]="sambaSamAccount"; if(modify_attribut("uid=$uid","people", $attribut, "add")) return true; else return false; } else return false; } else return false; } else return false; } else return false; */ return true; } else return false; } //================================================ /** * Verifie et corrige le Gecos * @Parametres * @Return */ function verif_et_corrige_gecos($uid,$nom,$prenom,$naissance,$sexe){ // Verification/correction du GECOS global $simulation; global $infos_corrections_gecos; // Correction du nom/prenom fournis $nom=remplace_accents(traite_espaces($nom)); $prenom=remplace_accents(traite_espaces($prenom)); $nom=preg_replace("/[^a-z_-]/","",strtolower("$nom")); $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom")); $nom=ucfirst(strtolower($nom)); $prenom=ucfirst(strtolower($prenom)); unset($attribut); $attribut=array("gecos"); $tab=get_tab_attribut("people", "uid=$uid", $attribut); if(count($tab)>0){ if("$tab[0]"!="$prenom $nom,$naissance,$sexe,N"){ unset($attributs); $attributs=array(); $attributs["gecos"]="$prenom $nom,$naissance,$sexe,N"; $attributs["cn"]="$prenom $nom"; $attributs["givenName"]=strtolower($prenom).strtoupper(substr($nom,0,1)); $attributs["sn"]="$nom"; my_echo("Correction de l'attribut 'gecos': "); //if($infos_corrections_gecos!="") {$infos_corrections_gecos.="
";} $infos_corrections_gecos.="Correction du nom, prénom, date de naissance ou sexe de $uid
\n"; if($simulation!='y') { if(modify_attribut ("uid=$uid", "people", $attributs, "replace")){ my_echo("SUCCES"); } else{ my_echo("ECHEC"); $nb_echecs++; } } else { my_echo("SIMULATION"); } my_echo("
\n"); } } } /** * Verifie et corrige le givenName * @Parametres * @Return */ function verif_et_corrige_givenname($uid,$prenom) { // Verification/correction du givenName global $simulation; // Correction du nom/prenom fournis $prenom=remplace_accents(traite_espaces($prenom)); $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom")); // FAUT-IL LA MAJUSCULE? $prenom=ucfirst(strtolower($prenom)); unset($attribut); //$attribut=array("givenName"); $attribut=array("givenname"); $tab=get_tab_attribut("people", "uid=$uid", $attribut); //my_echo("\$tab=get_tab_attribut(\"people\", \"uid=$uid\", \$attribut)
"); //my_echo("count(\$tab)=".count($tab)."
"); if(count($tab)>0){ //my_echo("\$tab[0]=".$tab[0]." et \$prenom=$prenom
"); if("$tab[0]"!="$prenom") { unset($attributs); $attributs=array(); //$attributs["givenName"]=strtolower($prenom); $attributs["givenName"]=$prenom; my_echo("Correction de l'attribut 'givenName': "); if($simulation!='y') { if(modify_attribut ("uid=$uid", "people", $attributs, "replace")) { my_echo("SUCCES"); } else{ my_echo("ECHEC"); $nb_echecs++; } } else { my_echo("SIMULATION"); } my_echo("
\n"); } } } /** * Verifie et corrige le pseudo * @Parametres * @Return */ function verif_et_corrige_pseudo($uid,$nom,$prenom) { // Verification/correction de l'attribut choisi pour le pseudo global $attribut_pseudo; global $annuelle; global $simulation; // En minuscules pour la recherche: $attribut_pseudo_min=strtolower($attribut_pseudo); // Correction du nom/prenom fournis $nom=remplace_accents(traite_espaces($nom)); $prenom=remplace_accents(traite_espaces($prenom)); $nom=preg_replace("/[^a-z_-]/","",strtolower("$nom")); $prenom=preg_replace("/[^a-z_-]/","",strtolower("$prenom")); unset($attribut); $attribut=array("$attribut_pseudo_min"); $tab=get_tab_attribut("people", "uid=$uid", $attribut); //my_echo("\$tab=get_tab_attribut(\"people\", \"uid=$uid\", \$attribut)
"); //my_echo("count(\$tab)=".count($tab)."
"); $tmp_pseudo=strtolower($prenom).strtoupper(substr($nom,0,1)); if(count($tab)>0){ // Si le pseudo existe déjà, on ne réinitialise le pseudo que lors d'un import annuel if($annuelle=="y") { //my_echo("\$tab[0]=".$tab[0]." et \$prenom=$prenom
"); //$tmp_pseudo=strtolower($prenom).strtoupper(substr($nom,0,1)); if("$tab[0]"!="$tmp_pseudo") { unset($attributs); $attributs=array(); $attributs["$attribut_pseudo"]=$tmp_pseudo; my_echo("Correction de l'attribut '$attribut_pseudo': "); if($simulation!='y') { if(modify_attribut ("uid=$uid", "people", $attributs, "replace")) { my_echo("SUCCES"); } else{ my_echo("ECHEC"); $nb_echecs++; } } else { my_echo("SIMULATION"); } my_echo("
\n"); } } } else { // L'attribut pseudo n'existait pas: unset($attributs); $attributs=array(); //$attributs["$tmp_pseudo"]=strtolower($prenom).strtoupper(substr($nom,0,1)); $attributs["$attribut_pseudo"]=$tmp_pseudo; my_echo("Renseignement de l'attribut '$attribut_pseudo': "); if($simulation!='y') { if(modify_attribut("uid=$uid", "people", $attributs, "add")) { my_echo("SUCCES"); } else{ my_echo("ECHEC"); $nb_echecs++; } } else { my_echo("SIMULATION"); } my_echo("
\n"); } } function get_uid_from_f_uid_file($employeeNumber) { global $dossier_tmp_import_comptes; if(!file_exists("$dossier_tmp_import_comptes/f_uid.txt")) { return false; } else { $ftmp=fopen("$dossier_tmp_import_comptes/f_uid.txt","r"); while(!feof($ftmp)) { $ligne=trim(fgets($ftmp,4096)); if($tab=explode(";",$ligne)) { if("$tab[0]"=="$employeeNumber") { // On controle le login if(strlen(preg_replace("/[A-Za-z0-9._\-]/","",$tab[1]))==0) { return $tab[1]; } else { return false; } break; } } } } } /** * Recherche les compte dans la branche Trash * @Parametres $filter filtre ldap de recherche * @return */ // Fonction extraite de /annu/ldap_cleaner.php function search_people_trash ($filter) { //global $ldap_server, $ldap_port, $dn, $adminDn, $adminPw; global $ldap_server, $ldap_port, $dn; global $error; $error=""; global $sambadomain; $adminLdap=get_infos_admin_ldap(); $adminDn=$adminLdap["adminDn"]; $adminPw=$adminLdap["adminPw"]; //LDAP attributes $ldap_search_people_attr = array( "sambaacctFlags", "sambapwdMustChange", "sambantPassword", "sambalmPassword", "sambaSID", "sambaPrimaryGroupSID", "userPassword", "gecos", "employeenumber", "homedirectory", "gidNumber", "uidNumber", "loginShell", "objectClass", "mail", "sn", "givenName", "cn", "uid" ); $ds = @ldap_connect ( $ldap_server, $ldap_port ); if ( $ds ) { $r = @ldap_bind ( $ds,$adminDn, $adminPw ); if ($r) { // Recherche dans la branche trash $result = @ldap_search ( $ds, $dn["trash"], $filter, $ldap_search_people_attr ); if ($result) { $info = @ldap_get_entries ( $ds, $result ); if ( $info["count"]) { for ($loop=0; $loop<$info["count"];$loop++) { if ( isset($info[$loop]["employeenumber"][0]) ) { $ret[$loop] = array ( "sambaacctflags" => $info[$loop]["sambaacctflags"][0], "sambapwdmustchange" => $info[$loop]["sambapwdmustchange"][0], "sambantpassword" => $info[$loop]["sambantpassword"][0], "sambalmpassword" => $info[$loop]["sambalmpassword"][0], "sambasid" => $info[$loop]["sambasid"][0], "sambaprimarygroupsid" => $info[$loop]["sambaprimarygroupsid"][0], "userpassword" => $info[$loop]["userpassword"][0], "gecos" => $info[$loop]["gecos"][0], "employeenumber" => $info[$loop]["employeenumber"][0], "homedirectory" => $info[$loop]["homedirectory"][0], "gidnumber" => $info[$loop]["gidnumber"][0], "uidnumber" => $info[$loop]["uidnumber"][0], "loginshell" => $info[$loop]["loginshell"][0], "mail" => $info[$loop]["mail"][0], "sn" => $info[$loop]["sn"][0], "givenname" => $info[$loop]["givenname"][0], "cn" => $info[$loop]["cn"][0], "uid" => $info[$loop]["uid"][0], ); } else { $ret[$loop] = array ( "sambaacctflags" => $info[$loop]["sambaacctflags"][0], "sambapwdmustchange" => $info[$loop]["sambapwdmustchange"][0], "sambantpassword" => $info[$loop]["sambantpassword"][0], "sambalmpassword" => $info[$loop]["sambalmpassword"][0], "sambasid" => $info[$loop]["sambasid"][0], "sambaprimarygroupsid" => $info[$loop]["sambaprimarygroupsid"][0], "userpassword" => $info[$loop]["userpassword"][0], "gecos" => $info[$loop]["gecos"][0], "homedirectory" => $info[$loop]["homedirectory"][0], "gidnumber" => $info[$loop]["gidnumber"][0], "uidnumber" => $info[$loop]["uidnumber"][0], "loginshell" => $info[$loop]["loginshell"][0], "mail" => $info[$loop]["mail"][0], "sn" => $info[$loop]["sn"][0], "givenname" => $info[$loop]["givenname"][0], "cn" => $info[$loop]["cn"][0], "uid" => $info[$loop]["uid"][0], ); } } } @ldap_free_result ( $result ); } else $error = "Erreur de lecture dans l'annuaire LDAP"; } else $error = "Echec du bind en admin"; @ldap_close ( $ds ); } else $error = "Erreur de connection au serveur LDAP"; // Tri du tableau par ordre alphabetique if (count($ret)) usort($ret, "cmp_name"); return $ret; } // Fin function search_people_trash // Les temps sont durs, il faut faire les poubelles pour en recuperer des choses... function recup_from_trash($uid) { global $ldap_server, $ldap_port, $dn, $ldap_base_dn; $recup=false; $adminLdap=get_infos_admin_ldap(); $adminDn=$adminLdap["adminDn"]; $adminPw=$adminLdap["adminPw"]; $user = search_people_trash ("uid=$uid"); // Positionnement des constantes "objectclass" $user[0]["sambaacctflags"]="[U ]"; $user[0]["objectclass"][0]="top"; $user[0]["objectclass"][1]="posixAccount"; $user[0]["objectclass"][2]="shadowAccount"; $user[0]["objectclass"][3]="person"; $user[0]["objectclass"][4]="inetOrgPerson"; $user[0]["objectclass"][5]="sambaAccount"; $user[0]["objectclass"][5]="sambaSamAccount"; $f=fopen("/tmp/recup_from_trash.txt","a+"); foreach($user[0] as $key => $value) { fwrite($f,"\$user[0]['$key']=$value\n"); } fwrite($f,"=======================\n"); fclose($f); $ds = @ldap_connect ( $ldap_server, $ldap_port ); if ( $ds ) { $f=fopen("/tmp/recup_from_trash.txt","a+"); fwrite($f,"\$ds OK\n"); fwrite($f,"=======================\n"); fclose($f); $r = @ldap_bind ( $ds, $adminDn, $adminPw ); // Bind en admin if ($r) { $f=fopen("/tmp/recup_from_trash.txt","a+"); fwrite($f,"\$r OK\n"); fwrite($f,"=======================\n"); fclose($f); // Ajout dans la branche people if ( @ldap_add ($ds, "uid=".$user[0]["uid"].",".$dn["people"],$user[0] ) ) { $f=fopen("/tmp/recup_from_trash.txt","a+"); fwrite($f,"\ldap_add OK\n"); fwrite($f,"=======================\n"); fclose($f); // Suppression de la branche Trash @ldap_delete ($ds, "uid=".$user[0]["uid"].",".$dn["trash"] ); $recup=true; } else { $recup=false; } } } ldap_close($ds); return $recup; } //==================================================== function crob_getParam($name) { $sql="SELECT value FROM params WHERE name='".mysql_real_escape_string($name)."';"; $res=mysql_query($sql); if(mysql_num_rows($res)>0) { $lig=mysql_fetch_object($res); return $lig->value; } else { return ""; } } //==================================================== function crob_setParam($name,$value,$descr) { $sql="DELETE FROM params WHERE name='".mysql_real_escape_string($name)."';"; $del=mysql_query($sql); $sql="INSERT INTO params SET name='$name', descr='$descr', cat='0', value='".mysql_real_escape_string($value)."';"; $insert=mysql_query($sql); if($insert) {return true;} else {return false;} } //==================================================== function formate_date_aaaammjj($date) { $tab_date=explode("/",$date); $retour=""; if(isset($tab_date[2])) { $retour.=sprintf("%04d",$tab_date[2]).sprintf("%02d",$tab_date[1]).sprintf("%02d",$tab_date[0]); } else { $retour.=$date; } return $retour; } ?>