Newer
Older
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
215
216
217
218
<?php
session_start();
//on charge le fichier config.xml du dossier apps/maarch_entreprise/xml pour pouvoir récupérer les données de connexion à la base de données.
//$xml = simplexml_load_file('../../../apps/maarch_entreprise/xml/config.xml');
$nomFichier = date('Y-m-d_H-i-s') . '.log'; //nom du fichier log enregistrer dans le dossier logLdap
$fichier = 'ldap_users';
echo "... CHARGEMENT DU FICHIER DE CONFIGURATION ...\n";
if( !isset($argv) ){
exit(htmlentities("Ce script ne peut-etre appelé qu'en PHP CLI"));
}else if( isset($argv) && count($argv) < 2){
exit("Erreur de Syntaxe !\nLa syntaxe est $argv[0] <fichier de conf xml> <xml de sortie>\n\n");
}else if(!file_exists($argv[1])){
exit("/!\ Le fichier de configuration n'existe pas!\n\n");
}else{
$ldap_conf_file = trim($argv[1]);
echo "Fichier OK !\n\n";
}
//Extraction de /root/config dans le fichier de conf
$ldap_conf = new DomDocument();
try
{
$ldap_conf->load($ldap_conf_file);
}
catch(Exception $e)
{
exit("/!\ Impossible de charger le document : ".$ldap_conf_file."\n
Erreur : ".$e.getMessage."\n\n");
}
//**********************************//
// FILTER AND DNs //
//**********************************//
$i=0;
$xp_ldap_conf = new domxpath($ldap_conf);
foreach( $xp_ldap_conf->query("/root/filter/dn/@id") as $dn)
{
$type = $xp_ldap_conf->query("/root/filter/dn[@id= '".$dn->nodeValue."']/@type")->item(0)->nodeValue; //echo "for each filter ok\n";
//$dn_and_filter[$i][$dn->nodeName] = $dn->nodeValue;
//echo "nodename : ".$dn_and_filter[$i][$dn->nodeName]."\n";
if($type=='entities'){
$dn_and_filter[$i]['id'] = $dn->nodeValue;
}
}
unset($i);
$DnsEntities=array();
foreach ($dn_and_filter as $key => $value) {
$DnsEntities[]=$value['id'];
}
//print_r($DnsEntities);
//on charge le fichier config.xml pour pouvoir récupérer les données de connexion à la base de données.
$xml = simplexml_load_file($ldap_conf_file);
$host = $xml->config_base->databaseserver;
$dbname = $xml->config_base->databasename;
$user= $xml->config_base->databaseuser;
$password = $xml->config_base->databasepassword;
//echo 'host : '.$host;echo "\n";
//echo 'dbname :'.$dbname;echo "\n";
//echo 'user : '.$user;echo "\n";
//echo 'password :'.$password;echo "\n";
echo "... CONNEXION A LA BASE DE DONNEES MAARCH ...\n";
// Connexion, sélection de la base de données
try {
$db = new PDO("pgsql:host=$host;dbname=$dbname", "$user", "$password");
echo 'Connexion OK'."\n\n";
}
catch(PDOException $e) {
$db = null;
echo '/!\ Erreur de connexion: ' . $e->getMessage()."\n\n";
exit;
}
$xp_ldap_conf = new domxpath($ldap_conf);
foreach($xp_ldap_conf->query("/root/config/*") as $cf)
${$cf->nodeName} = $cf->nodeValue;
//Si une class custom est définie
if( file_exists(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php") )
include(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php");
//Sinon si la class est définie pour le module
else if( file_exists(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php") )
include(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php");
//Sinon
else
exit("Impossible de charger class_".$type_ldap.".php\n");
//**********************************//
// LDAP CONNECTION //
//**********************************//
echo "... CONNEXION A L'ANNUAIRE $type_ldap ...\n";
//Try to create a new ldap instance
try
{
if($prefix_login != ''){
$login_admin =$prefix_login."\\".$login_admin;
}
$ad = new LDAP($domain,$login_admin,$pass,false);
echo "Connexion Ldap ok\n\n";
}
catch(Exception $con_failure)
{
exit("/!\ Impossible de se connecter à l'annuaire\n
Erreur : ".$con_failure->getMessage()."\n\n");
}
/**
Les Fonctions
*/
/*
Fonction qui permet de récupérer l'information de la balise concernée dans le fichier xml
**/
function infoBalise($description, $balise)
{
if($description == NULL) {
return $contenu = '';
}else{
$contenu = NULL;
$contenubalise = $description ->getElementsByTagName($balise);
foreach($contenubalise as $contenu){
$contenu = $contenu->firstChild->nodeValue . "";
}
//echo $contenu."\n";
return $contenu ;
}
}
/*Fonction qui va llire les memberofs du ldap.xml*/
function infoMemberOf($description, $balise,$OU)
{
if($description == NULL) {
return $contenu = '';}
else{
$contenu = NULL;
$contenubalise = $description ->getElementsByTagName($balise);
foreach($contenubalise as $contenu)
$contenu = $contenu->firstChild->nodeValue . "";
$nomGroupe = strstr($contenu, $OU, true);
if($nomGroupe != false and $contenu != null){return $contenu;}elseif($nomGroupe == false and $contenu == null){return null;}elseif($nomGroupe == false and $contenu !=null){return ok;}
}
}
/*Fonction qui va vérifier si l'utilisateur est dans la table des users ou non*/
function verifUser($user_id, $db)
{
$qry = $db->prepare("SELECT * from users where upper(user_id) = upper(?)");
$qry->execute(array($user_id));
while ($row = $qry->fetch()){
$user_id = $row['user_id'];
if($user_id == null){echo "le pseudo $user_id n'a pas été trouvé dans la base !";
return false; }else{echo "le pseudo $user_id a été trouvé dans la base";
return true;}
}
}
/*Fonction qui va vérifier les données de l'utilisateur dans la table users. Si il y a des données qui ne sont pas à jour, la fonction fait le update pour mettre à jour. */
function verifUpdate($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$db)
{
$qry = $db->prepare("SELECT * from users where upper(user_id) = upper(?) and firstname = ? and lastname = ? and phone = ? and mail = ? and custom_t3 = ? and status = 'OK'");
$qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber));
$result = $qry->fetchAll();
if($result==null){
echo "les donnees doivent etre mis a jour !";
$qry = $db->prepare("UPDATE users set user_id = ?, firstname = ? , lastname = ? , phone = ? , mail = ?,custom_t3 = ?, status = 'OK', loginmode = 'standard' where upper(user_id) = upper(?) ");
$result = $qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$user_id));
$result = $qry->fetchAll();
if($result==null){
echo "Error, données non mises à jours!";
}else{
echo "données mises à jour!";
}
}else{
echo "les donnees de users sont a jour \n";
return true;
}
}
/*Function qui va insérer l'utilisateur dans la table des users. Si l'utilisateur n'est pas présent, on lui done le mot de passe de maarch*/
function insertUser($user_id,$firstname,$lastname,$phone,$mail,$employeNumber,$db)
{
$qry = $db->prepare("INSERT into users (user_id, password, firstname, lastname, phone, mail, custom_t3, enabled, change_password, status,loginmode) values (upper(?),'ef9689be896dacd901cae4f13593e90d',?,?,?,?,?,'Y','Y','OK','standard')");
$qry->execute(array($user_id,$firstname,$lastname,$phone,$mail,$employeNumber));
$result = $qry->fetchAll();
if($result==null){
echo "Error : les donnees n'ont pas ete ajouté !\n";
return false;
}else{
echo "la ligne a été ajouté \n";
return true;
}
}
/*Fonction qui va supprimer tous les users de la table users_entities lorsque les entitées ne sont pas présente dans le ldap*/
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
function deleteUsersEntities($idEntitiesTab,$user_id, $db)
{
$qry ="SELECT * from users_entities where user_id ='$user_id' and ";
$qry .= " entity_id not in ('".implode("','",$idEntitiesTab)."')";
$qry = $db->prepare($qry);
$qry->execute();
$result = $qry->fetchAll();
if(!empty($result)){
echo "Dissociation des anciens services affectes aux utilisateurs ...\n";
$qry = "delete from users_entities where user_id ='$user_id' and ";
$qry .= " entity_id not in ('".implode("','",$idEntitiesTab)."')";
$qry = $db->prepare($qry);
$qry->execute();
$result = $qry->fetchAll();
}else{
echo "les services sont a jour pour l'utilisateur $user_id! \n";
}
}
/*Fontion qui va écrire dans le fichier log . Cela permet de faire un suivie du processus*/
function ecrire_log($event,$nomFichier){
/* $fp = fopen('var/www/html/maarch_entreprise_prod/modules/ldap/logLdap/'.$nomFichier,'a+'); // ouvrir le fichier ou le créer
fseek($fp,SEEK_END); // poser le point de lecture à la fin du fichier
$nouverr=date('Y-m-d_H-i-s')." : ".$event."\r\n"; // ajouter un retour à la ligne au fichier
fputs($fp,$nouverr); // ecrire ce texte
fclose($fp); //fermer le fichier */
}
function seekEntityId($ldap_id, $db){
$qry = $db->prepare("SELECT entity_id, entity_label from entities WHERE ldap_id= ? ");
if($qry->execute(array($ldap_id))){
while($row = $qry->fetch()){
//echo "la valeur de la requete pour seekParentEntityId est : ".$row['entity_id']."\n";
$info = $row['entity_id'];
}
}
return $info;
}
function insertUserEntity($pseudo, $entity_id, $db){
$is_primary='Y';
$qry=$db->prepare("SELECT * from users_entities where user_id = ?");
$qry->execute(array($pseudo));
$result = $qry->fetchAll();
if(empty($result)){
$is_primary='Y';
}else{
$is_primary='N';
}
$qry=$db->prepare("SELECT * from users_entities where user_id = ? and entity_id = ? ");
$result = null;
$qry->execute(array($pseudo,$entity_id));
$result = $qry->fetchAll();
//print_r($qry->errorInfo());
if($result != null){
echo "les donnees de users_entities sont a jour \n";
}else{
echo "les donnees de users_entities doivent etre mis a jour!";
$qry2=$db->prepare("INSERT into users_entities (user_id,entity_id, primary_entity) values (?,?,?)");
$result2 = $qry2->execute(array($pseudo, $entity_id, $is_primary));
//print_r($qry2->errorInfo());
$result2 = $qry2->fetchAll();
if($result2 ==null){
echo "Error, aucun users_entities n'a ete ajoute \n";
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
}else{ echo "Insertion du users_entities effectue! \n";}
}
}
/**
Chargement du fichier xml
*/
$dom = new DomDocument();
echo "... TRAITEMENT du fichier $fichier ...\n";
if(!($dom->load('../xml/'.$fichier.'.xml')))
{
//echo "fichier : ".$fichier;
$event = "Unable to load : " . $fichier.'.xml'."\n";
echo $event;
//ecrire_log($event,$nomFichier);
exit();
}else{
$event = "able to load : " . $fichier.'.xml'."\n";
echo $event;
//ecrire_log($event,$nomFichier);
}
/*On compte le nombre d'item dans le fichier xml. Ceci est réalisé car le nom de la balise est item suivi d'un chiffre*/
for($m = 0; ;$m++)
{
$nomItem = 'item_'.$m;
$list = $dom->getElementsByTagName("ldap_info")->item(0);
$listItem = $list->getElementsByTagName($nomItem)->item(0);
if($listItem == NULL){break;}
}
/**
Lecture du fichier ldap.xml des users pour mise à jours des données des tables users et users_entities
*/
$idUsersTab= array('superadmin'); //Ce tableau est initialisé avec superadmin pour qu'il ne soit pas passé en DEL lors de la mise à jour des users.
/*Boucle qui permet de travailler sur les données contenues dans le fichier xml. On récupère les données puis on les insère dans la table users_entities*/
for($i = 0; $i<$m ; $i++)
{
$nomItem = 'item_'.$i;
$list = $dom->getElementsByTagName("ldap_info")->item(0);
$listItem = $list->getElementsByTagName($nomItem)->item(0);
$user_id = infoBalise($listItem, 'xml_user_id');
if($user_id == NULL){
$event = "Id du User de l'$nomItem absent, arret du processus";
//ecrire_log($event,$nomFichier);break;
}
echo("=============== $user_id ===============\n");
echo("-------------Informations-------------\n");
echo "+ xml : $nomItem\n";
echo "+ user_id : $user_id\n";
echo("--------------------------------------\n");
/*On Recherche les memberOf*/
echo ".\n";
echo ".\n";
echo ".\n";
echo "... RECHERCHE DE MEMBER OF ...\n";
echo ".\n";
echo ".\n";
echo ".\n\n";
$user_entity = $listItem->getElementsByTagName('xml_user_entity')->item(0);
/*On initialise le tableau idEntitiesTab pour stocker les entités récupérées des membersOf*/
$user_entities = array();
//La boucle permet de récupérer les données de chaques memberOf.
for($j = 0; ; $j++)
{
$nomItem = 'xml_'.$j;
$dnMemberof = infoBalise($user_entity, $nomItem);
// on arrête la lecture des memberof si cnMemberof est null
if($dnMemberof == ''){break;}
//$pos = strpos($cnMemberof, $DnsEntities[$key]);
if (preg_match('/'.$DnsEntities[0].'/', $dnMemberof)) {
$entity_ldap_id = $ad->group_info($dnMemberof,array('objectguid'),$DnsEntities[0]);
$entity_ldap_id=$entity_ldap_id['objectguid'];
$entityId=seekEntityId($entity_ldap_id, $db);
echo("-------------Entite associee-------------\n");
echo "+ xml : $nomItem\n";
echo "+ DN entity : $dnMemberof\n";
echo "+ ldap_id : $entity_ldap_id\n";
echo "+ entity_id : $entityId\n";
echo("----------------------------------------\n");
if(!empty($user_id) and !empty($entityId)){
insertUserEntity($user_id,$entityId,$db);
}
$user_entities[]=$entityId;
}
}
if($dnMemberof != ''){
deleteUsersEntities($user_entities,$user_id,$db);
}
if($dnMemberof == '' && $j==0){
echo "... PAS DE MEMBER OF! ...\n";
}
echo("========================================\n\n\n");
}
//print_r($idUsersTab);
?>