Added listFiles() function
[ldapsaisie.git] / public_html / 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           $val=_getFData_extractAndModify($val,$ch);
58           $format[$i]=ereg_replace($ch[0],$val,$format[$i]);
59         }
60       }
61       else {
62         while (ereg($expr,$format[$i],$ch)) {
63           if (method_exists($data[$ch[1]],$meth)) {
64             $value = $data[$ch[1]] -> $meth();
65             if (is_array($value)) {
66               $value = $value[0];
67             }
68             $value=_getFData_extractAndModify($value,$ch);
69             $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
70           }
71           else {
72             LSerror :: addErrorCode('fct_getFData_01',array('meth' => $meth,'obj' => $ch[1]));
73             break;
74           }
75         }
76       }
77     }
78     elseif (is_object($data)) {
79       if ($meth==NULL) {
80         while (ereg($expr,$format[$i],$ch)) {
81           $value = $data -> $ch[1];
82           if (is_array($value)) {
83             $value = $value[0];
84           }
85           $value=_getFData_extractAndModify($value,$ch);
86           $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
87         }
88       }
89       else {
90         while (ereg($expr,$format[$i],$ch)) {
91           if (method_exists($data,$meth)) {
92             $value = $data -> $meth($ch[1]);
93             if (is_array($value)) {
94               $value = $value[0];
95             }
96             $value=_getFData_extractAndModify($value,$ch);
97             $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
98           }
99           else {
100             LSerror :: addErrorCode(0,getFData(_("Function 'getFData' : The method %{meth} of the object %{obj} doesn't exist."),array('meth' => $meth,'obj' => get_class($data))));
101             break;
102           }
103         }
104       }
105     }
106     else {
107       while (ereg($expr,$format[$i],$ch)) {
108         $val=_getFData_extractAndModify($data,$ch);
109         $format[$i]=ereg_replace($ch[0],$val,$format[$i]);
110       }
111     }
112   }
113   if($unique) {
114     return $format[0];
115   }
116   return $format;
117 }
118
119 function _getFData_extractAndModify($data,$ch) {
120   if($ch[3]) {
121     if ($ch[5]) {
122       if ($ch[6]) {
123         if ($ch[3]<0) {
124           $s=strlen((string)$data)-(-1*$ch[3])-$ch[5];
125           $l=$ch[5];
126         }
127         else {
128           $s=$ch[3]-$ch[5];
129           $l=$ch[5];
130           if ($s<0) {
131             $l=$l-(-1*$s);
132             $s=0;
133           }
134         }
135       }
136       else {
137         $s=$ch[3];
138         $l=$ch[5];
139       }
140     }
141     else {
142       $s=0;
143       $l=$ch[3];
144     }
145     $val=substr((string)$data,$s,$l);
146   }
147   else {
148     $val=(string)$data;
149   }
150
151   # Without Accent
152   if ($ch[8]) {
153     $val = withoutAccents($val);
154   }
155  
156   # Upper / Lower case
157   if ($ch[7]=="!") {
158     $val=strtoupper($val);
159   }
160   elseif ($ch[7]=='_') {
161     $val=strtolower($val);
162   }
163
164   return $val;
165 }
166
167 function smarty_getFData($params) {
168     extract($params);
169     echo getFData($format,$data,$meth=NULL);
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 function varDump($data) {
212   ob_start();
213   var_dump($data);
214   $data=ob_get_contents(); 
215   ob_end_clean();
216   return $data;
217 }
218
219 $GLOBALS['LSdebug_fields']=array();
220 function LSdebug($data,$dump=false) {
221   if ($dump) {
222     $GLOBALS['LSdebug_fields'][]=varDump($data);
223   }
224   else {
225     if (is_array($data)||is_object($data)) {
226       $GLOBALS['LSdebug_fields'][]=$data;
227     }
228     else {
229       $GLOBALS['LSdebug_fields'][]="[$data]";
230     }
231   }
232   return true;
233 }
234
235 function LSdebug_print($return=false,$ul=true) {
236   if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
237     if ($ul) $txt='<ul>'; else $txt="";
238     foreach($GLOBALS['LSdebug_fields'] as $debug) {
239       if (is_array($debug)||is_object($debug)) {
240         $txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
241       }
242       else {
243         $txt.='<li><pre>'.$debug.'</pre></li>';
244       }
245     }
246     if ($ul) $txt.='</ul>';
247     $GLOBALS['Smarty'] -> assign('LSdebug',$txt);
248     if ($return) {
249       return $txt;
250     }
251   }
252   return;
253 }
254
255 function LSdebugDefined() {
256   if (!LSdebug)
257     return;
258   return (!empty($GLOBALS['LSdebug_fields']));
259 }
260
261   /**
262    * Vérifie la compatibilite des DN
263    *
264    * Vérifie que les DNs sont dans la même branche de l'annuaire.
265    *
266    * @param[in] $dn Un premier DN.
267    * @param[in] $dn Un deuxième DN.
268    *
269    * @author Benjamin Renard <brenard@easter-eggs.com>
270    *
271    * @retval boolean true si les DN sont compatibles, false sinon.
272    */ 
273   function isCompatibleDNs($dn1,$dn2) {
274     $infos1=ldap_explode_dn($dn1,0);
275     if(!$infos1)
276       return;
277     $infos2=ldap_explode_dn($dn2,0);
278     if(!$infos2)
279       return;
280     if($infos2['count']>$infos1['count']) {
281       $tmp=$infos1;
282       $infos1=$infos2;
283       $infos2=$tmp;
284     }
285     $infos1=array_reverse($infos1);
286     $infos2=array_reverse($infos2);
287     
288     for($i=0;$i<$infos1['count'];$i++) {
289       if (!isset($infos2[$i])) continue;
290       if($infos1[$i]==$infos2[$i]) continue;
291       return false;
292     }
293     return true;
294   }
295
296   /**
297    * Fait la somme de DN
298    *
299    * Retourne un DN qui correspond au point de séparation des DN si les DN 
300    * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon.
301    *
302    * @param[in] $dn Un premier DN.
303    * @param[in] $dn Un deuxième DN.
304    *
305    * @author Benjamin Renard <brenard@easter-eggs.com>
306    *
307    * @retval string Un DN (ou false si les DN ne sont pas valide)
308    */ 
309   function sumDn($dn1,$dn2) {
310     $infos1=ldap_explode_dn($dn1,0);
311     if(!$infos1)
312       return;
313     $infos2=ldap_explode_dn($dn2,0);
314     if(!$infos2)
315       return;
316     if($infos2['count']>$infos1['count']) {
317       $tmp=$infos1;
318       $infos1=$infos2;
319       $infos2=$tmp;
320     }
321     $infos1=array_reverse($infos1);
322     $infos2=array_reverse($infos2);
323     
324     $first=true;
325     $basedn='';
326     for($i=0;$i<$infos1['count'];$i++) {
327       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) {
328         if($first) {
329           $basedn=$infos1[$i];
330           $first=false;
331         }
332         else
333           $basedn=$infos1[$i].','.$basedn;
334       }
335       else {
336         return $basedn;
337       }
338     }
339     return $basedn;
340   }
341   
342   function checkEmail($value,$domain=NULL,$checkDns=true) {
343     $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\-]+))$/';
344
345     if (!preg_match($regex, $value)) {
346       LSdebug('checkEmail : regex fail');
347       return false;
348     }
349
350     $nd = explode('@', $value);
351     $nd=$nd[1];
352     
353     if ($domain) {
354       if(is_array($domain)) {
355         if (!in_array($nd,$domain)) {
356           return false;
357         }
358       }
359       else {
360         if($nd!=$domain) {
361           return false;
362         }
363       }
364     }
365
366     if ($checkDns && function_exists('checkdnsrr')) {
367       if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
368         LSdebug('checkEmail : DNS fail');
369         return false;
370       }
371     }
372
373     return true;
374   }
375   
376   function generatePassword($chars=NULL,$lenght=NULL) {
377     if (!$lenght) {
378         $lenght=8;
379     }
380     if (is_array($chars)) {
381       $retval='';
382       foreach($chars as $chs) {
383         if (!is_array($chs)) {
384           $chs=array('chars' => $chs);
385         }
386         if (!is_int($chs['nb'])) {
387           $chs['nb']=1;
388         }
389         $retval.=aleaChar($chs['chars'],$chs['nb']);
390       }
391       $add = ($lenght-strlen($retval));
392       if ($add > 0) {
393         $retval .= aleaChar($chars,$add);
394       }
395       return str_shuffle($retval);
396     } else {
397       return aleaChar($chars,$lenght);
398     }
399   }
400   
401   function aleaChar($chars=NULL,$lenght=1) {
402     if (is_array($chars)) {
403       $nchars="";
404       foreach($chars as $chs) {
405         if (is_string($chs)) {
406           $nchars.=$chs;
407         }
408         else if (is_string($chs['chars'])) {
409           $nchars.=$chs['chars'];
410         }
411       }
412       if(strlen($chars)>0) {
413         $chars=$nchars;
414       }
415       else {
416         $chars=NULL;
417       }
418     }
419     if (!$chars) {
420       $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';    
421     }
422     $nbChars=strlen($chars);
423     $retval="";
424     if(is_int($lenght)) {
425       for ($i=0;$i<$lenght;$i++) {
426         $retval.=$chars[rand(0,$nbChars-1)];
427       }
428     }
429     return $retval;
430   }
431   
432   function compareDn($a,$b) {
433     if (substr_count($a,',') > substr_count($b,','))
434       return -1;
435     else 
436       return 1;
437   }
438   
439   function LSlog($msg,$dump=false) {
440     if ($GLOBALS['LSlog']['enable']) {
441       global $LSlogFile;
442       if (!$LSlogFile) {
443         $LSlogFile=fopen($GLOBALS['LSlog']['filename'],'a');
444       }
445       if ($dump) {
446         $msg=varDump($msg);
447       }
448       else if (is_array($msg)||is_object($msg)) {
449         $msg = print_r($msg,true);
450       }
451       fwrite($LSlogFile,$_SERVER['REQUEST_URI']." : ".$msg."\n");
452     }
453   }
454   
455   function __($msg) {
456     if (isset($GLOBALS['LSlang'][$msg])) {
457       return $GLOBALS['LSlang'][$msg];
458     }
459     return _($msg);
460   }
461   
462   function tr($msg,$key=null) {
463     if (is_array($msg)) {
464       echo __($msg[$key]);
465     }
466     else {
467       $val = $GLOBALS['Smarty']->get_template_vars($msg);
468       if (!$val)
469         $val=$msg;
470       if (is_array($val)) {
471         echo __($val[$key]);
472       }
473       else {
474         echo __($val);
475       }
476     }
477   }
478
479  /**
480   * Supprime les accents d'une chaine
481   * 
482   * @param[in] $string La chaine originale
483   * 
484   * @retval string La chaine sans les accents
485   */
486   function withoutAccents($string){
487     $replaceAccent = Array(
488       "à" => "a",
489       "á" => "a",
490       "â" => "a",
491       "ã" => "a",
492       "ä" => "a",
493       "ç" => "c",
494       "è" => "e",
495       "é" => "e",
496       "ê" => "e",
497       "ë" => "e",
498       "ì" => "i",
499       "í" => "i",
500       "î" => "i",
501       "ï" => "i",
502       "ñ" => "n",
503       "ò" => "o",
504       "ó" => "o",
505       "ô" => "o",
506       "õ" => "o",
507       "ö" => "o",
508       "ù" => "u",
509       "ú" => "u",
510       "û" => "u",
511       "ü" => "u",
512       "ý" => "y",
513       "ÿ" => "y",
514       "À" => "A",
515       "Á" => "A",
516       "Â" => "A",
517       "Ã" => "A",
518       "Ä" => "A",
519       "Ç" => "C",
520       "È" => "E",
521       "É" => "E",
522       "Ê" => "E",
523       "Ë" => "E",
524       "Ì" => "I",
525       "Í" => "I",
526       "Î" => "I",
527       "Ï" => "I",
528       "Ñ" => "N",
529       "Ò" => "O",
530       "Ó" => "O",
531       "Ô" => "O",
532       "Õ" => "O",
533       "Ö" => "O",
534       "Ù" => "U",
535       "Ú" => "U",
536       "Û" => "U",
537       "Ü" => "U",
538       "Ý" => "Y"
539     );
540     return strtr($string, $replaceAccent);
541   }
542
543
544  /**
545   * Supprime les espaces d'une chaine en les remplacant par un motif ou non
546   *
547   * @param[in] $str La chaine originale
548   * @param[in] $to Le motif de remplacement. S'il n'est pas spécifié, les espaces seront simplement supprimés
549   *
550   * @retval string La chaine sans les espaces
551   **/
552   function replaceSpaces($str,$to='') {
553     return strtr($str,array (
554                ' ' => $to,
555                "\t" => $to
556              )
557            );
558   }
559
560  /**
561   * List files in a directory corresponding to a regex
562   *
563   * @param[in] $dir The path of the directory
564   * @param[in] $regex The regex apply on filename
565   * 
566   * @retval array() List of file name
567   **/
568   function listFiles($dir,$regex) {
569     $retval=array();
570     if (is_dir($dir)) {
571       $d = dir($dir);
572       while (false !== ($file = $d->read())) {
573         if (is_file("$dir/$file")) {
574           if (preg_match($regex,$file)) {
575             $retval[]=$file;
576           }
577         }
578       }
579     }
580     return $retval;
581   }
582
583 ?>