af34595a618f72c61d4f472b7d3906ba76117dd1
[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]=str_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]=str_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]=str_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]=str_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]=str_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=str_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     $data=varDump($data);
223   }
224   else if (!is_array($data) && !is_object($data)) {
225     $data="[$data]";
226   }
227   $GLOBALS['LSdebug_fields'][]=$data;
228   LSlog('[DEBUG] '.$data);
229   return true;
230 }
231
232 function LSdebug_print($return=false,$ul=true) {
233   if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
234     if ($ul) $txt='<ul>'; else $txt="";
235     foreach($GLOBALS['LSdebug_fields'] as $debug) {
236       if (is_array($debug)||is_object($debug)) {
237         $txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
238       }
239       else {
240         $txt.='<li><pre>'.$debug.'</pre></li>';
241       }
242     }
243     if ($ul) $txt.='</ul>';
244     $GLOBALS['Smarty'] -> assign('LSdebug',$txt);
245     if ($return) {
246       return $txt;
247     }
248   }
249   return;
250 }
251
252 function LSdebugDefined() {
253   if (!LSdebug)
254     return;
255   return (!empty($GLOBALS['LSdebug_fields']));
256 }
257
258   /**
259    * Vérifie la compatibilite des DN
260    *
261    * Vérifie que les DNs sont dans la même branche de l'annuaire.
262    *
263    * @param[in] $dn Un premier DN.
264    * @param[in] $dn Un deuxième DN.
265    *
266    * @author Benjamin Renard <brenard@easter-eggs.com>
267    *
268    * @retval boolean true si les DN sont compatibles, false sinon.
269    */ 
270   function isCompatibleDNs($dn1,$dn2) {
271     $infos1=ldap_explode_dn($dn1,0);
272     if(!$infos1)
273       return;
274     $infos2=ldap_explode_dn($dn2,0);
275     if(!$infos2)
276       return;
277     if($infos2['count']>$infos1['count']) {
278       $tmp=$infos1;
279       $infos1=$infos2;
280       $infos2=$tmp;
281     }
282     $infos1=array_reverse($infos1);
283     $infos2=array_reverse($infos2);
284     
285     for($i=0;$i<$infos1['count'];$i++) {
286       if (!isset($infos2[$i])) continue;
287       if($infos1[$i]==$infos2[$i]) continue;
288       return false;
289     }
290     return true;
291   }
292
293   /**
294    * Fait la somme de DN
295    *
296    * Retourne un DN qui correspond au point de séparation des DN si les DN 
297    * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon.
298    *
299    * @param[in] $dn Un premier DN.
300    * @param[in] $dn Un deuxième DN.
301    *
302    * @author Benjamin Renard <brenard@easter-eggs.com>
303    *
304    * @retval string Un DN (ou false si les DN ne sont pas valide)
305    */ 
306   function sumDn($dn1,$dn2) {
307     $infos1=ldap_explode_dn($dn1,0);
308     if(!$infos1)
309       return;
310     $infos2=ldap_explode_dn($dn2,0);
311     if(!$infos2)
312       return;
313     if($infos2['count']>$infos1['count']) {
314       $tmp=$infos1;
315       $infos1=$infos2;
316       $infos2=$tmp;
317     }
318     $infos1=array_reverse($infos1);
319     $infos2=array_reverse($infos2);
320     
321     $first=true;
322     $basedn='';
323     for($i=0;$i<$infos1['count'];$i++) {
324       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) {
325         if($first) {
326           $basedn=$infos1[$i];
327           $first=false;
328         }
329         else
330           $basedn=$infos1[$i].','.$basedn;
331       }
332       else {
333         return $basedn;
334       }
335     }
336     return $basedn;
337   }
338   
339   function checkEmail($value,$domain=NULL,$checkDns=true) {
340     $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\-]+))$/';
341
342     if (!preg_match($regex, $value)) {
343       LSdebug('checkEmail : regex fail');
344       return false;
345     }
346
347     $nd = explode('@', $value);
348     $nd=$nd[1];
349     
350     if ($domain) {
351       if(is_array($domain)) {
352         if (!in_array($nd,$domain)) {
353           return false;
354         }
355       }
356       else {
357         if($nd!=$domain) {
358           return false;
359         }
360       }
361     }
362
363     if ($checkDns && function_exists('checkdnsrr')) {
364       if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
365         LSdebug('checkEmail : DNS fail');
366         return false;
367       }
368     }
369
370     return true;
371   }
372   
373   function generatePassword($chars=NULL,$lenght=NULL) {
374     if (!$lenght) {
375         $lenght=8;
376     }
377     if (is_array($chars)) {
378       $retval='';
379       foreach($chars as $chs) {
380         if (!is_array($chs)) {
381           $chs=array('chars' => $chs);
382         }
383         if (!is_int($chs['nb'])) {
384           $chs['nb']=1;
385         }
386         $retval.=aleaChar($chs['chars'],$chs['nb']);
387       }
388       $add = ($lenght-strlen($retval));
389       if ($add > 0) {
390         $retval .= aleaChar($chars,$add);
391       }
392       return str_shuffle($retval);
393     } else {
394       return aleaChar($chars,$lenght);
395     }
396   }
397   
398   function aleaChar($chars=NULL,$lenght=1) {
399     if (is_array($chars)) {
400       $nchars="";
401       foreach($chars as $chs) {
402         if (is_string($chs)) {
403           $nchars.=$chs;
404         }
405         else if (is_string($chs['chars'])) {
406           $nchars.=$chs['chars'];
407         }
408       }
409       if(is_string($chars) && strlen($chars)>0) {
410         $chars=$nchars;
411       }
412       else {
413         $chars=NULL;
414       }
415     }
416     if (!$chars) {
417       $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';    
418     }
419     $nbChars=strlen($chars);
420     $retval="";
421     if(is_int($lenght)) {
422       for ($i=0;$i<$lenght;$i++) {
423         $retval.=$chars[rand(0,$nbChars-1)];
424       }
425     }
426     return $retval;
427   }
428   
429   function compareDn($a,$b) {
430     if (substr_count($a,',') > substr_count($b,','))
431       return -1;
432     else 
433       return 1;
434   }
435   
436   function LSlog($msg,$dump=false) {
437     if ($GLOBALS['LSlog']['enable']) {
438       global $LSlogFile;
439       if (!$LSlogFile) {
440         $LSlogFile=fopen($GLOBALS['LSlog']['filename'],'a');
441       }
442       if ($dump) {
443         $msg=varDump($msg);
444       }
445       else if (is_array($msg)||is_object($msg)) {
446         $msg = print_r($msg,true);
447       }
448       fwrite($LSlogFile,$_SERVER['REQUEST_URI']." : ".$msg."\n");
449     }
450   }
451   
452   function __($msg) {
453     if (isset($GLOBALS['LSlang'][$msg])) {
454       return $GLOBALS['LSlang'][$msg];
455     }
456     return _($msg);
457   }
458   
459   function tr($msg,$key=null) {
460     if (is_array($msg)) {
461       echo __($msg[$key]);
462     }
463     else {
464       $val = $GLOBALS['Smarty']->get_template_vars($msg);
465       if (!$val)
466         $val=$msg;
467       if (is_array($val)) {
468         echo __($val[$key]);
469       }
470       else {
471         echo __($val);
472       }
473     }
474   }
475
476  /**
477   * Supprime les accents d'une chaine
478   * 
479   * @param[in] $string La chaine originale
480   * 
481   * @retval string La chaine sans les accents
482   */
483   function withoutAccents($string){
484     $replaceAccent = Array(
485       "à" => "a",
486       "á" => "a",
487       "â" => "a",
488       "ã" => "a",
489       "ä" => "a",
490       "ç" => "c",
491       "è" => "e",
492       "é" => "e",
493       "ê" => "e",
494       "ë" => "e",
495       "ì" => "i",
496       "í" => "i",
497       "î" => "i",
498       "ï" => "i",
499       "ñ" => "n",
500       "ò" => "o",
501       "ó" => "o",
502       "ô" => "o",
503       "õ" => "o",
504       "ö" => "o",
505       "ù" => "u",
506       "ú" => "u",
507       "û" => "u",
508       "ü" => "u",
509       "ý" => "y",
510       "ÿ" => "y",
511       "À" => "A",
512       "Á" => "A",
513       "Â" => "A",
514       "Ã" => "A",
515       "Ä" => "A",
516       "Ç" => "C",
517       "È" => "E",
518       "É" => "E",
519       "Ê" => "E",
520       "Ë" => "E",
521       "Ì" => "I",
522       "Í" => "I",
523       "Î" => "I",
524       "Ï" => "I",
525       "Ñ" => "N",
526       "Ò" => "O",
527       "Ó" => "O",
528       "Ô" => "O",
529       "Õ" => "O",
530       "Ö" => "O",
531       "Ù" => "U",
532       "Ú" => "U",
533       "Û" => "U",
534       "Ü" => "U",
535       "Ý" => "Y"
536     );
537     return strtr($string, $replaceAccent);
538   }
539
540
541  /**
542   * Supprime les espaces d'une chaine en les remplacant par un motif ou non
543   *
544   * @param[in] $str La chaine originale
545   * @param[in] $to Le motif de remplacement. S'il n'est pas spécifié, les espaces seront simplement supprimés
546   *
547   * @retval string La chaine sans les espaces
548   **/
549   function replaceSpaces($str,$to='') {
550     return strtr($str,array (
551                ' ' => $to,
552                "\t" => $to
553              )
554            );
555   }
556
557  /**
558   * List files in a directory corresponding to a regex
559   *
560   * @param[in] $dir The path of the directory
561   * @param[in] $regex The regex apply on filename
562   * 
563   * @retval array() List of file name
564   **/
565   function listFiles($dir,$regex) {
566     $retval=array();
567     if (is_dir($dir)) {
568       $d = dir($dir);
569       while (false !== ($file = $d->read())) {
570         if (is_file("$dir/$file")) {
571           if (preg_match($regex,$file)) {
572             $retval[]=$file;
573           }
574         }
575       }
576     }
577     return $retval;
578   }
579
580 ?>