getFData() : Added new value access method
[ldapsaisie.git] / trunk / includes / functions.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  * Construction d'une chaine formatée
25  *
26  * Cette fonction retourne la valeur d'une chaine formatée selon le format
27  * et les données passés en paramètre.
28  *
29  * @author Benjamin Renard <brenard@easter-eggs.com>
30  *
31  * @param[in] $format string Format de la chaine
32  * @param[in] $data mixed Les données pour composés la chaine
33  *                    Ce paramètre peut être un tableau de string, une string,
34  *                    une tableau d'objet ou un objet.
35  * @param[in] $meth string Le nom de la methode de/des objet(s) à appeler pour
36  *                         obtenir la valeur de remplacement dans la chaine formatée.
37  * 
38  * @retval string La chaine formatée
39  */
40 function getFData($format,$data,$meth=NULL) {
41   $unique=false;
42   $expr="%{([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?}";
43   if(!is_array($format)) {
44     $format=array($format);
45     $unique=true;
46   }
47   for($i=0;$i<count($format);$i++) {
48     if(is_array($data)) {
49       if ($meth==NULL) {
50         while (ereg($expr,$format[$i],$ch)) {
51           if (is_array($data[$ch[1]])) {
52             $val = $data[$ch[1]][0];
53           }
54           else {
55             $val = $data[$ch[1]];
56           }
57           if($ch[3]) {
58             if ($ch[5]) {
59               $s=$ch[3];
60               $l=$ch[5];
61             }
62             else {
63               $s=0;
64               $l=$ch[3];
65             }
66             $val=substr((string)$val,$s,$l);
67           }
68           $format[$i]=ereg_replace($ch[0],$val,$format[$i]);
69         }
70       }
71       else {
72         while (ereg($expr,$format[$i],$ch)) {
73           if (method_exists($data[$ch[1]],$meth)) {
74             $value = $data[$ch[1]] -> $meth();
75             if (is_array($value)) {
76               $value = $value[0];
77             }
78             if($ch[3]) {
79               if ($ch[5]) {
80                 $s=$ch[3];
81                 $l=$ch[5];
82               }
83               else {
84                 $s=0;
85                 $l=$ch[3];
86               }
87               $value=substr((string)$value,$s,$l);
88             }
89             $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
90           }
91           else {
92             LSerror :: addErrorCode('fct_getFData_01',array('meth' => $meth,'obj' => $ch[1]));
93             break;
94           }
95         }
96       }
97     }
98     elseif (is_object($data)) {
99       if ($meth==NULL) {
100         while (ereg($expr,$format[$i],$ch)) {
101           $value = $data -> $ch[1];
102           if (is_array($value)) {
103             $value = $value[0];
104           }
105           if($ch[3]) {
106             if ($ch[5]) {
107               $s=$ch[3];
108               $l=$ch[5];
109             }
110             else {
111               $s=0;
112               $l=$ch[3];
113             }
114             $value=substr((string)$value,$s,$l);
115           }
116           $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
117         }
118       }
119       else {
120         while (ereg($expr,$format[$i],$ch)) {
121           if (method_exists($data,$meth)) {
122             $value = $data -> $meth($ch[1]);
123             if (is_array($value)) {
124               $value = $value[0];
125             }
126             if($ch[3]) {
127               if ($ch[5]) {
128                 $s=$ch[3];
129                 $l=$ch[5];
130               }
131               else {
132                 $s=0;
133                 $l=$ch[3];
134               }
135               $value=substr((string)$value,$s,$l);
136             }
137             $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
138           }
139           else {
140             LSerror :: addErrorCode(0,getFData(_("Function 'getFData' : The method %{meth} of the object %{obj} doesn't exist."),array('meth' => $meth,'obj' => get_class($data))));
141             break;
142           }
143         }
144       }
145     }
146     else {
147       while (ereg($expr,$format[$i],$ch)) {
148         if($ch[3]) {
149           if ($ch[5]) {
150             $s=$ch[3];
151             $l=$ch[5];
152           }
153           else {
154             $s=0;
155             $l=$ch[3];
156           }
157           $val=substr((string)$data,$s,$l);
158         }
159         else {
160           $val=$data;
161         }
162         $format[$i]=ereg_replace($ch[0],$val,$format[$i]);
163       }
164     }
165   }
166   if($unique) {
167     return $format[0];
168   }
169   return $format;
170 }
171
172 function getFieldInFormat($format) {
173   $fields=array();
174   $expr="%{([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?}";
175   while (ereg($expr,$format,$ch)) {
176     $fields[]=$ch[1];
177     $format=ereg_replace($ch[0],'',$format);
178   }
179   return $fields;
180 }
181
182 function loadDir($dir,$regexpr='^.*\.php$') {
183   if ($handle = opendir($dir)) {
184     while (false !== ($file = readdir($handle))) {
185       if (ereg($regexpr,$file)) {
186         require_once($dir.'/'.$file);
187       }
188     }
189   }
190   else {
191     die(_('Folder not found').' : '.$dir);
192   }
193   return true;
194 }
195
196
197 function valid($obj) {
198   LSdebug('function valid() : ok');
199   return true;
200 }
201
202 function validPas($obj=null) {
203   LSdebug('function valid() : nok');
204   return false;
205 }
206
207 function return_data($data) {
208   return $data;
209 }
210
211 $GLOBALS['LSdebug_fields']=array();
212 function LSdebug($data,$dump=false) {
213   if ($dump) {
214     ob_start();
215     var_dump($data);
216     $GLOBALS['LSdebug_fields'][]=ob_get_contents(); 
217     ob_end_clean();
218   }
219   else {
220     if (is_array($data)||is_object($data)) {
221       $GLOBALS['LSdebug_fields'][]=$data;
222     }
223     else {
224       $GLOBALS['LSdebug_fields'][]="[$data]";
225     }
226   }
227   return true;
228 }
229
230 function LSdebug_print($return=false) {
231   if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
232     $txt='<ul>';
233     foreach($GLOBALS['LSdebug_fields'] as $debug) {
234       if (is_array($debug)||is_object($debug)) {
235         $txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
236       }
237       else {
238         $txt.='<li><pre>'.$debug.'</pre></li>';
239       }
240     }
241     $txt.='</ul>';
242     $GLOBALS['Smarty'] -> assign('LSdebug',$txt);
243     if ($return) {
244       return $txt;
245     }
246   }
247   return;
248 }
249
250 function LSdebugDefined() {
251   if (!LSdebug)
252     return;
253   return (!empty($GLOBALS['LSdebug_fields']));
254 }
255
256   /**
257    * Vérifie la compatibilite des DN
258    *
259    * Vérifie que les DNs sont dans la même branche de l'annuaire.
260    *
261    * @param[in] $dn Un premier DN.
262    * @param[in] $dn Un deuxième DN.
263    *
264    * @author Benjamin Renard <brenard@easter-eggs.com>
265    *
266    * @retval boolean true si les DN sont compatibles, false sinon.
267    */ 
268   function isCompatibleDNs($dn1,$dn2) {
269     $infos1=ldap_explode_dn($dn1,0);
270     if(!$infos1)
271       return;
272     $infos2=ldap_explode_dn($dn2,0);
273     if(!$infos2)
274       return;
275     if($infos2['count']>$infos1['count']) {
276       $tmp=$infos1;
277       $infos1=$infos2;
278       $infos2=$tmp;
279     }
280     $infos1=array_reverse($infos1);
281     $infos2=array_reverse($infos2);
282     
283     for($i=0;$i<$infos1['count'];$i++) {
284       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i])))
285         continue;
286       else
287         return false;
288     }
289     return true;
290   }
291
292   /**
293    * Fait la somme de DN
294    *
295    * Retourne un DN qui correspond au point de séparation des DN si les DN 
296    * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon.
297    *
298    * @param[in] $dn Un premier DN.
299    * @param[in] $dn Un deuxième DN.
300    *
301    * @author Benjamin Renard <brenard@easter-eggs.com>
302    *
303    * @retval string Un DN (ou false si les DN ne sont pas valide)
304    */ 
305   function sumDn($dn1,$dn2) {
306     $infos1=ldap_explode_dn($dn1,0);
307     if(!$infos1)
308       return;
309     $infos2=ldap_explode_dn($dn2,0);
310     if(!$infos2)
311       return;
312     if($infos2['count']>$infos1['count']) {
313       $tmp=$infos1;
314       $infos1=$infos2;
315       $infos2=$tmp;
316     }
317     $infos1=array_reverse($infos1);
318     $infos2=array_reverse($infos2);
319     
320     $first=true;
321     $basedn='';
322     for($i=0;$i<$infos1['count'];$i++) {
323       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) {
324         if($first) {
325           $basedn=$infos1[$i];
326           $first=false;
327         }
328         else
329           $basedn=$infos1[$i].','.$basedn;
330       }
331       else {
332         return $basedn;
333       }
334     }
335     return $basedn;
336   }
337   
338   function checkEmail($value,$domain=NULL,$checkDns=true) {
339     $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';
340
341     if (!preg_match($regex, $value)) {
342       LSdebug('checkEmail : regex fail');
343       return false;
344     }
345
346     $nd = explode('@', $value);
347     $nd=$nd[1];
348     
349     if ($domain) {
350       if(is_array($domain)) {
351         if (!in_array($nd,$domain)) {
352           return false;
353         }
354       }
355       else {
356         if($nd!=$domain) {
357           return false;
358         }
359       }
360     }
361
362     if ($checkDns && function_exists('checkdnsrr')) {
363       if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
364         LSdebug('checkEmail : DNS fail');
365         return false;
366       }
367     }
368
369     return true;
370   }
371   
372   function generatePassword($chars=NULL,$lenght=NULL) {
373     if (!$lenght) {
374         $lenght=8;
375     }
376     if (is_array($chars)) {
377       $retval='';
378       foreach($chars as $chs) {
379         if (!is_array($chs)) {
380           $chs=array('chars' => $chs);
381         }
382         if (!is_int($chs['nb'])) {
383           $chs['nb']=1;
384         }
385         $retval.=aleaChar($chs['chars'],$chs['nb']);
386       }
387       $add = ($lenght-strlen($retval));
388       if ($add > 0) {
389         $retval .= aleaChar($chars,$add);
390       }
391       return str_shuffle($retval);
392     } else {
393       return aleaChar($chars,$lenght);
394     }
395   }
396   
397   function aleaChar($chars=NULL,$lenght=1) {
398     if (is_array($chars)) {
399       $nchars="";
400       foreach($chars as $chs) {
401         if (is_string($chs)) {
402           $nchars.=$chs;
403         }
404         else if (is_string($chs['chars'])) {
405           $nchars.=$chs['chars'];
406         }
407       }
408       if(strlen($chars)>0) {
409         $chars=$nchars;
410       }
411       else {
412         $chars=NULL;
413       }
414     }
415     if (!$chars) {
416       $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';    
417     }
418     $nbChars=strlen($chars);
419     $retval="";
420     if(is_int($lenght)) {
421       for ($i=0;$i<$lenght;$i++) {
422         $retval.=$chars[rand(0,$nbChars-1)];
423       }
424     }
425     return $retval;
426   }
427   
428   function compareDn($a,$b) {
429     if (substr_count($a,',') > substr_count($b,','))
430       return -1;
431     else 
432       return 1;
433   }
434   
435   function LSlog($msg) {
436     if ($GLOBALS['LSlog']['enable']) {
437       global $LSlogFile;
438       if (!$LSlogFile) {
439         $LSlogFile=fopen($GLOBALS['LSlog']['filename'],'a');
440       }
441       fwrite($LSlogFile,$_SERVER['REQUEST_URI']." : ".$msg."\n");
442     }
443   }
444   
445   function __($msg) {
446     if (isset($GLOBALS['LSlang'][$msg])) {
447       return $GLOBALS['LSlang'][$msg];
448     }
449     return _($msg);
450   }
451   
452   function tr($msg,$key=null) {
453     if (is_array($msg)) {
454       echo __($msg[$key]);
455     }
456     else {
457       $val = $GLOBALS['Smarty']->get_template_vars($msg);
458       if (!$val)
459         $val=$msg;
460       if (is_array($val)) {
461         echo __($val[$key]);
462       }
463       else {
464         echo __($val);
465       }
466     }
467   }
468 ?>