LSattribute :: generateValue() : Fixed bug when generated value is an array.
[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($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=$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 getFieldInFormat($format) {
168   $fields=array();
169   $expr="%{([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?}";
170   while (ereg($expr,$format,$ch)) {
171     $fields[]=$ch[1];
172     $format=ereg_replace($ch[0],'',$format);
173   }
174   return $fields;
175 }
176
177 function loadDir($dir,$regexpr='^.*\.php$') {
178   if ($handle = opendir($dir)) {
179     while (false !== ($file = readdir($handle))) {
180       if (ereg($regexpr,$file)) {
181         require_once($dir.'/'.$file);
182       }
183     }
184   }
185   else {
186     die(_('Folder not found').' : '.$dir);
187   }
188   return true;
189 }
190
191
192 function valid($obj) {
193   LSdebug('function valid() : ok');
194   return true;
195 }
196
197 function validPas($obj=null) {
198   LSdebug('function valid() : nok');
199   return false;
200 }
201
202 function return_data($data) {
203   return $data;
204 }
205
206 function varDump($data) {
207   ob_start();
208   var_dump($data);
209   $data=ob_get_contents(); 
210   ob_end_clean();
211   return $data;
212 }
213
214 $GLOBALS['LSdebug_fields']=array();
215 function LSdebug($data,$dump=false) {
216   if ($dump) {
217     $GLOBALS['LSdebug_fields'][]=varDump($data);
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,$ul=true) {
231   if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
232     if ($ul) $txt='<ul>'; else $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     if ($ul) $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
469  /**
470   * Supprime les accents d'une chaine
471   * 
472   * @param[in] $string La chaine originale
473   * 
474   * @retval string La chaine sans les accents
475   */
476   function withoutAccents($string){
477     $replaceAccent = Array(
478       "à" => "a",
479       "á" => "a",
480       "â" => "a",
481       "ã" => "a",
482       "ä" => "a",
483       "ç" => "c",
484       "è" => "e",
485       "é" => "e",
486       "ê" => "e",
487       "ë" => "e",
488       "ì" => "i",
489       "í" => "i",
490       "î" => "i",
491       "ï" => "i",
492       "ñ" => "n",
493       "ò" => "o",
494       "ó" => "o",
495       "ô" => "o",
496       "õ" => "o",
497       "ö" => "o",
498       "ù" => "u",
499       "ú" => "u",
500       "û" => "u",
501       "ü" => "u",
502       "ý" => "y",
503       "ÿ" => "y",
504       "À" => "A",
505       "Á" => "A",
506       "Â" => "A",
507       "Ã" => "A",
508       "Ä" => "A",
509       "Ç" => "C",
510       "È" => "E",
511       "É" => "E",
512       "Ê" => "E",
513       "Ë" => "E",
514       "Ì" => "I",
515       "Í" => "I",
516       "Î" => "I",
517       "Ï" => "I",
518       "Ñ" => "N",
519       "Ò" => "O",
520       "Ó" => "O",
521       "Ô" => "O",
522       "Õ" => "O",
523       "Ö" => "O",
524       "Ù" => "U",
525       "Ú" => "U",
526       "Û" => "U",
527       "Ü" => "U",
528       "Ý" => "Y"
529     );
530     return strtr($string, $replaceAccent);
531   }
532
533 ?>