b99a981a35440b119b5e630aac81dc6d965891d8
[ldapsaisie.git] / public_html / includes / addons / LSaddons.supann.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 // Messages d'erreur
24
25 // Support
26 LSerror :: defineError('SUPANN_SUPPORT_01',
27   _("SUPANN Support : The constant %{const} is not defined.")
28 );
29 LSerror :: defineError('SUPANN_SUPPORT_02',
30   _("SUPANN Support : The LSobject type %{type} does not exist. Can't work with entities..")
31 );
32 LSerror :: defineError('SUPANN_SUPPORT_03',
33   _("SUPANN Support : The global array %{array} is not defined.")
34 );
35
36 // Autres erreurs
37 LSerror :: defineError('SUPANN_01',
38   _("SUPANN Support : The attribute %{dependency} is missing. Unable to forge the attribute %{attr}.")
39 );
40 LSerror :: defineError('SUPANN_02',
41   _("SUPANN Support : Can't get the basedn of entities. Unable to forge the attribute %{attr}.")
42 );
43       
44  /**
45   * Verification du support SUPANN par ldapSaisie
46   * 
47   * @author Benjamin Renard <brenard@easter-eggs.com>
48   *
49   * @retval boolean true si SUPANN est pleinement supporté, false sinon
50   */
51   function LSaddon_supann_support() {
52     $retval = true;
53         
54     $MUST_DEFINE_CONST= array(
55       'LS_SUPANN_LASTNAME_ATTR',
56       'LS_SUPANN_FIRSTNAME_ATTR',
57       'LS_SUPANN_LSOBJECT_ENTITE_TYPE',
58       'LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME',
59       'LS_SUPANN_ETABLISSEMENT_UAI',
60       'LS_SUPANN_ETABLISSEMENT_DN'
61     );
62
63     foreach($MUST_DEFINE_CONST as $const) {
64       if ( (!defined($const)) || (constant($const) == "")) {
65         LSerror :: addErrorCode('SUPANN_SUPPORT_01',$const);
66         $retval=false;
67       }
68     }
69
70     $MUST_DEFINE_ARRAY= array(
71       'supannRoleGenerique',
72       'supannTypeEntite',
73       'supannTranslateRoleEntiteValueDirectory',
74       'supannTranslateFunctionDirectory',
75     );
76     foreach($MUST_DEFINE_ARRAY as $array) {
77       if ( !isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) {
78         LSerror :: addErrorCode('SUPANN_SUPPORT_01',$array);
79         $retval=false;
80       }
81     }
82
83     if ( defined('LS_SUPANN_LSOBJECT_ENTITE_TYPE') ) {
84       if ( ! LSsession :: loadLSobject( LS_SUPANN_LSOBJECT_ENTITE_TYPE ) ) {
85         LSerror :: addErrorCode('SUPANN_SUPPORT_02', LS_SUPANN_LSOBJECT_ENTITE_TYPE);
86       }
87     }
88     
89     return $retval;
90   }
91
92  /**
93   * Generation du displayName
94   * 
95   * @author Benjamin Renard <brenard@easter-eggs.com>
96   *
97   * @param[in] $ldapObject L'objet ldap
98   *
99   * @retval string Le displayName ou false si il y a un problème durant la génération
100   */
101   function generate_displayName($ldapObject) {
102     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
103       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
104       return;
105     }
106     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
107       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
108       return;
109     }
110
111     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
112     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
113
114     return ($prenoms[0].' '.$noms[0]);
115   }
116   
117  /**
118   * Generation du CN
119   * 
120   * @author Benjamin Renard <brenard@easter-eggs.com>
121   *
122   * @param[in] $ldapObject L'objet ldap
123   *
124   * @retval string Le CN ou false si il y a un problème durant la génération
125   */
126   function generate_cn($ldapObject) {
127     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
128       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
129       return;
130     }
131     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
132       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
133       return;
134     }
135
136     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
137     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
138
139     return (withoutAccents($noms[0]).' '.withoutAccents($prenoms[0]));
140   }
141
142  /**
143   * Generation des valeurs de l'attribut eduPersonOrgUnitDN à partir des
144   * valeurs de l'attribut supannEntiteAffectation.
145   * 
146   * @author Benjamin Renard <brenard@easter-eggs.com>
147   *
148   * @param[in] $ldapObject L'objet ldap
149   *
150   * @retval array Les valeurs de l'attribut eduPersonOrgUnitDN ou false
151   *               si il y a un problème durant la génération
152   */ 
153   function generate_eduPersonOrgUnitDN($ldapObject) {
154     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectation' ]) != 'LSattribute' ) {
155       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectation', 'attr' => 'eduPersonOrgUnitDN'));
156       return;
157     }
158
159     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectation' ] -> getUpdateData();
160
161     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
162     if ($basedn=="") {
163       LSerror :: addErrorCode('SUPANN_02','eduPersonOrgUnitDN');
164       return;
165     }
166
167     $retval=array();
168     foreach ($affectations as $aff) {
169       $retval[]="supannCodeEntite=".$aff.",$basedn";
170     }
171
172     return $retval;
173   }
174
175  /**
176   * Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN 
177   * à partir de la valeur de l'attribut supannEntiteAffectationPrincipale.
178   * 
179   * @author Benjamin Renard <brenard@easter-eggs.com>
180   *
181   * @param[in] $ldapObject L'objet ldap
182   *
183   * @retval array La valeur de l'attribut eduPersonPrimaryOrgUnitDN
184   *               ou false si il y a un problème durant la génération
185   */ 
186   function generate_eduPersonPrimaryOrgUnitDN($ldapObject) {
187     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ]) != 'LSattribute' ) {
188       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectationPrincipale', 'attr' => 'eduPersonPrimaryOrgUnitDN'));
189       return;
190     }
191
192     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ] -> getUpdateData();
193
194     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
195     if ($basedn=="") {
196       LSerror :: addErrorCode('SUPANN_02','eduPersonPrimaryOrgUnitDN');
197       return;
198     }
199
200     $retval=array();
201     foreach ($affectations as $aff) {
202       $retval[]="supannCodeEntite=".$aff.",$basedn";
203     }
204
205     return $retval;
206   }
207
208  /**
209   * Generation de la valeur de l'attribut eduPersonOrgDN 
210   * à partir de la valeur de l'attribut supannEtablissement.
211   *
212   * La valeur sera LS_SUPANN_ETABLISSEMENT_DN si l'attribut supannEtablissement
213   * vaut {UAI}LS_SUPANN_ETABLISSEMENT_UAI.
214   * 
215   * @author Benjamin Renard <brenard@easter-eggs.com>
216   *
217   * @param[in] $ldapObject L'objet ldap
218   *
219   * @retval array La valeur de l'attribut eduPersonOrgDN ou false
220   *               si il y a un problème durant la génération
221   */ 
222   function generate_eduPersonOrgDN($ldapObject) {
223     if ( get_class($ldapObject -> attrs[ 'supannEtablissement' ]) != 'LSattribute' ) {
224       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEtablissement', 'attr' => 'eduPersonOrgDN'));
225       return;
226     }
227
228     $eta = $ldapObject -> attrs[ 'supannEtablissement' ] -> getUpdateData();
229
230     $retval=array();
231     if ($eta[0] == '{UAI}'.LS_SUPANN_ETABLISSEMENT_UAI) {
232         $retval[] = LS_SUPANN_ETABLISSEMENT_DN;
233     }
234
235     return $retval;
236   }
237
238  /**
239   * Parse une valeur composite SUPANN
240   *
241   * Exemple de valeur :
242   *
243   *    [key1=value][key2=value][key3=value]
244   *
245   * @author Benjamin Renard <brenard@easter-eggs.com>
246   *
247   * @param[in] $val La valeur composite
248   *
249   * @retval array Un tableau contenant key->value ou false en cas d'erreur
250   **/
251   function supannParseCompositeValue($val) {
252     if (preg_match_all('/\[([^=]*)=([^\]]*)\]/',$val,$matches)) {
253       $parseValue=array();
254       for($i=0;$i<count($matches[0]);$i++) {
255         $parseValue[$matches[1][$i]]=$matches[2][$i];
256       }
257       return $parseValue;
258     }
259     return;
260   }
261
262  /**
263   * Retourne une eventuelle fonction de traduction d'une valeur
264   * en fonction de son label et de sa cle.
265   *
266   * Utilise la table $GLOBALS['supannTranslateFunctionDirectory']
267   *
268   * @param[in] $label Le label de la valeur
269   * @param[in] $key La cle de la valeur
270   *
271   * @retval string|false Le nom de la fonction de traduction ou false
272   **/
273   function supannTranslateRoleEntiteFunction($label,$key) {
274     if (isset($GLOBALS['supannTranslateFunctionDirectory'][$label][$key])) {
275       return $GLOBALS['supannTranslateFunctionDirectory'][$label][$key];
276     }
277     return;
278   }
279
280
281  /**
282   * Retourne le nom court d'une entite en fonction de son identifiant
283   *
284   * Fonction utilise comme fonction de traduction dans la fonction 
285   * supannTranslateRoleEntiteValue()
286   *
287   * @param[in] $label Le label de la valeur
288   * @param[in] $key La cle de la valeur
289   * @param[in] $value La valeur : l'identifiant de l'entite (supannCodeEntite)
290   *
291   * @retval string Le nom de l'entite
292   **/
293   function supanGetEntiteNameById($label,$key,$value) {
294     if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
295       $type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
296       $e = new $type();
297       $list=$e -> listObjectsName("(supannCodeEntite=$value)",NULL,array(),LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME);
298       if (count($list)==1) {
299         return array(
300           'translated' => array_pop($list),
301           'label' => $label
302         );
303       }
304     }
305     return array(
306       'translated' => getFData(__("%{value} (unrecognized value)"),$value),
307       'label' => $label
308     );
309   }
310
311  /**
312   * Parse une valeur a etiquette SUPANN
313   *
314   * Exemple de valeur :
315   *
316   *    {SUPANN}S410
317   *
318   * @param[in] $val La valeur
319   *
320   * @retval array Un tableau cle->valeur contenant label et value ou False
321   **/
322   function supannParseLabeledValue($value) {
323     if (preg_match('/^\{([^\}]*)\}(.*)$/',$value,$m)) {
324       return array(
325         'label'=>$m[1],
326         'value'=>$m[2]
327       );
328     }
329     return;
330   }
331
332  /**
333   * Traduit une valeur en fonction de sa cle extrait d'un attribut
334   * supannRoleEntite.
335   *
336   * @param[in] $key La cle
337   * @param[in] $value La valeur
338   *
339   * @retval array Un tableau cle->valeur contenant label et translated ou False
340   **/
341   function supannTranslateRoleEntiteValue($key,$value) {
342     $label='no';
343     $pl=supannParseLabeledValue($value);
344     if ($pl) {
345       $label=$pl['label'];
346       $value=$pl['value'];
347     }
348
349     // Translate by method
350     if (supannTranslateRoleEntiteFunction($label,$key)) {
351       $func = supannTranslateRoleEntiteFunction($label,$key);
352       if (function_exists($func)) {
353         try {
354           return $func($label,$key,$value);
355         }
356         catch (Exception $e) {
357           return;
358         }
359       }
360       else {
361         return;
362       }
363     }
364     // Translate by directory
365     elseif (isset($GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value])) {
366       return array(
367         'translated' => $GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value],
368         'label' => $label
369      );
370     }
371     else {
372       return array(
373         'label' => $label,
374         'translated' => $value
375       );
376     }
377   }
378
379 ?>