Gros commit avec principalement la suppression de HTML_QuickForm (qui s'est révélé...
[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       $GLOBALS['LSerror'] -> stop();
68       $this -> cnx = NULL;
69       return;
70     }
71     return true;
72   }
73   
74   /**
75    * Déconnection
76    *
77    * Cette methode clos la connexion à l'annuaire Ldap
78    *
79    * @author Benjamin Renard <brenard@easter-eggs.com>
80    *
81    * @retval void
82    */
83   function close() {
84     $this -> cnx -> done();
85   }
86   
87   /**
88    * Recherche dans l'annuaire
89    *
90    * Cette methode effectue une recherche dans l'annuaire et retourne le resultat
91    * de celle-ci sous la forme d'un tableau.
92    *
93    * @author Benjamin Renard <brenard@easter-eggs.com>
94    *
95    * @param[in] $filter [<b>required</b>] string Filtre de recherche Ldap
96    * @param[in] $basedn string DN de base pour la recherche
97    * @param[in] $params array Paramètres de recherche au format Net_LDAP::search()
98    *
99    * @see Net_LDAP::search()
100    *
101    * @retval array Retourne un tableau associatif contenant :
102    *               - ['dn'] : le DN de l'entré
103    *               - ['attrs'] : tableau associatif contenant les attributs (clé)
104    *                             et leur valeur (valeur).
105    */
106   function search ($filter,$basedn=NULL,$params = array()) {
107     $ret = $this -> cnx -> search($basedn,$filter,$params);
108     if (Net_LDAP::isError($ret)) {
109       $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage());
110       return;
111     }
112     $retInfos=array();
113     foreach($ret -> entries() as $entry) {
114       $retInfos[]=array('dn' => $entry -> dn(), 'attrs' => $entry -> getValues());
115     }
116     return $retInfos;
117   }
118   
119   /**
120    * Compte le nombre de retour d'une recherche dans l'annuaire
121    *
122    * Cette methode effectue une recherche dans l'annuaire et retourne le nombre
123    * d'entrés trouvées.
124    *
125    * @author Benjamin Renard <brenard@easter-eggs.com>
126    *
127    * @param[in] $filter [<b>required</b>] string Filtre de recherche Ldap
128    * @param[in] $basedn string DN de base pour la recherche
129    * @param[in] $params array Paramètres de recherche au format Net_LDAP::search()
130    *
131    * @see Net_LDAP::search()
132    *
133    * @retval numeric Le nombre d'entré trouvées
134    */
135   function getNumberResult ($filter,$basedn=NULL,$params = array() ) {
136     if (empty($filter))
137       $filter=NULL;
138     $ret = $this -> cnx -> search($basedn,$filter,$params);
139     if (Net_LDAP::isError($ret)) {
140       $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage());
141       return;
142     }
143     return $ret -> count();
144   }
145   
146   /**
147    * Charge les valeurs des attributs d'une entré de l'annuaire
148    *
149    * Cette methode recupère les valeurs des attributs d'une entrée de l'annaire
150    * et les retournes sous la forme d'un tableau.
151    *
152    * @author Benjamin Renard <brenard@easter-eggs.com>
153    *
154    * @param[in] $dn string DN de l'entré Ldap
155    *
156    * @retval array Tableau associatif des valeurs des attributs avec en clef, le nom de l'attribut.
157    */
158   function getAttrs($dn) {
159     $infos = ldap_explode_dn($dn,0);
160     if((!$infos)||($infos['count']==0))
161       return;
162     $basedn='';
163     for ($i=1;$i<$infos['count'];$i++) {
164       $sep=($basedn=='')?'':',';
165       $basedn.=$sep.$infos[$i];
166     }
167     $return=$this -> search($infos[0],$basedn);
168     return $return[0]['attrs'];
169   }
170   
171   /**
172    * Retourne une entrée existante ou nouvelle
173    *
174    * @author Benjamin Renard <brenard@easter-eggs.com>
175    *
176    * @param[in] $object_type string Type de l'objet Ldap
177    * @param[in] $dn string DN de l'entré Ldap
178    *
179    * @retval ldapentry Un objet ldapentry (PEAR::Net_LDAP)
180    */
181   function getEntry($object_type,$dn) {
182     if(isset($GLOBALS['LSobjects'][$object_type])){
183       $obj_conf=$GLOBALS['LSobjects'][$object_type];
184       $entry = $this -> cnx -> getEntry($dn);
185       if (Net_Ldap::isError($entry)) {
186         $newentry = new Net_Ldap_Entry(&$this -> cnx);
187         $newentry -> dn($dn);
188         $newentry -> add(array('objectclass' => $obj_conf['objectclass']));
189         foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
190           $newentry->add(array($attr_name => $attr_conf['default_value']));
191         }
192         return $newentry;
193       }
194       else {
195         return $entry;
196       }
197     }
198     else {
199       $GLOBALS['LSerror'] -> addErrorCode(3);
200       return;
201     }
202   }
203   
204   /**
205    * Met à jour une entrée dans l'annuaire
206    *
207    * @author Benjamin Renard <brenard@easter-eggs.com>
208    *
209    * @param[in] $object_type string Type de l'objet Ldap
210    * @param[in] $dn string DN de l'entré Ldap
211    * @param[in] $change array Tableau des modifications à apporter
212    *
213    * @retval boolean true si l'objet a bien été mis à jour, false sinon
214    */
215   function update($object_type,$dn,$change) {
216                 debug($change);
217     if($entry=$this -> getEntry($object_type,$dn)) {
218       $entry -> replace($change);
219       $ret = $entry -> update();
220       if (Net_Ldap::isError($ret)) {
221         $GLOBALS['LSerror'] -> addErrorCode(5,$dn);
222       }
223       else {
224         return true;
225       }
226     }
227     else {
228       $GLOBALS['LSerror'] -> addErrorCode(4);
229       return;
230     }
231   }
232   
233 }
234
235 ?>