[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #!/usr/bin/perl 2 # 3 # $Id: Se.pm 8300 2014-12-06 15:20:12Z dbo $ # 4 # 5 6 use CGI qw(:standard :html3); 7 use Encode::compat; 8 use Encode qw(encode decode); 9 use Text::Unaccent; 10 use Net::LDAP; 11 use Net::Domain; 12 use CGI::Cookie; 13 use DBI; 14 15 #$domain = Net::Domain::hostdomain(); 16 #$hostname = Net::Domain::hostfqdn(); 17 18 require '/etc/SeConfig.ph'; 19 20 # Pour stoker les UID transmis par le fichier f_uid.txt 21 %Admin_UID = (); 22 23 # Définition des formats DBF 24 # -------------------------- 25 %format = ( 26 'f_ele' => 'A5A25A25xA8A1x163A5', 27 'f_men' => 'x6A5x3A8x16A10', 28 'f_div' => 'xA5A20x7A10', 29 'f_gro' => 'xA8A20', 30 'f_eag' => 'A5A8', 31 'f_tmt' => 'x6A5x20A40', 32 'f_wind' => 'xA10x16A20A15x20A8x2A1', 33 'a_ind' => 'xA10x16A20A15x20A8x2A1' 34 ); 35 %verif = ( 36 'f_ele' => '4802,598', 37 'f_men' => '546,88', 38 'f_div' => '322,45', 39 'f_gro' => '290,38', 40 'f_eag' => '98,14', 41 'f_tmt' => '290,77', 42 'f_wind' => '1058,306', 43 'a_ind' => '706,251' 44 ); 45 46 # Définition des formats TXT 47 # -------------------------- 48 %formatTxt = ( 49 'f_ele' => '6', 50 'f_men' => '3', 51 'f_div' => '3', 52 'f_wind' => '5' 53 ); 54 55 56 # Fonction d'écriture de l'entête HTML 57 # ==================================== 58 sub entete { 59 $handle = shift(@_); 60 print $handle header(-type=>'text/html') if $handle eq 'STDOUT'; 61 print $handle 62 start_html(-title => 'Importation de données dans l\'annuaire LDAP', 63 -author => 'olivier.le_monnier@tice.ac-caen.fr', 64 -style => {-src=>"/gepcgi/style/style.css"}), 65 h1("<a style=\"color: #404044; text-decoration: none\" href=\"/$webDir/result.$pid.html\">Importation</a> de données dans l\'annuaire LDAP"), 66 hr(); 67 } 68 69 # Fonction d'écriture du pied de page HTML 70 # ======================================== 71 sub pdp { 72 $handle = shift(@_); 73 print $handle 74 "<hr>\n", 75 "<div style=\"font-size: xx-small; text-align: right\">\n", 76 "<address><a href=\"mailto:LcsDevTeam\@tice.ac-caen.fr\">< LcsDevTeam\@tice.ac-caen.fr ></a></address>\n", 77 "Mis à jour : le 5 juillet 2004", 78 "</div>\n", 79 end_html(); 80 } 81 82 sub dbf2txt { 83 my $fichier = shift; 84 open ( FICHTMP ,"</tmp/ApacheCgi.temp"); 85 seek FICHTMP, 4, 0; 86 # Séparation entête/corps 87 read( FICHTMP, $header, 8); 88 @param = unpack 'LSS', $header; 89 ($nb_enreg, $h_size, $l_enreg) = @param; 90 # Vérification des tailles de l'entête et d'un enregistrement 91 # ----------------------------------------------------------- 92 if ($verif{$fichier} ne "$h_size".","."$l_enreg") { 93 $res = "$h_size,$l_enreg,$verif{$fichier}"; 94 } else { 95 $res = 0; 96 # Écriture du fichier nettoyé 97 # --------------------------- 98 open DATA, ">/tmp/$fichier.temp"; 99 seek FICHTMP, $h_size+1, 0; 100 while ( $nb_enreg ) { 101 read( FICHTMP, $record, $l_enreg); 102 #print "<tt>$format{$fichier}</tt> : $record<br>\n"; 103 $data = join '|', (unpack $format{$fichier}, $record); 104 print DATA encode("utf8", decode("cp850", $data)), "\n"; 105 $nb_enreg--; 106 } 107 } 108 close DATA; 109 close FICHTMP; 110 unlink '/tmp/ApacheCgi.temp'; 111 # Renvoie 0 ou les valeurs comparées 112 # ---------------------------------- 113 return $res; 114 } 115 116 sub txtVerif { 117 my $fichier = shift; 118 open ( FICHTMP ,"</tmp/ApacheCgi.temp"); 119 open DATA, ">/tmp/$fichier.temp"; 120 $res = 0; 121 while (<FICHTMP>) { 122 #leb Ajout 123 chomp($ligne = $_); 124 $ligne =~ s/\r//g; 125 $ligne =~ s/\s+$//; 126 $_ = encode("utf8", decode("cp1252", $ligne))."\n"; 127 #leb Fin Ajout 128 $format = split /\|/, $_; 129 if ($format ne $formatTxt{$fichier}) { 130 close DATA; 131 unlink "/tmp/$fichier.temp"; 132 $res = 1; 133 last; 134 } 135 print DATA; 136 } 137 # Renvoie 0 ou 1 138 # -------------- 139 close DATA; 140 close FICHTMP; 141 unlink '/tmp/ApacheCgi.temp'; 142 return $res; 143 } 144 145 sub mkUid { 146 147 my ( $prenom, $nom ) = @_; 148 149 # Génération de l'UID suivant la politique 150 # définie dans le fichier de conf commun 151 152 if (($uidPolicy == 0) || ($uidPolicy == 1)) { 153 $uid = $prenom . "." . $nom; 154 } elsif (($uidPolicy == 2) || ($uidPolicy == 3)) { 155 $prenom =~ /^(\w)/; 156 $uid = $1 . $nom; 157 } elsif ($uidPolicy == 5) { 158 $uid = $nom . $prenom; 159 $uid =~ s/[\s-_]//; 160 if (length($uid) > 18) { 161 $uid =~ /^(.{18})/; 162 $uid = $1; 163 } 164 } elsif ($uidPolicy == 4) { 165 $uid = $nom; 166 if (length($nom) > 6) { 167 $uid =~ /^(.{7})/; 168 $uid = $1; 169 } 170 $prenom =~ /^(\w)/; 171 $uid .= $1; 172 } 173 if ((($uidPolicy == 1) || ($uidPolicy == 2)) && (length($uid) > 19)) { 174 $uid =~ /^(.{19})/; 175 $uid = $1; 176 } elsif (($uidPolicy == 3) && (length($uid) > 8)) { 177 $uid =~ /^(.{8})/; 178 $uid = $1; 179 } 180 return(lc($uid)); 181 } 182 183 sub sambaAttrs { 184 185 use Crypt::SmbHash; 186 187 my ( $uidNumber, $gid, $password ) = @_; 188 $rid = 2 * $uidNumber + 1000; 189 $pgrid = 513; 190 ( $lmPassword, $ntPassword ) = ntlmgen $password; 191 return ( $rid, $pgrid, $lmPassword, $ntPassword ); 192 193 } 194 195 sub getFirstFreeUid { 196 my $FFuidNumber = 1001; # n° à partir duquel la recherche est lancée 197 my $increment = 1024; # doit etre une puissance de 2 198 if (defined(getpwuid($FFuidNumber))) { 199 do { 200 $FFuidNumber += $increment; 201 } while (defined(getpwuid($FFuidNumber))); 202 203 $increment = int($increment / 2); 204 $FFuidNumber -= $increment; 205 do { 206 $increment = int($increment / 2); 207 if (defined(getpwuid($FFuidNumber))) { 208 $FFuidNumber += $increment; 209 } else { 210 $FFuidNumber -= $increment; 211 } 212 } while $increment > 1; 213 # la boucle suivante est normalement exécutée au plus une fois 214 while (defined(getpwuid($FFuidNumber))) { 215 $FFuidNumber++; 216 } 217 } 218 return $FFuidNumber; 219 } 220 221 sub getFirstFreeGid { 222 my $FFgidNumber = 2000; # n° à partir duquel la recherche est lancée 223 my $increment = 1024; # doit etre une puissance de 2 224 if (defined(getgrgid($FFgidNumber))) { 225 do { 226 $FFgidNumber += $increment; 227 } while (defined(getgrgid($FFgidNumber))); 228 229 $increment = int($increment / 2); 230 $FFgidNumber -= $increment; 231 do { 232 $increment = int($increment / 2); 233 if (defined(getgrgid($FFgidNumber))) { 234 $FFgidNumber += $increment; 235 } else { 236 $FFgidNumber -= $increment; 237 } 238 } while $increment > 1; 239 # la boucle suivante est normalement exécutée au plus une fois 240 while (defined(getgrgid($FFgidNumber))) { 241 $FFgidNumber++; 242 } 243 } 244 245 return $FFgidNumber; 246 } 247 248 sub incrementUidInit { 249 while (@data = getpwent()) { 250 $increment{$data[0]} = 1; 251 } 252 return %increment; 253 } 254 255 sub processGepUser { 256 257 my ( $uniqueNumber, $nom, $prenom, $date, $sexe, $password ) = @_; 258 if ($password eq 'undef') { $password = $date } 259 ( $uid, $cn, $givenName, $sn, $crypt, $gecos ) = gep2posixAccount( $prenom, $nom, $password, $date, $sexe ); 260 # S'il existe un UID issu du fichier f_uid on le prend 261 $uid = $Admin_UID{$uniqueNumber} || $uid; 262 # Recherche EMPLOYEENUMBER correspondant dans l'annuaire 263 if ($uniqueNumber =~ /^P(.*)$/) { 264 $searchString = $1; 265 } else { 266 $searchString = $uniqueNumber; 267 } 268 $res = $lcs_ldap->search(base => "$peopleDn", 269 scope => 'one', 270 filter => "(|(employeeNumber=$searchString)(employeeNumber=$uniqueNumber))"); 271 warn $res->error if $res->code; 272 if (($res->entries)[0] and $uniqueNumber ne 'undef') { 273 # S'il existe : actualisation des entrées CN et SN et employeeNumber 274 $uid = (($res->entries)[0])->get_value('uid'); 275 updateUserCSn(); 276 $cn = encode('latin1', decode('utf8', $cn)); 277 return ("<tr><td>Entrée <strong>$cn :</strong></td><td>compte $uniqueNumber déjà présent dans l'annuaire : <tt><strong>$uid</strong></tt>.</td></tr>\n"); 278 } else { 279 $id = 1; 280 if(($uid eq 'prof')||($uid eq 'docs')||($uid eq 'progs')||($uid eq 'netlogon')||($uid eq 'classes')||($uid eq 'homes')||($uid eq 'admhomes')||($uid eq 'profiles')) { 281 #$uid=substr($uid, 0, length($uid)-1)."1"; 282 $uid=substr($uid, 0, length($uid)-1).++$id; 283 } 284 DOUBLONS: while (1) { 285 if($uid eq 'admse3') { 286 if($id<=3) {$id=4;} 287 $uid=substr($uid, 0, length($uid)-1).++$id; 288 } 289 # Recherche d'un uid correspondant dans l'annuaire 290 $res = $lcs_ldap->search(base => "$peopleDn", 291 scope => 'one', 292 filter => "uid=$uid"); 293 warn $res->error if $res->code; 294 if (($res->entries)[0]) { 295 # S'il existe : vérification de la présence de l'EMPLOYEENUMBER 296 $employeeNumber = (($res->entries)[0])->get_value('employeeNumber'); 297 if (! $employeeNumber and $uniqueNumber ne 'undef') { 298 # En l'absence : Comparaison des CN 299 $cnLdap = unac_string('utf8', (($res->entries)[0])->get_value('cn')); 300 $cnTemp = unac_string('utf8', $cn); 301 if ($cnLdap eq $cnTemp) { 302 $ldapUid = (($res->entries)[0])->get_value('uid'); 303 updateUserEntry(); 304 $cn = encode('latin1', decode('utf8', $cn)); 305 return ("<tr><td>Entrée <strong>$cn :</strong></td><td>Mise à jour du 'numéro unique', compte <tt><strong>$ldapUid</strong></tt>.</td></tr>\n"); 306 } else { 307 # traitement des déchets... 308 $cn = encode('latin1', decode('utf8', $cn)); 309 return ("<tr><td>Entrée <strong>$cn :</strong></td><td>Risque de conflits, entrée non traitée</td></tr>\n"); 310 } 311 } else { 312 # Sinon Gestion des doublons 313 if ($uid =~ /^(.*)$id}$/) { 314 $uid = $1 . ++$id; 315 } else { 316 chop($uid) if ((length($uid)>= 8) && ($uidPolicy == 4)); 317 $uid .= ++$id; 318 } 319 next DOUBLONS; 320 } 321 } else { 322 # Création de l'entrée 323 addUserEntry($uid, $password); 324 $cn = encode('latin1', decode('utf8', $cn)); 325 my $ValRetour = "<tr><td>Entrée <strong>$cn :</strong></td><td>Création du compte <tt><strong>$uid</strong></tt>"; 326 $ValRetour .= " fourni par f_uid" if $Admin_UID{$uniqueNumber} ; 327 $ValRetour .= "</td></tr>\n"; 328 return ($ValRetour); 329 last DOUBLONS; 330 } 331 } 332 } 333 } 334 335 sub updateUserCSn { 336 337 $res = $lcs_ldap->modify( "uid=$uid,$peopleDn", 338 replace => { 339 cn => $cn, 340 sn => $sn, 341 employeeNumber => $uniqueNumber 342 } ); 343 warn $res->error if $res->code; 344 345 } 346 347 sub updateUserEntry { 348 349 $res = $lcs_ldap->modify( "uid=$uid,$peopleDn", 350 add => { 351 employeeNumber => $uniqueNumber 352 } ); 353 warn $res->error if $res->code; 354 355 } 356 357 sub addUserEntry { 358 359 ($uid, $password) = @_; 360 361 my $uidNumber = getFirstFreeUid($uidNumber); 362 363 my ( $rid, $pgrid, $lmPassword, $ntPassword ) = sambaAttrs( $uidNumber, $gid, $password ); 364 if ($smbversion eq "samba3") { 365 @entry = ( 366 'uid', $uid, 367 'cn', $cn, 368 'givenname', $givenName, 369 'sn', $sn, 370 'initials', $initials, 371 'mail', "$uid\@$domain", 372 'objectClass', 'top', 373 'objectClass', 'posixAccount', 374 'objectClass', 'shadowAccount', 375 'objectClass', 'person', 376 'objectClass', 'inetOrgPerson', 377 'objectClass', 'sambaSamAccount', 378 'loginShell', $loginShell, 379 'uidNumber', $uidNumber, 380 'gidNumber', $gid, 381 'homeDirectory', "/home/$uid", 382 'userPassword', $crypt, 383 'gecos', $gecos, 384 'sambaSID', "$domainsid-$rid", 385 'sambaPrimaryGroupSID', "$domainsid-513", 386 'sambaLMPassword', $lmPassword, 387 'sambaNTPassword', $ntPassword, 388 'sambaPwdMustChange', '2147483647', 389 'sambaPwdLastSet', '1', 390 'sambaAcctFlags', '[U ]', 391 'shadowLastChange', time 392 393 ); 394 } else { 395 @entry = ( 396 'uid', $uid, 397 'cn', $cn, 398 'givenname', $givenName, 399 'initials', $initials, 400 'sn', $sn, 401 'mail', "$uid\@$domain", 402 'objectClass', 'top', 403 'objectClass', 'posixAccount', 404 'objectClass', 'shadowAccount', 405 'objectClass', 'person', 406 'objectClass', 'inetOrgPerson', 407 'objectClass', 'sambaAccount', 408 'loginShell', $loginShell, 409 'uidNumber', $uidNumber, 410 'gidNumber', $gid, 411 'homeDirectory', "/home/$uid", 412 'userPassword', $crypt, 413 'gecos', $gecos, 414 'rid', $rid, 415 'primaryGroupId', $pgrid, 416 'lmPassword', $lmPassword, 417 'ntPassword', $ntPassword, 418 'pwdMustChange', '2147483647', 419 'acctFlags', '[U ]' 420 ); 421 } 422 push @entry, ('employeeNumber', $uniqueNumber) if $uniqueNumber; 423 424 $res = $lcs_ldap->add( "uid=$uid,$peopleDn", 425 attrs => \@entry ); 426 warn $res->error if $res->code; 427 428 } 429 430 sub normalize { 431 $toNormalize = shift; 432 $howMuch = shift; 433 if ($toNormalize =~ /\s/ and length($toNormalize) > $howMuch) { 434 my @elements = split / /, $toNormalize; 435 $normalized = ''; 436 foreach $element (@elements) { 437 if (length($element) > $howMuch) { 438 $element = lc($element); 439 $element = ucfirst($element); 440 } 441 $normalized .= "$element "; 442 } 443 chop $normalized; 444 return $normalized 445 } elsif (length($toNormalize)> $howMuch) { 446 $normalized = lc($toNormalize); 447 $normalized = ucfirst($normalized); 448 } 449 } 450 451 sub isAdmin { 452 453 # Identification de l'utilisateur 454 # =============================== 455 # Récupération du cookie 456 $isAdmin = "Y"; 457 %cookies = fetch CGI::Cookie; 458 $session = $cookies{'SambaEdu3'}->value; 459 # Connexion MySql 460 $lcs_db = DBI->connect("DBI:mysql:$connexionDb", $mysqlServerUsername, $mysqlServerPw); 461 $requete = $lcs_db->prepare("select id, login from sessions where (sess = '$session')"); 462 $requete->execute(); 463 ( $id, $login ) = $requete->fetchrow_array; 464 $lcs_db->disconnect; 465 # Validation 466 $admindn = 'uid=' . $login .",". $peopleDn; 467 @attrs = ('cn'); 468 $lcs_ldap = Net::LDAP->new("$ldap_server"); 469 $lcs_ldap->bind(dn => "$adminDn", 470 password => "$adminPw"); 471 $res = $lcs_ldap->search(base => "cn=se3_is_admin,$droitsDn", 472 scope => 'subtree', 473 attrs => \@attrs, 474 filter => "(member=$admindn)"); 475 foreach $entry ($res->entries) { 476 @cn = $entry->get('cn'); 477 } 478 if ($cn[0] ne 'se3_is_admin') { 479 $isAdmin = "N"; 480 } 481 $lcs_ldap->unbind(); 482 return $isAdmin; 483 } 484 485 sub annuelle { 486 # Préparation d'une importation annuelle 487 # -------------------------------------- 488 print RES "<h2>Préparation à l'importation annuelle</h2>\n"; 489 # Connexion LDAP 490 $lcs_ldap = Net::LDAP->new("$slapdIp"); 491 $lcs_ldap->bind( 492 dn => $adminDn, 493 password => $adminPw, 494 version => '3' 495 ); 496 # 1. Suppression des groupes 'Cours', 'Equipe', 'Classe' et 'Matiere' 497 $res = $lcs_ldap->search(base => "$groupsDn", 498 scope => 'one', 499 filter => "(|(cn=Classe_*)(cn=Equipe_*)(cn=Cours_*)(cn=Matiere_*))"); 500 warn $res->error if $res->code; 501 if (($res->entries)[0]) { 502 foreach $entry ($res->entries) { 503 $cn = $entry->get_value('cn'); 504 $res = $lcs_ldap->delete("cn=$cn,$groupsDn"); 505 print RES "Suppression du groupe <tt><strong>$cn</strong></tt>.<br>\n" if $debug > 1; 506 warn $res->error if $res->code; 507 } 508 } 509 # 2. Modification du DN des groupes Eleves, Profs et Administratifs 510 $res = $lcs_ldap->search(base => "$groupsDn", 511 scope => 'one', 512 filter => 'cn=Eleves'); 513 warn $res->error if $res->code; 514 $elevesGid = (($res->entries)[0])->get_value('gidNumber'); 515 $res = $lcs_ldap->moddn( $elevesDn, 516 newrdn => "$elevesRdn}Old" ); 517 warn $res->error if $res->code; 518 $elevesRdn =~ /cn=(.+)$/; 519 @elevesEntry = ( 520 'cn', "$1", 521 'objectClass', 'top', 522 'objectClass', 'posixGroup', 523 'gidNumber', $elevesGid, 524 ); 525 $res = $lcs_ldap->add( "$elevesDn", 526 attrs => \@elevesEntry ); 527 warn $res->error if $res->code; 528 $res = $lcs_ldap->search(base => "$groupsDn", 529 scope => 'one', 530 filter => 'cn=Profs'); 531 warn $res->error if $res->code; 532 $profsGid = (($res->entries)[0])->get_value('gidNumber'); 533 $res = $lcs_ldap->moddn( $profsDn, 534 newrdn => "$profsRdn}Old" ); 535 warn $res->error if $res->code; 536 $profsRdn =~ /cn=(.+)$/; 537 @profsEntry = ( 538 'cn', "$1", 539 'objectClass', 'top', 540 'objectClass', 'posixGroup', 541 'gidNumber', $profsGid, 542 ); 543 $res = $lcs_ldap->add( "$profsDn", 544 attrs => \@profsEntry ); 545 warn $res->error if $res->code; 546 $res = $lcs_ldap->search(base => "$groupsDn", 547 scope => 'one', 548 filter => 'cn=Administratifs'); 549 warn $res->error if $res->code; 550 $adminsGid = (($res->entries)[0])->get_value('gidNumber'); 551 $res = $lcs_ldap->moddn( "cn=Administratifs,$groupsDn", 552 newrdn => 'cn=AdministratifsOld' ); #leb ajout de 'cn=' 553 warn $res->error if $res->code; 554 @adminsEntry = ( 555 'cn', 'Administratifs', 556 'objectClass', 'top', 557 'objectClass', 'posixGroup', 558 'gidNumber', $adminsGid, 559 ); 560 #leb Ajout 561 $res = $lcs_ldap->add( "cn=Administratifs,$groupsDn", 562 attrs => \@adminsEntry ); 563 warn $res->error if $res->code; 564 #leb Fin Ajout 565 566 # 3. Recopie des member de ElevesOld, ProfsOld et AdministratifsOld dont 567 # l'employeeNumber est vide vers les branches renouvellées 568 $res = $lcs_ldap->search(base => "$peopleDn", 569 scope => 'one', 570 filter => "(!(employeeNumber=*))"); 571 foreach $entry ($res->entries) { 572 $uid = $entry->get_value('uid'); 573 $res2 = $lcs_ldap->search(base => "$elevesRdn}Old,$groupsDn", 574 scope => 'base', 575 filter => "memberUid=$uid"); 576 if (($res2->entries)[0]) { 577 $res2 = $lcs_ldap->modify( $elevesDn, 578 add => { 'memberUid' => $uid } ); 579 warn $res2->error if $res->code; 580 next; 581 } else { 582 $res2 = $lcs_ldap->search(base => "$profsRdn}Old,$groupsDn", 583 scope => 'base', 584 filter => "memberUid=$uid"); 585 if (($res2->entries)[0]) { 586 $res2 = $lcs_ldap->modify( $profsDn, 587 add => { 'memberUid' => $uid } ); 588 warn $res2->error if $res->code; 589 next; 590 } else { 591 $res2 = $lcs_ldap->search(base => "cn=AdministratifsOld,$groupsDn", 592 scope => 'base', 593 filter => "memberUid=$uid"); 594 if (($res2->entries)[0]) { 595 $res2 = $lcs_ldap->modify( "cn=Administratifs,$groupsDn", 596 add => { 'memberUid' => $uid } ); 597 warn $res2->error if $res->code; 598 } 599 } 600 } 601 } 602 # 4. Suppression des branches OLD 603 $res = $lcs_ldap->delete("$profsRdn}Old,$groupsDn"); 604 $res = $lcs_ldap->delete("$elevesRdn}Old,$groupsDn"); 605 $res = $lcs_ldap->delete("cn=AdministratifsOld,$groupsDn"); 606 } 607 sub gep2posixAccount { 608 609 my ( $prenom, $nom, $password, $date, $sexe ) = @_; 610 611 @noms = (); 612 $sn = ''; 613 614 # « Minusculisation » et nettoyage du nom et du prénom 615 # $nom =~ tr/A-Z/a-z/; 616 $nom = lc($nom); 617 $nom =~ s/'//; #'; 618 if ($nom =~ /\s/) { 619 @noms = (split / /,$nom); 620 $nom1 = $noms[0]; 621 if (length($noms[0]) < 4) { 622 $nom1 .= "_" . $noms[1]; 623 $separator = ' '; 624 } else { 625 $separator = '-'; 626 } 627 foreach $nom_partiel (@noms) { 628 $sn .= ucfirst($nom_partiel) . $separator; 629 } 630 chop $sn; 631 } else { 632 $nom1 = $nom; 633 $sn = ucfirst($nom); 634 } 635 $nom =~ /^(\w)(.*)/; 636 $firstletter_nom = $1; 637 $firstletter_nom = uc($firstletter_nom); 638 639 $prenom =~ /^(\S*)/; 640 $prenom1 = $1; 641 $prenom1 = lc($prenom1); 642 $prenom1 =~ s/'//; #'; 643 $prenom1 =~ s/\.//; #'; 644 645 $uid = mkUid(unac_string('utf8', ($prenom1)), unac_string('utf8', ($nom1))); 646 647 # Génération du mot de passe crypté 648 # $salt = chr (rand(75) + 48); 649 # $salt .= chr (rand(75) + 48); 650 # $crypt = crypt $password, $salt; 651 $crypt = `/usr/sbin/slappasswd -h {MD5} -s '$password'`; 652 653 # Génération de cn, givenName et sn 654 $cn = ucfirst($prenom1); 655 $cn = "$cn $sn"; 656 $givenName = $prenom1; 657 $initials = $prenom1 . $firstletter_nom; 658 659 # Génération du gecos 660 if ($sexe eq '1') { $sexe = 'M' } 661 if ($sexe eq '2') { $sexe = 'F' } 662 663 $unacn = unac_string('utf8', ($cn)); 664 $gecos = "$unacn,$date,$sexe,N"; 665 666 @data = ( $uid, $cn, $givenName, $sn, $crypt, $gecos ); 667 return @data; 668 }
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 |