LSsession / Smarty : Added getFData() smarty 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 $ul="";
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(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i])))
290         continue;
291       else
292         return false;
293     }
294     return true;
295   }
296
297   /**
298    * Fait la somme de DN
299    *
300    * Retourne un DN qui correspond au point de séparation des DN si les DN 
301    * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon.
302    *
303    * @param[in] $dn Un premier DN.
304    * @param[in] $dn Un deuxième DN.
305    *
306    * @author Benjamin Renard <brenard@easter-eggs.com>
307    *
308    * @retval string Un DN (ou false si les DN ne sont pas valide)
309    */ 
310   function sumDn($dn1,$dn2) {
311     $infos1=ldap_explode_dn($dn1,0);
312     if(!$infos1)
313       return;
314     $infos2=ldap_explode_dn($dn2,0);
315     if(!$infos2)
316       return;
317     if($infos2['count']>$infos1['count']) {
318       $tmp=$infos1;
319       $infos1=$infos2;
320       $infos2=$tmp;
321     }
322     $infos1=array_reverse($infos1);
323     $infos2=array_reverse($infos2);
324     
325     $first=true;
326     $basedn='';
327     for($i=0;$i<$infos1['count'];$i++) {
328       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) {
329         if($first) {
330           $basedn=$infos1[$i];
331           $first=false;
332         }
333         else
334           $basedn=$infos1[$i].','.$basedn;
335       }
336       else {
337         return $basedn;
338       }
339     }
340     return $basedn;
341   }
342   
343   function checkEmail($value,$domain=NULL,$checkDns=true) {
344     $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\-]+))$/';
345
346     if (!preg_match($regex, $value)) {
347       LSdebug('checkEmail : regex fail');
348       return false;
349     }
350
351     $nd = explode('@', $value);
352     $nd=$nd[1];
353     
354     if ($domain) {
355       if(is_array($domain)) {
356         if (!in_array($nd,$domain)) {
357           return false;
358         }
359       }
360       else {
361         if($nd!=$domain) {
362           return false;
363         }
364       }
365     }
366
367     if ($checkDns && function_exists('checkdnsrr')) {
368       if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
369         LSdebug('checkEmail : DNS fail');
370         return false;
371       }
372     }
373
374     return true;
375   }
376   
377   function generatePassword($chars=NULL,$lenght=NULL) {
378     if (!$lenght) {
379         $lenght=8;
380     }
381     if (is_array($chars)) {
382       $retval='';
383       foreach($chars as $chs) {
384         if (!is_array($chs)) {
385           $chs=array('chars' => $chs);
386         }
387         if (!is_int($chs['nb'])) {
388           $chs['nb']=1;
389         }
390         $retval.=aleaChar($chs['chars'],$chs['nb']);
391       }
392       $add = ($lenght-strlen($retval));
393       if ($add > 0) {
394         $retval .= aleaChar($chars,$add);
395       }
396       return str_shuffle($retval);
397     } else {
398       return aleaChar($chars,$lenght);
399     }
400   }
401   
402   function aleaChar($chars=NULL,$lenght=1) {
403     if (is_array($chars)) {
404       $nchars="";
405       foreach($chars as $chs) {
406         if (is_string($chs)) {
407           $nchars.=$chs;
408         }
409         else if (is_string($chs['chars'])) {
410           $nchars.=$chs['chars'];
411         }
412       }
413       if(strlen($chars)>0) {
414         $chars=$nchars;
415       }
416       else {
417         $chars=NULL;
418       }
419     }
420     if (!$chars) {
421       $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';    
422     }
423     $nbChars=strlen($chars);
424     $retval="";
425     if(is_int($lenght)) {
426       for ($i=0;$i<$lenght;$i++) {
427         $retval.=$chars[rand(0,$nbChars-1)];
428       }
429     }
430     return $retval;
431   }
432   
433   function compareDn($a,$b) {
434     if (substr_count($a,',') > substr_count($b,','))
435       return -1;
436     else 
437       return 1;
438   }
439   
440   function LSlog($msg) {
441     if ($GLOBALS['LSlog']['enable']) {
442       global $LSlogFile;
443       if (!$LSlogFile) {
444         $LSlogFile=fopen($GLOBALS['LSlog']['filename'],'a');
445       }
446       fwrite($LSlogFile,$_SERVER['REQUEST_URI']." : ".$msg."\n");
447     }
448   }
449   
450   function __($msg) {
451     if (isset($GLOBALS['LSlang'][$msg])) {
452       return $GLOBALS['LSlang'][$msg];
453     }
454     return _($msg);
455   }
456   
457   function tr($msg,$key=null) {
458     if (is_array($msg)) {
459       echo __($msg[$key]);
460     }
461     else {
462       $val = $GLOBALS['Smarty']->get_template_vars($msg);
463       if (!$val)
464         $val=$msg;
465       if (is_array($val)) {
466         echo __($val[$key]);
467       }
468       else {
469         echo __($val);
470       }
471     }
472   }
473
474  /**
475   * Supprime les accents d'une chaine
476   * 
477   * @param[in] $string La chaine originale
478   * 
479   * @retval string La chaine sans les accents
480   */
481   function withoutAccents($string){
482     $replaceAccent = Array(
483       "à" => "a",
484       "á" => "a",
485       "â" => "a",
486       "ã" => "a",
487       "ä" => "a",
488       "ç" => "c",
489       "è" => "e",
490       "é" => "e",
491       "ê" => "e",
492       "ë" => "e",
493       "ì" => "i",
494       "í" => "i",
495       "î" => "i",
496       "ï" => "i",
497       "ñ" => "n",
498       "ò" => "o",
499       "ó" => "o",
500       "ô" => "o",
501       "õ" => "o",
502       "ö" => "o",
503       "ù" => "u",
504       "ú" => "u",
505       "û" => "u",
506       "ü" => "u",
507       "ý" => "y",
508       "ÿ" => "y",
509       "À" => "A",
510       "Á" => "A",
511       "Â" => "A",
512       "Ã" => "A",
513       "Ä" => "A",
514       "Ç" => "C",
515       "È" => "E",
516       "É" => "E",
517       "Ê" => "E",
518       "Ë" => "E",
519       "Ì" => "I",
520       "Í" => "I",
521       "Î" => "I",
522       "Ï" => "I",
523       "Ñ" => "N",
524       "Ò" => "O",
525       "Ó" => "O",
526       "Ô" => "O",
527       "Õ" => "O",
528       "Ö" => "O",
529       "Ù" => "U",
530       "Ú" => "U",
531       "Û" => "U",
532       "Ü" => "U",
533       "Ý" => "Y"
534     );
535     return strtr($string, $replaceAccent);
536   }
537
538
539  /**
540   * Supprime les espaces d'une chaine en les remplacant par un motif ou non
541   *
542   * @param[in] $str La chaine originale
543   * @param[in] $to Le motif de remplacement. S'il n'est pas spécifié, les espaces seront simplement supprimés
544   *
545   * @retval string La chaine sans les espaces
546   **/
547   function replaceSpaces($str,$to='') {
548     return strtr($str,array (
549                ' ' => $to,
550                "\t" => $to
551              )
552            );
553   }
554
555 ?>