- Ecriture du LSsession
[ldapsaisie.git] / trunk / includes / class / class.LSldap.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 /**
24  * Gestion de l'accès à l'annaire Ldap
25  *
26  * Cette classe gère l'accès à l'annuaire ldap en s'appuyant sur PEAR :: Net_LDAP
27  *
28  * @author Benjamin Renard <brenard@easter-eggs.com>
29  */
30 class LSldap {
31
32   var $config;
33   var $cnx = NULL;
34
35   /**
36    * Constructeur
37    *
38    * Cette methode définis la configuration de l'accès à l'annuaire
39    * et établie la connexion.
40    *
41    * @author Benjamin Renard <brenard@easter-eggs.com>
42    *
43    * @param[in] $config array Tableau de configuration au formar Net_LDAP
44    *
45    * @retval void
46    *
47    * @see Net_LDAP::connect()
48    */
49   function LSldap ($config) {
50     $this -> config = $config;
51     $this -> connect();
52   }
53   
54   /**
55    * Connection
56    *
57    * Cette methode établie la connexion à l'annuaire Ldap
58    *
59    * @author Benjamin Renard <brenard@easter-eggs.com>
60    *
61    * @retval boolean true si la connection est établie, false sinon
62    */
63   function connect() {
64     $this -> cnx = Net_LDAP::connect($this -> config);
65     if (Net_LDAP::isError($this -> cnx)) {
66       $GLOBALS['LSerror'] -> addErrorCode(1,$this -> cnx -> getMessage());
67       $this -> cnx = NULL;
68       return;
69     }
70     return true;
71   }
72   
73   /**
74    * Déconnection
75    *
76    * Cette methode clos la connexion à l'annuaire Ldap
77    *
78    * @author Benjamin Renard <brenard@easter-eggs.com>
79    *
80    * @retval void
81    */
82   function close() {
83     $this -> cnx -> done();
84   }
85   
86   /**
87    * Recherche dans l'annuaire
88    *
89    * Cette methode effectue une recherche dans l'annuaire et retourne le resultat
90    * de celle-ci sous la forme d'un tableau.
91    *
92    * @author Benjamin Renard <brenard@easter-eggs.com>
93    *
94    * @param[in] $filter [<b>required</b>] string Filtre de recherche Ldap
95    * @param[in] $basedn string DN de base pour la recherche
96    * @param[in] $params array Paramètres de recherche au format Net_LDAP::search()
97    *
98    * @see Net_LDAP::search()
99    *
100    * @retval array Retourne un tableau associatif contenant :
101    *               - ['dn'] : le DN de l'entré
102    *               - ['attrs'] : tableau associatif contenant les attributs (clé)
103    *                             et leur valeur (valeur).
104    */
105   function search ($filter,$basedn=NULL,$params = array()) {
106     $ret = $this -> cnx -> search($basedn,$filter,$params);
107     if (Net_LDAP::isError($ret)) {
108       $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage());
109       return;
110     }
111     $retInfos=array();
112     foreach($ret -> entries() as $entry) {
113       $retInfos[]=array('dn' => $entry -> dn(), 'attrs' => $entry -> getValues());
114     }
115     return $retInfos;
116   }
117   
118   /**
119    * Compte le nombre de retour d'une recherche dans l'annuaire
120    *
121    * Cette methode effectue une recherche dans l'annuaire et retourne le nombre
122    * d'entrés trouvées.
123    *
124    * @author Benjamin Renard <brenard@easter-eggs.com>
125    *
126    * @param[in] $filter [<b>required</b>] string Filtre de recherche Ldap
127    * @param[in] $basedn string DN de base pour la recherche
128    * @param[in] $params array Paramètres de recherche au format Net_LDAP::search()
129    *
130    * @see Net_LDAP::search()
131    *
132    * @retval numeric Le nombre d'entré trouvées
133    */
134   function getNumberResult ($filter,$basedn=NULL,$params = array() ) {
135     if (empty($filter))
136       $filter=NULL;
137     $ret = $this -> cnx -> search($basedn,$filter,$params);
138     if (Net_LDAP::isError($ret)) {
139       $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage());
140       return;
141     }
142     return $ret -> count();
143   }
144   
145   /**
146    * Charge les valeurs des attributs d'une entré de l'annuaire
147    *
148    * Cette methode recupère les valeurs des attributs d'une entrée de l'annaire
149    * et les retournes sous la forme d'un tableau.
150    *
151    * @author Benjamin Renard <brenard@easter-eggs.com>
152    *
153    * @param[in] $dn string DN de l'entré Ldap
154    *
155    * @retval array Tableau associatif des valeurs des attributs avec en clef, le nom de l'attribut.
156    */
157   function getAttrs($dn) {
158     $infos = ldap_explode_dn($dn,0);
159     if((!$infos)||($infos['count']==0))
160       return;
161     $basedn='';
162     for ($i=1;$i<$infos['count'];$i++) {
163       $sep=($basedn=='')?'':',';
164       $basedn.=$sep.$infos[$i];
165     }
166     $return=$this -> search($infos[0],$basedn);
167     return $return[0]['attrs'];
168   }
169   
170   /**
171    * Retourne une entrée existante ou nouvelle
172    *
173    * @author Benjamin Renard <brenard@easter-eggs.com>
174    *
175    * @param[in] $object_type string Type de l'objet Ldap
176    * @param[in] $dn string DN de l'entré Ldap
177    *
178    * @retval ldapentry Un objet ldapentry (PEAR::Net_LDAP)
179    */
180   function getEntry($object_type,$dn) {
181     if(isset($GLOBALS['LSobjects'][$object_type])){
182       $obj_conf=$GLOBALS['LSobjects'][$object_type];
183       $entry = $this -> cnx -> getEntry($dn);
184       if (Net_Ldap::isError($entry)) {
185         $newentry = new Net_Ldap_Entry(&$this -> cnx);
186         $newentry -> dn($dn);
187         $newentry -> add(array('objectclass' => $obj_conf['objectclass']));
188         foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
189           $newentry->add(array($attr_name => $attr_conf['default_value']));
190         }
191         return $newentry;
192       }
193       else {
194         return $entry;
195       }
196     }
197     else {
198       $GLOBALS['LSerror'] -> addErrorCode(3);
199       return;
200     }
201   }
202   
203   /**
204    * Met à jour une entrée dans l'annuaire
205    *
206    * @author Benjamin Renard <brenard@easter-eggs.com>
207    *
208    * @param[in] $object_type string Type de l'objet Ldap
209    * @param[in] $dn string DN de l'entré Ldap
210    * @param[in] $change array Tableau des modifications à apporter
211    *
212    * @retval boolean true si l'objet a bien été mis à jour, false sinon
213    */
214   function update($object_type,$dn,$change) {
215                 debug($change);
216     if($entry=$this -> getEntry($object_type,$dn)) {
217       $entry -> replace($change);
218       $ret = $entry -> update();
219       if (Net_Ldap::isError($ret)) {
220         $GLOBALS['LSerror'] -> addErrorCode(5,$dn);
221                                 debug('NetLdap-Error : '.$ret->getMessage());
222       }
223       else {
224         return true;
225       }
226     }
227     else {
228       $GLOBALS['LSerror'] -> addErrorCode(4);
229       return;
230     }
231   }
232
233   /**
234    * Test de bind
235    *
236    * Cette methode établie une connexion à l'annuaire Ldap et test un bind
237          * avec un login et un mot de passe passé en paramètre
238    *
239    * @author Benjamin Renard <brenard@easter-eggs.com>
240    *
241    * @retval boolean true si la connection à réussi, false sinon
242    */
243   function checkBind($dn,$pwd) {
244                 $config = $this -> config;
245                 $config['binddn'] = $dn;
246                 $config['bindpw'] = $pwd;
247     $cnx = Net_LDAP::connect($config);
248     if (Net_LDAP::isError($cnx)) {
249       return;
250     }
251     return true;
252   }
253
254         /**
255          * Retourne l'état de la connexion Ldap
256          *
257          * @retval boolean True si le serveur est connecté, false sinon.
258          */
259         function isConnected() {
260                 return ($this -> cnx == NULL)?false:true;
261         }
262
263 }
264
265 ?>