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