SUPANN : ajout du support de l'attribut supannEtablissement
[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       'tableCodeUAI',
76       'supannTranslateEtablissementDirectory',
77     );
78     foreach($MUST_DEFINE_ARRAY as $array) {
79       if ( !isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) {
80         LSerror :: addErrorCode('SUPANN_SUPPORT_01',$array);
81         $retval=false;
82       }
83     }
84
85     if ( defined('LS_SUPANN_LSOBJECT_ENTITE_TYPE') ) {
86       if ( ! LSsession :: loadLSobject( LS_SUPANN_LSOBJECT_ENTITE_TYPE ) ) {
87         LSerror :: addErrorCode('SUPANN_SUPPORT_02', LS_SUPANN_LSOBJECT_ENTITE_TYPE);
88       }
89     }
90     
91     return $retval;
92   }
93
94  /**
95   * Generation du displayName
96   * 
97   * @author Benjamin Renard <brenard@easter-eggs.com>
98   *
99   * @param[in] $ldapObject L'objet ldap
100   *
101   * @retval string Le displayName ou false si il y a un problème durant la génération
102   */
103   function generate_displayName($ldapObject) {
104     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
105       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
106       return;
107     }
108     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
109       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
110       return;
111     }
112
113     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
114     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
115
116     return ($prenoms[0].' '.$noms[0]);
117   }
118   
119  /**
120   * Generation du CN
121   * 
122   * @author Benjamin Renard <brenard@easter-eggs.com>
123   *
124   * @param[in] $ldapObject L'objet ldap
125   *
126   * @retval string Le CN ou false si il y a un problème durant la génération
127   */
128   function generate_cn($ldapObject) {
129     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
130       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
131       return;
132     }
133     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
134       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
135       return;
136     }
137
138     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
139     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
140
141     return (withoutAccents($noms[0]).' '.withoutAccents($prenoms[0]));
142   }
143
144  /**
145   * Generation des valeurs de l'attribut eduPersonOrgUnitDN à partir des
146   * valeurs de l'attribut supannEntiteAffectation.
147   * 
148   * @author Benjamin Renard <brenard@easter-eggs.com>
149   *
150   * @param[in] $ldapObject L'objet ldap
151   *
152   * @retval array Les valeurs de l'attribut eduPersonOrgUnitDN ou false
153   *               si il y a un problème durant la génération
154   */ 
155   function generate_eduPersonOrgUnitDN($ldapObject) {
156     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectation' ]) != 'LSattribute' ) {
157       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectation', 'attr' => 'eduPersonOrgUnitDN'));
158       return;
159     }
160
161     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectation' ] -> getUpdateData();
162
163     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
164     if ($basedn=="") {
165       LSerror :: addErrorCode('SUPANN_02','eduPersonOrgUnitDN');
166       return;
167     }
168
169     $retval=array();
170     foreach ($affectations as $aff) {
171       $retval[]="supannCodeEntite=".$aff.",$basedn";
172     }
173
174     return $retval;
175   }
176
177  /**
178   * Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN 
179   * à partir de la valeur de l'attribut supannEntiteAffectationPrincipale.
180   * 
181   * @author Benjamin Renard <brenard@easter-eggs.com>
182   *
183   * @param[in] $ldapObject L'objet ldap
184   *
185   * @retval array La valeur de l'attribut eduPersonPrimaryOrgUnitDN
186   *               ou false si il y a un problème durant la génération
187   */ 
188   function generate_eduPersonPrimaryOrgUnitDN($ldapObject) {
189     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ]) != 'LSattribute' ) {
190       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectationPrincipale', 'attr' => 'eduPersonPrimaryOrgUnitDN'));
191       return;
192     }
193
194     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ] -> getUpdateData();
195
196     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
197     if ($basedn=="") {
198       LSerror :: addErrorCode('SUPANN_02','eduPersonPrimaryOrgUnitDN');
199       return;
200     }
201
202     $retval=array();
203     foreach ($affectations as $aff) {
204       $retval[]="supannCodeEntite=".$aff.",$basedn";
205     }
206
207     return $retval;
208   }
209
210  /**
211   * Generation de la valeur de l'attribut eduPersonOrgDN 
212   * à partir de la valeur de l'attribut supannEtablissement.
213   *
214   * La valeur sera LS_SUPANN_ETABLISSEMENT_DN si l'attribut supannEtablissement
215   * vaut {UAI}LS_SUPANN_ETABLISSEMENT_UAI.
216   * 
217   * @author Benjamin Renard <brenard@easter-eggs.com>
218   *
219   * @param[in] $ldapObject L'objet ldap
220   *
221   * @retval array La valeur de l'attribut eduPersonOrgDN ou false
222   *               si il y a un problème durant la génération
223   */ 
224   function generate_eduPersonOrgDN($ldapObject) {
225     if ( get_class($ldapObject -> attrs[ 'supannEtablissement' ]) != 'LSattribute' ) {
226       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEtablissement', 'attr' => 'eduPersonOrgDN'));
227       return;
228     }
229
230     $eta = $ldapObject -> attrs[ 'supannEtablissement' ] -> getUpdateData();
231
232     $retval=array();
233     if ($eta[0] == '{UAI}'.LS_SUPANN_ETABLISSEMENT_UAI) {
234         $retval[] = LS_SUPANN_ETABLISSEMENT_DN;
235     }
236
237     return $retval;
238   }
239
240  /**
241   * Parse une valeur composite SUPANN
242   *
243   * Exemple de valeur :
244   *
245   *    [key1=value][key2=value][key3=value]
246   *
247   * @author Benjamin Renard <brenard@easter-eggs.com>
248   *
249   * @param[in] $val La valeur composite
250   *
251   * @retval array Un tableau contenant key->value ou false en cas d'erreur
252   **/
253   function supannParseCompositeValue($val) {
254     if (preg_match_all('/\[([^=]*)=([^\]]*)\]/',$val,$matches)) {
255       $parseValue=array();
256       for($i=0;$i<count($matches[0]);$i++) {
257         $parseValue[$matches[1][$i]]=$matches[2][$i];
258       }
259       return $parseValue;
260     }
261     return;
262   }
263
264  /**
265   * Retourne une eventuelle fonction de traduction d'une valeur
266   * en fonction de son label et de sa cle.
267   *
268   * Utilise la table $GLOBALS['supannTranslateFunctionDirectory']
269   *
270   * @param[in] $label Le label de la valeur
271   * @param[in] $key La cle de la valeur
272   *
273   * @retval string|false Le nom de la fonction de traduction ou false
274   **/
275   function supannTranslateRoleEntiteFunction($label,$key) {
276     if (isset($GLOBALS['supannTranslateFunctionDirectory'][$label][$key])) {
277       return $GLOBALS['supannTranslateFunctionDirectory'][$label][$key];
278     }
279     return;
280   }
281
282
283  /**
284   * Retourne le nom court d'une entite en fonction de son identifiant
285   *
286   * Fonction utilise comme fonction de traduction dans la fonction 
287   * supannTranslateRoleEntiteValue()
288   *
289   * @param[in] $label Le label de la valeur
290   * @param[in] $key La cle de la valeur
291   * @param[in] $value La valeur : l'identifiant de l'entite (supannCodeEntite)
292   *
293   * @retval string Le nom de l'entite
294   **/
295   function supanGetEntiteNameById($label,$key,$value) {
296     if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
297       $type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
298       $e = new $type();
299       $list=$e -> listObjectsName("(supannCodeEntite=$value)",NULL,array(),LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME);
300       if (count($list)==1) {
301         return array(
302           'translated' => array_pop($list),
303           'label' => $label
304         );
305       }
306     }
307     return array(
308       'translated' => getFData(__("%{value} (unrecognized value)"),$value),
309       'label' => $label
310     );
311   }
312
313  /**
314   * Parse une valeur a etiquette SUPANN
315   *
316   * Exemple de valeur :
317   *
318   *    {SUPANN}S410
319   *
320   * @param[in] $val La valeur
321   *
322   * @retval array Un tableau cle->valeur contenant label et value ou False
323   **/
324   function supannParseLabeledValue($value) {
325     if (preg_match('/^\{([^\}]*)\}(.*)$/',$value,$m)) {
326       return array(
327         'label'=>$m[1],
328         'value'=>$m[2]
329       );
330     }
331     return;
332   }
333
334  /**
335   * Traduit une valeur en fonction de sa cle extrait d'un attribut
336   * supannRoleEntite.
337   *
338   * @param[in] $key La cle
339   * @param[in] $value La valeur
340   *
341   * @retval array Un tableau cle->valeur contenant label et translated ou False
342   **/
343   function supannTranslateRoleEntiteValue($key,$value) {
344     $label='no';
345     $pl=supannParseLabeledValue($value);
346     if ($pl) {
347       $label=$pl['label'];
348       $value=$pl['value'];
349     }
350
351     // Translate by method
352     if (supannTranslateRoleEntiteFunction($label,$key)) {
353       $func = supannTranslateRoleEntiteFunction($label,$key);
354       if (function_exists($func)) {
355         try {
356           return $func($label,$key,$value);
357         }
358         catch (Exception $e) {
359           return;
360         }
361       }
362       else {
363         return;
364       }
365     }
366     // Translate by directory
367     elseif (isset($GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value])) {
368       return array(
369         'translated' => $GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value],
370         'label' => $label
371      );
372     }
373     else {
374       return array(
375         'label' => $label,
376         'translated' => $value
377       );
378     }
379   }
380
381  /**
382   * Traduit une valeur en fonction de sa cle extrait d'un attribut
383   * supannEtablissement
384   *
385   * @param[in] $key La cle
386   * @param[in] $value La valeur
387   *
388   * @retval array Un tableau cle->valeur contenant label et translated
389   **/
390   function supannTranslateEtablissement($value) {
391     $label='no';
392     $pl=supannParseLabeledValue($value);
393     if ($pl) {
394       $label=$pl['label'];
395       $value=$pl['value'];
396     }
397
398     if (isset($GLOBALS['supannTranslateEtablissementDirectory'][$label][$value])) {
399       return array(
400         'translated' => $GLOBALS['supannTranslateEtablissementDirectory'][$label][$value],
401         'label' => $label
402      );
403     }
404     else {
405       return array(
406         'label' => $label,
407         'translated' => $value
408       );
409     }
410   }
411
412
413 ?>