- Ajout d'un fichier core.php s'occupant des inclusions minimum pour le lancement...
[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     else {
99       if ($meth==NULL) {
100         while (ereg($expr,$format[$i],$ch)) {
101           if($ch[3]) {
102             if ($ch[5]) {
103               $s=$ch[3];
104               $l=$ch[5];
105             }
106             else {
107               $s=0;
108               $l=$ch[3];
109             }
110             $val=substr((string)$data,$s,$l);
111           }
112           else {
113             $val=$data;
114           }
115           $format[$i]=ereg_replace($ch[0],$val,$format[$i]);
116         }
117       }
118       else {
119         while (ereg($expr,$format[$i],$ch)) {
120           if (method_exists($data,$meth)) {
121             $value = $data -> $meth($ch[1]);
122             if (is_array($value)) {
123               $value = $value[0];
124             }
125             if($ch[3]) {
126               if ($ch[5]) {
127                 $s=$ch[3];
128                 $l=$ch[5];
129               }
130               else {
131                 $s=0;
132                 $l=$ch[3];
133               }
134               $value=substr((string)$value,$s,$l);
135             }
136             $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
137           }
138           else {
139             LSerror :: addErrorCode(0,getFData(_("Function 'getFData' : The method %{meth} of the object %{obj} doesn't exist."),array('meth' => $meth,'obj' => get_class($data))));
140             break;
141           }
142         }
143       }
144     }
145   }
146   if($unique) {
147     return $format[0];
148   }
149   return $format;
150 }
151
152 function getFieldInFormat($format) {
153   $fields=array();
154   $expr="%{([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?}";
155   while (ereg($expr,$format,$ch)) {
156     $fields[]=$ch[1];
157     $format=ereg_replace($ch[0],'',$format);
158   }
159   return $fields;
160 }
161
162 function loadDir($dir,$regexpr='^.*\.php$') {
163   if ($handle = opendir($dir)) {
164     while (false !== ($file = readdir($handle))) {
165       if (ereg($regexpr,$file)) {
166         require_once($dir.'/'.$file);
167       }
168     }
169   }
170   else {
171     die(_('Folder not found').' : '.$dir);
172   }
173   return true;
174 }
175
176
177 function valid($obj) {
178   LSdebug('function valid() : ok');
179   return true;
180 }
181
182 function validPas($obj=null) {
183   LSdebug('function valid() : nok');
184   return false;
185 }
186
187 function return_data($data) {
188   return $data;
189 }
190
191 $GLOBALS['LSdebug_fields']=array();
192 function LSdebug($data,$dump=false) {
193   if ($dump) {
194     ob_start();
195     var_dump($data);
196     $GLOBALS['LSdebug_fields'][]=ob_get_contents(); 
197     ob_end_clean();
198   }
199   else {
200     if (is_array($data)||is_object($data)) {
201       $GLOBALS['LSdebug_fields'][]=$data;
202     }
203     else {
204       $GLOBALS['LSdebug_fields'][]="[$data]";
205     }
206   }
207   return true;
208 }
209
210 function LSdebug_print($return=false) {
211   if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
212     $txt='<ul>';
213     foreach($GLOBALS['LSdebug_fields'] as $debug) {
214       if (is_array($debug)||is_object($debug)) {
215         $txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
216       }
217       else {
218         $txt.='<li>'.$debug.'</li>';
219       }
220     }
221     $txt.='</ul>';
222     $GLOBALS['Smarty'] -> assign('LSdebug',$txt);
223     if ($return) {
224       return $txt;
225     }
226   }
227   return;
228 }
229
230 function LSdebugDefined() {
231   if (!LSdebug)
232     return;
233   return (!empty($GLOBALS['LSdebug_fields']));
234 }
235
236   /**
237    * Vérifie la compatibilite des DN
238    *
239    * Vérifie que les DNs sont dans la même branche de l'annuaire.
240    *
241    * @param[in] $dn Un premier DN.
242    * @param[in] $dn Un deuxième DN.
243    *
244    * @author Benjamin Renard <brenard@easter-eggs.com>
245    *
246    * @retval boolean true si les DN sont compatibles, false sinon.
247    */ 
248   function isCompatibleDNs($dn1,$dn2) {
249     $infos1=ldap_explode_dn($dn1,0);
250     if(!$infos1)
251       return;
252     $infos2=ldap_explode_dn($dn2,0);
253     if(!$infos2)
254       return;
255     if($infos2['count']>$infos1['count']) {
256       $tmp=$infos1;
257       $infos1=$infos2;
258       $infos2=$tmp;
259     }
260     $infos1=array_reverse($infos1);
261     $infos2=array_reverse($infos2);
262     
263     for($i=0;$i<$infos1['count'];$i++) {
264       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i])))
265         continue;
266       else
267         return false;
268     }
269     return true;
270   }
271
272   /**
273    * Fait la somme de DN
274    *
275    * Retourne un DN qui correspond au point de séparation des DN si les DN 
276    * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon.
277    *
278    * @param[in] $dn Un premier DN.
279    * @param[in] $dn Un deuxième DN.
280    *
281    * @author Benjamin Renard <brenard@easter-eggs.com>
282    *
283    * @retval string Un DN (ou false si les DN ne sont pas valide)
284    */ 
285   function sumDn($dn1,$dn2) {
286     $infos1=ldap_explode_dn($dn1,0);
287     if(!$infos1)
288       return;
289     $infos2=ldap_explode_dn($dn2,0);
290     if(!$infos2)
291       return;
292     if($infos2['count']>$infos1['count']) {
293       $tmp=$infos1;
294       $infos1=$infos2;
295       $infos2=$tmp;
296     }
297     $infos1=array_reverse($infos1);
298     $infos2=array_reverse($infos2);
299     
300     $first=true;
301     $basedn='';
302     for($i=0;$i<$infos1['count'];$i++) {
303       if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) {
304         if($first) {
305           $basedn=$infos1[$i];
306           $first=false;
307         }
308         else
309           $basedn=$infos1[$i].','.$basedn;
310       }
311       else {
312         return $basedn;
313       }
314     }
315     return $basedn;
316   }
317   
318   function checkEmail($value,$domain=NULL,$checkDns=true) {
319     $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\-]+))$/';
320
321     if (!preg_match($regex, $value)) {
322       LSdebug('checkEmail : regex fail');
323       return false;
324     }
325
326     $nd = explode('@', $value);
327     $nd=$nd[1];
328     
329     if ($domain) {
330       if(is_array($domain)) {
331         if (!in_array($nd,$domain)) {
332           return false;
333         }
334       }
335       else {
336         if($nd!=$domain) {
337           return false;
338         }
339       }
340     }
341
342     if ($checkDns && function_exists('checkdnsrr')) {
343       if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
344         LSdebug('checkEmail : DNS fail');
345         return false;
346       }
347     }
348
349     return true;
350   }
351   
352   function generatePassword($chars=NULL,$lenght=NULL) {
353     if (!$lenght) {
354         $lenght=8;
355     }
356     if (is_array($chars)) {
357       $retval='';
358       foreach($chars as $chs) {
359         if (!is_array($chs)) {
360           $chs=array('chars' => $chs);
361         }
362         if (!is_int($chs['nb'])) {
363           $chs['nb']=1;
364         }
365         $retval.=aleaChar($chs['chars'],$chs['nb']);
366       }
367       $add = ($lenght-strlen($retval));
368       if ($add > 0) {
369         $retval .= aleaChar($chars,$add);
370       }
371       return str_shuffle($retval);
372     } else {
373       return aleaChar($chars,$lenght);
374     }
375   }
376   
377   function aleaChar($chars=NULL,$lenght=1) {
378     if (is_array($chars)) {
379       $nchars="";
380       foreach($chars as $chs) {
381         if (is_string($chs)) {
382           $nchars.=$chs;
383         }
384         else if (is_string($chs['chars'])) {
385           $nchars.=$chs['chars'];
386         }
387       }
388       if(strlen($chars)>0) {
389         $chars=$nchars;
390       }
391       else {
392         $chars=NULL;
393       }
394     }
395     if (!$chars) {
396       $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';    
397     }
398     $nbChars=strlen($chars);
399     $retval="";
400     if(is_int($lenght)) {
401       for ($i=0;$i<$lenght;$i++) {
402         $retval.=$chars[rand(0,$nbChars-1)];
403       }
404     }
405     return $retval;
406   }
407   
408   function compareDn($a,$b) {
409     if (substr_count($a,',') > substr_count($b,','))
410       return -1;
411     else 
412       return 1;
413   }
414   
415   function LSlog($msg) {
416     if ($GLOBALS['LSlog']['enable']) {
417       global $LSlogFile;
418       if (!$LSlogFile) {
419         $LSlogFile=fopen($GLOBALS['LSlog']['filename'],'a');
420       }
421       fwrite($LSlogFile,$_SERVER['REQUEST_URI']." : ".$msg."\n");
422     }
423   }
424   
425   function __($msg) {
426     if (isset($GLOBALS['LSlang'][$msg])) {
427       return $GLOBALS['LSlang'][$msg];
428     }
429     return _($msg);
430   }
431   
432   function tr($msg,$key=null) {
433     $val = $GLOBALS['Smarty']->get_template_vars($msg);
434     if (!$val)
435       $val=$msg;
436     if (is_array($val)) {
437       echo __($val[$key]);
438     }
439     else {
440       echo __($val);
441     }
442   }
443 ?>