1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
| #!/bin/perl -i
use MIME::Base64;
use warnings;
use CGI;
use Net::LDAP;
use Net::LDAP::LDIF;
$q = new CGI ;
$filename = $q -> param("userfile") ;
$bongroupeunix = $q -> param("liste_groupe") ; # Paramètre qui va permettre de changer automatiquement le groupe unix en fonction de l'utilisateur
$nature_fiche = $q -> param ("nature") ; # Paramètre qui permet de savoir par qui le carnet sera visible
($rien, $nom_group_split) = split /=/, $bongroupeunix;
($nom_group, $rien) = split /,/, $nom_group_split;
$uid_utilis = $q -> param("utilisateur");
$perso = "perso";
$share = "share";
open (FICHIER, ">/tmp/$$.ldif");
chmod (0666, "/tmp/$$.ldif"); # Droit donné sur le fichier temporaire afin de pouvoir le supprimer en fin de programme
# Initialisation du programme
while (<$filename>){
if(not defined $sn_exists){
$sn_exists = 0;
$cn_exists = 0;
if ($nature_fiche eq $perso){
$basedn=",ou=$uid_utilis,ou=carnets,dc=oooooo,dc=fr";}
elsif ($nature_fiche eq $share){
$basedn=",$bongroupeunix";}
$unknown_index = 1;
}
if($_ =~ /^sn:/){
$sn_exists = 1;
}
if($_ =~ /^cn:/){
$cn_exists = 1;
}
if($_ =~ /^$/){
if($sn_exists == 0){
$sn_exists = "Snid " . $unknown_index++;
}
# Si l'attribut "cn" n'existe pas, on doit en créer un
# sinon LDAP va compléter le champ avec LDAP_NAMING_VIOLATION
if($cn_exists == 0){
print "cn: " . $cn . "\n";
}
$sn_exists = 0;
$cn_exists = 0;
}
# On décode les lignes encodée en BASE64 pour notre substitution
if($_ =~ /^(\w+):: (.*)/){
$_ = sprintf("%s: %s\n", $1, decode_base64($2));
}
# On doit vérifier l'attribut "cn" de la ligne "dn" car certains contacts n'ont pas d'attribut "mail=" définit, on doit donc ajouter notre champ
# à la fin de la ligne
if($_ =~ /^(dn:+\s*)/){
$prefix = $1;
$cn = $_;
# On enlève le retour à la ligne
chop $cn;
# Extraction du champ cn de la ligne dn
$cn =~ s/^dn:+\s*cn=([^=]+)(,\s*mail=.*)??$/$1/;
# Si la ligne cn n'est pas renseignée, elle doit commencer par "dn:"
# on doit donc vérifier cela, et donner un nom unique pour cette entrée
if($cn =~ /^dn:/){
$cn = "NoName " . $unknown_index++;
}
# On effectue une vérification sur le champ cn et (pas de virgules)
$cn =~ s/,/ /g;
$cn = $unknown_index++.$cn;
s/^cn:/cn:/g;
# On créer un nouveau champ "dn"
$_ = $prefix . "cn=" . $cn . $basedn . "\n";
}
if($_ =~ /^(cn:+\s*)/){
$_ = $1 . $cn . "\n";
}
# Suppression ou modification des champs inutiles, et non reconnu par Iplanet Directory Server
s/^homeStreet:/mozillaHomeUrl:/;
s/^xmozillausehtmlmail.*\n//;
s/^nsAIMid.*\n//;
s/^modifytimestamp:.*\n//;
s/^mozillaSecondEmail:.*\n//;
s/^mozillaHomeLocalityName:.*\n//;
s/^mozillaHomePostalCode:.*\n//;
s/^mozillaHomeCountryName:.*\n//;
s/^mozillaCustom1:.*\n//;
s/^mozillaCustom2:.*\n//;
s/^mozillaCustom3:.*\n//;
s/^mozillaCustom4:.*\n//;
s/^description:.*\n//;
s/^mozillaWorkStreet2:.*\n//;
s/^objectclass: mozillaAbPersonObsolete.*\n//;
s/^objectclass: mozillaAbPersonAlpha.*\n//;
s/^objectclass: organizationalPerson.*\n//;
s/^objectclass: mozillaOrgPerson.*\n//;
s/^objectclass: groupOfNames.*\n//;
s/^objectclass: top.*\n//;
s/^objectclass: person.*/memberof: $uid_utilis/;
s/^mozillaWorkUrl:.*\n//;
s/^member:.*\n//g;
my $line =~ "^street:(.*?)";
$line =~ s/(.+?)\s+/$1/ ;
if ($nature_fiche eq $perso){
s/^objectclass: inetOrgPerson.*/objectclass: top\nobjectclass: extensibleObject\nuid: $uid_utilis/;}
elsif ($nature_fiche eq $share){
s/^objectclass: inetOrgPerson.*/objectclass: top\nobjectclass: extensibleObject\ngroupeunix: $nom_group/;}
# On supprime le caractère de retour à la ligne inséré par l'éditeur windows
s/\r//g;
#On remplace les accents et on supprime les caractères indésirables
s/\303\250/è/g;
s/\303\251/é/g;
s/\303\252/ê/g;
s/\303\242/â/g;
s/\303\264/ô/g;
s/\303\256/î/g;
s/\303\273/û/g;
s/\303\240/à/g;
s/\303\247/ç/g;
s/\303\271/ù/g;
s/\303\253/ë/g;
s/\303\266/ö/g;
s/"//g;
s/%//g;
s/µ//g;
s/£//g;
s/\^//g;
s/\|//g;
s/{//g;
s/}//g;
s/~//g;
s/&//g;
s/§//g;
s/_//g;
s/\*//g;
s/°//g;
s/\+//g;
s/#//g;
s/\?//g;
s/\!//g;
s/\(//g;
s/\)//g;
s/\[//g;
s/\]//g;
s/\\//g;
s/'//g;
s/é/é/g;
#Il suffit maintenant d'imprimer les résultats dans notre fichier temporaire
printf FICHIER;
}
close (FICHIER);
#On va maintenant effectuer l'ajout du fichier temporaire sur LDAP
#Connexion sur le serveur
my $mesg;
my $ldap_server = Net::LDAP->new("roslit.ooooo.fr", port => 389, version => 3)
or die "erreur LDAP: Can't contact master ldap server ($@)";
$mesg = $ldap_server->bind( "cn=directory manager", password => "testr0sl" );
$mesg->code && die $mesg->error;
#Ajout du fichier
$ldif = Net::LDAP::LDIF->new( "/tmp/$$.ldif", "r", onerror => undef );
while( not $ldif->eof () ) {
$entry = $ldif->read_entry ();
if ( $ldif->error ( ) ) {
print "Message d'erreur: ", $ldif->error (), "\n";
print "Lignes ou sont les erreurs:\n", $ldif->error_lines (), "\n";
}
else {
$ldap_server->add( $entry );
}
}
print "AJOUT DU CARNET EFFECTUE";
$ldif->done ();
# Deconnexion du serveur
$ldap_server->unbind();
# On supprime le fichier temporaire afin de ne pas encombrer le serveur
#unlink ("/tmp/$$.ldif");
# On se redirige vers une page
print $q->redirect("http://oooo.fr/oooooo/essai/LDAP/ADMIN/index.php");
exit; |
Partager