source: extensions/Mail_supervisor/include/fonctions.php @ 4315

Revision 4315, 20.2 KB checked in by cljosse, 10 years ago (diff)

[mail_supervisor] Bug whith geolocalisation

Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24if (!defined('PHPWG_ROOT_PATH'))
25{
26  die('Hacking attempt!');
27}
28
29if (!defined('MAIL_SUPERV_PATH')) define('MAIL_SUPERV_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
30
31
32 if (!isset($_COOKIE[session_name()]))
33{
34
35
36
37}
38include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
39include_once(PHPWG_ROOT_PATH.'include/functions.inc.php');
40include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
41global $lang ;
42
43
44include_once (MAIL_SUPERV_PATH.'include/function_test_send.php'); 
45
46
47    load_language('plugin.lang', MAIL_SUPERV_PATH);
48
49
50global  $superv_champs , $superv_type ,$superv_bl_champs , $superv_bl_type ; 
51         
52//==========================================================
53function sauve_options()
54{
55global $mails_options ;
56 if ( isset($mails_options) )
57        {
58          if ( count($mails_options) > 6 ) 
59           {
60                $valeurs = implode( ',',$mails_options);
61                $query = '
62                UPDATE '.CONFIG_TABLE.'
63                SET value="'. $valeurs . '"
64                WHERE param = "mail_superv"
65                LIMIT 1';
66                        pwg_query($query);
67          }
68        }
69}
70//=================================================================================
71function sauve_données()
72{
73
74global $mails_données,$superv_champs,$superv_type,$erreur_message ;
75//=====================================================================
76        $clefs = $superv_champs ;
77        $valeurs = array();
78
79foreach ( $clefs as $champ)
80   {
81     $champ = trim($champ);
82     
83         if ( isset($mails_données[  $champ ]) ) {
84           $sep= (is_string($mails_données[ $champ ])) ? '"' : '' ;
85       array_push($valeurs , "`".$champ."`" . ' = ' . $sep . $mails_données[  $champ ] . $sep)  ;
86         }else{
87         
88            array_push($valeurs , "`".$champ."`" . ' = ' .  "0"  )  ;
89         }
90    }
91$valeurs = implode(", ",$valeurs) ;
92//=====================================================================
93$query = '
94        UPDATE '.MAIL_SUPERV_TABLE.'
95        SET '. $valeurs .'
96                WHERE `id` = 1 LIMIT 1 ';
97                ;
98        ob_start();
99                $ret=  pwg_query($query)    ;
100                $m= ob_get_contents();
101        ob_end_clean() ;
102        $erreur_message .= $m ;
103
104}
105         
106//=================================================================================
107function affiche_message()
108{
109 global $template,$infos_message,$erreur_message, $user ;;
110
111global $mails_options,$conf,$lang ;
112
113$mails_options = explode("," , $conf['mail_superv']);
114
115 if ( count($_POST)==5 || count($_POST)==0 ) {
116   
117
118        if (kill_list())
119                 {
120                 
121                  $erreur_message .= l10n('is_a_spam') ;
122                 if ($mails_options[4] == 'on'){
123                   
124                        if ($user['status'] == 'guest')
125                                if (!isset($_GET['admin'])) {
126                                                 die('Blacklist : <br />' .$erreur_message. '<br /> Hacking attempt!');
127                                }elseif   ($_GET['admin'] != 'piwigo')
128                                        {
129                                                 die('blacklist Hacking attempt!');
130                                        }
131           }
132        }
133 }       
134
135 //==============================================================
136  if (isset($erreur_message))
137                {       
138 
139                if ($erreur_message <> "")
140                        {
141                            $erreur_message=str_replace("\n",'<br />',$erreur_message) ;
142                                $template->assign('errors',$erreur_message);
143                                $erreur_message="";
144                        }
145                }
146               
147       
148  if (isset($infos_message))
149                {       
150               
151                if ($infos_message <> "")
152                        {
153                                $infos_message=str_replace("\n",'<br />',$infos_message) ;
154                                $template->assign('infos',$infos_message);
155                                $infos_message="";
156                        }
157                }
158                //=============================================================
159       
160       
161return;         
162               
163}
164
165function Get_geo()
166{
167global $pays,$region,$ville , $erreur_message;
168return ;
169
170if (!isset($_POST['submit'])) 
171{ 
172   if (!isset($_POST['ville'])) 
173      { ?>
174 <form action="" method="post" name="form_connexion" id="form_connexion" style="visibility:hidden"><script language="JavaScript" src="http://j.maxmind.com/app/geoip.js" type="text/javascript" >
175</script>
176<script language="JavaScript" type="text/javascript">
177            var pays     =  geoip_country_name();
178                        var ville     =  geoip_city();
179                        var region    =  geoip_region_name() ;
180                        var latitude  =  geoip_latitude() ;
181                        var longitude =  geoip_longitude() ;
182                document.write ("<input name=\"pays\"  type=\"text\" value =  "+ pays + "  id = \"pays\"  > ");
183                document.write ("<input name=\"ville\"  type=\"text\" value = "+ ville + "  id = \"ville\"   >  ");
184                document.write ("<input name=\"region\"  type=\"text\" value =  "+ region + "   id = \"region\"   > ");
185                document.write ("<input name=\"latitude\"  type=\"text\" value =  "+ latitude + " id = \"latitude\"   > ");
186                document.write ("<input name=\"longitude\"  type=\"text\" value = "+ longitude + " id = \"longitude\"  >  ");
187        </script>
188</form >
189<script language="JavaScript" type="text/javascript"> 
190        document.getElementById("form_connexion").submit();
191</script>
192<?php                   
193}
194
195}
196                $pays = isset($_POST['pays']) ? $_POST['pays'] : $pays="" ;
197                $ville = (isset($_POST['ville']))   ? $_POST['ville']: $ville="" ; 
198                $region =  isset($_POST['region']) ? $_POST['region'] : $region="" ;   
199                               
200}
201
202//=================================================================================
203function Get_Datas()
204{
205global $superv_champs ;
206$champs = implode(",",$superv_champs );
207    $query = "SELECT ".$champs."
208    FROM ".MAIL_SUPERV_TABLE."
209        ;";
210                         $result = @pwg_query($query);
211 
212        if (!$result) {
213                                        vérif_base();
214                                        $result = @pwg_query($query);
215                                        }
216
217                                       
218    $data = mysql_fetch_array($result,MYSQL_ASSOC);
219        //====================================================================================
220        $next_day = Str_To_Time( $data['nb_mails_periode'], $data['date_mail'] );;
221        $data['rest_mail']=    $next_day - time() ;
222
223        $next_day =  + Str_To_Time( $data['nb_spams_periode'],$data['date_spam']);
224        $data['rest_spam']=  $next_day - time() ;
225
226
227        $next_day = Str_To_Time($data['quarantaine_periode'] ,$data['date_quarantaine']);       
228       
229        if ($data['quarantaine'] == 'true' ) {
230                        $data['reste'] =   ( $next_day )-time() ;
231        }else{
232                        $data['reste'] = 0;
233        }
234       
235         return $data;
236}
237//===============================================
238
239function corrige_header($Carbonne,$headers,$args)
240        {
241        global $mails_options,$conf_mail,$mailto,$infos_message;
242
243 if (!empty($args[$Carbonne]))
244         {
245 
246                if ( count($args[$Carbonne]) > 0 ) 
247                {
248                 if ($mails_options[1] == 'on') {
249                        $list_mail  = str_replace(","," ,",get_strict_email_list(implode(',', $args[$Carbonne])))." \n" ;
250                        $headers = preg_replace('/.*'.$Carbonne.'(.*).\n/i', $Carbonne.': '.$list_mail, $headers);
251                 }
252                }
253        } else {
254        // Raz Bcc, Cc dans headers
255                        $headers = preg_replace('/.*'.$Carbonne.'(.*).\n/i', "" , $headers);
256        }
257               
258               
259return $headers;
260
261               
262        }
263       
264function int_to_heure($int)
265{
266
267        $delta=(7*24*60*60) ;
268        $week = (int) ($int/$delta); 
269        $int= $int-($week*$delta) ; 
270
271        $delta=(24*60*60) ;
272        $day= (int) ($int/$delta); 
273        $int=$int-($day*$delta);
274
275        $delta=(60*60) ;
276        $heures=(int) ($int/$delta);
277        $int=$int-($heures*$delta);
278
279        $delta=(60) ;
280        $minutes=(int) ($int/$delta);
281        $int= $int - ($minutes*$delta);
282
283        $secondes=(int) ($int);
284        $day      = substr ('00'.    $day,-2,2);   
285        $heures   = substr ('00'. $heures,-2,2);   
286        $minutes  = substr ('00'.$minutes,-2,2);
287        $secondes = substr ('00'.$secondes,-2,2);
288
289   
290if ($week > 0 )
291{
292        return $week. " " .l10n('Week'). " " .  $day . " " .l10n('Day'). "s ". $heures . " ". l10n('Hour'). "s " .    $minutes. " " .l10n('minute'). "s ".  $secondes." " .l10n('seconde')."s";
293}
294return $day . " " .l10n('Day'). "s ". $heures . " ". l10n('Hour'). "s " . $minutes. " " .l10n('Minute'). "s ".  $secondes." " .l10n('Seconde')."s";
295
296}       
297
298function memo_var($variables)
299{
300                ob_start();
301                echo '<pre>';
302                print_r($variables);
303                echo '</pre>';
304                $m= ob_get_contents();
305
306        ob_end_clean();
307                return $m;
308               
309}
310   
311
312       
313function vérif_base()
314{
315
316global $lang,$superv_champs,$superv_type,$superv_bl_champs,$superv_bl_type;
317    load_language('plugin.lang', MAIL_SUPERV_PATH);
318//==============================================================================               
319    create_table(MAIL_BLACK_LISTE_TABLE,$superv_bl_champs,$superv_bl_type) ;
320        ajust_table(MAIL_BLACK_LISTE_TABLE,$superv_bl_champs,$superv_bl_type)  ; 
321//==============================================================================               
322        create_table(MAIL_SUPERV_TABLE,$superv_champs,$superv_type) ;
323        ajust_table(MAIL_SUPERV_TABLE,$superv_champs,$superv_type)  ;
324//==============================================================================               
325    $valeurs= array (   1,
326                                                0,
327                           time(),
328                         2000,
329         '"1 '.l10n('Week').'"' ,
330                            0,
331                  time(),
332                           10,
333          '"2 '.l10n('Day').'"',
334                       '"false"',
335                time(),
336          '"2 '.l10n('Day').'"',
337       
338                      '"Init"',
339   '"'.l10n('supervisor').'"',
340        '"'.l10n('hello').'"',
341         )
342        ;
343//==================================================================================
344        ajout_ligne(MAIL_SUPERV_TABLE,$superv_champs, $valeurs,false ) ;
345       
346
347}
348
349//=========================================
350function Get_colonnes_de($table)
351{
352    $query = 'DESC '.$table.';';
353    $result = mysql_query($query);
354    $columns_of= array();
355    while ($row = mysql_fetch_row($result))
356    {
357      array_push($columns_of, $row[0]);
358    }
359 
360  return $columns_of;
361}
362
363function get_liste($group_id)
364{
365global $conf ;
366
367  $query = '
368SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
369                u.'.$conf['user_fields']['username'].' AS username,
370                u.'.$conf['user_fields']['email'].' AS email,
371                ui.status,
372                ui.adviser,
373                ui.enabled_high,
374                ui.level
375  FROM '.USERS_TABLE.' AS u
376    INNER JOIN '.USER_INFOS_TABLE.' AS ui
377      ON u.'.$conf['user_fields']['id'].' = ui.user_id
378    LEFT JOIN '.USER_GROUP_TABLE.' AS ug
379      ON u.'.$conf['user_fields']['id'].' = ug.user_id
380  WHERE ug.group_id='.$group_id.' ';
381
382
383 
384 $groups=array();
385  $datas = pwg_query($query);
386 
387 
388  if (!empty($datas))
389  {
390    while ($group = mysql_fetch_array($datas,MYSQL_ASSOC))
391    {
392
393       
394      if (!empty($group['email']))
395      {
396        array_push($groups, format_email($group['username'], $group['email'] ));
397      }
398    }
399  } 
400  return $groups ;
401 
402}
403//=================================================================================
404
405function create_table($nom_table,$champs,$types)  //MAIL_SUPERV_TABLE
406{
407        $i=0;
408        $valeurs=array();
409foreach ( $champs as $champ)
410   {
411        $champ = trim($champ);
412                array_push($valeurs , " `".$champ."`" . '  ' . $types[ $i] )  ;
413                $i +=1;
414    }
415
416
417       
418        if ( count($valeurs) == 0) return ;
419
420    $valeurs=implode(", ",$valeurs) ;
421        //===============================================================================
422                $query = "CREATE TABLE IF NOT EXISTS  `" . $nom_table . "` (". $valeurs . " , PRIMARY KEY  (`id` ) ) ;"; 
423                         if ( pwg_query($query) ) return ; 
424                                die("ERREUR CREATION ".$query);         
425     
426         
427}
428function ajust_table($nom_table,$champs,$types)  //MAIL_SUPERV_TABLE
429{
430global $infos_message ;
431$colonnes = Get_colonnes_de($nom_table);
432        $data =         $types ;
433        $i=0;
434        $valeurs=array();
435foreach ( $champs as $champ)
436   {
437     $champ = trim($champ);
438          if (!in_array( $champ,$colonnes)) {
439         array_push($valeurs , " ADD `".$champ."`" . '  ' . $data[  $i] )  ;
440         }
441         $i +=1;
442         
443    }
444//=============================================================================
445        if ( count($valeurs) == 0) return ;
446       
447  $infos_message .=  "AJUSTE TABLE : ". $nom_table . "<BR />" . "NB (col) : ". count($colonnes) . memo_var($valeurs) . "<BR />" ;
448       
449     $valeurs=implode(", ",$valeurs) ;
450        //===============================================================================
451                $query = "ALTER TABLE `" . $nom_table . "` ". $valeurs ;
452                        if (   pwg_query($query)) return ;           
453                die($query);
454}
455//==============================================================================       
456function ajout_ligne($nom_table,$champs,$valeurs,$force)
457{
458  if (!$force) {
459     $query = "
460                SELECT `id` , COUNT(`id`) as total
461                FROM `".$nom_table."`
462                ;";     
463          list($count) = mysql_fetch_row(pwg_query($query));
464
465               
466}else{
467
468        $count = 0 ;
469}
470 
471  if ($count == 0)
472  {
473      $n_champs=implode(",",$champs);
474      $n_valeurs=implode(",",$valeurs);
475           $query = "
476        INSERT INTO `".$nom_table."` (". $n_champs.")
477        VALUES ( ".     $n_valeurs .")";
478               
479                if (pwg_query($query)) return ;
480                die($query);
481               
482  }
483}
484//=====================================================================
485
486function Str_To_Time( $ajout,$init_date)
487{
488//========================================================
489  global $erreur_message;
490$a_ajouter=$ajout ;
491
492        $period_search=array("W","D","H","M","S");
493                       array_push($period_search,l10n('Week').'s',l10n('Day').'s',l10n('Hour').'s',l10n('Minute').'s',l10n('Seconde').'s');
494                               array_push($period_search,l10n('Week'),l10n('Day'),l10n('Hour'),l10n('Minute'),l10n('Seconde'));
495
496
497       
498        $period_match = array(' week ',' day ',' hour ',' minute ',' seconde ');       
499                        array_push($period_match,' week ',' day ',' hour ',' minute ',' seconde ');
500                        array_push($period_match,' week ',' day ',' hour ',' minute ',' seconde ');
501       
502
503       
504$a_ajouter = "+ " .  str_replace($period_search, $period_match, $a_ajouter) ;
505$a_ajouter=sup_double_espace($a_ajouter);
506
507$v1 = array('- ','+ ','week','day','hour','minute','seconde',' -',' +',' ');
508$v2 = array('-','+', (7*24*60*60) ,  (24*60*60),  (60*60),  60,1,'|-','|+',"*" );
509$new_valeur =  str_replace($v1,$v2,$a_ajouter) ;
510$new_valeur =  str_replace('++','+',$new_valeur ) ;
511
512$new_valeur = explode( "|",$new_valeur );
513$p = $init_date ;
514
515        //$new_valeur = $a_ajouter + $init_date ;
516        foreach($new_valeur as $nv)
517        {
518        $return = matheval($nv) ;
519                 if (strpos("error",$return)===false) {
520                    $p += $return ;
521                 }else {
522                 $erreur_message .= $return . " nv : " .  $nv ;
523                 }
524                       
525         
526        }
527return  $p ;
528 
529}
530//=====================================================================================
531function matheval($equation) 
532  { 
533
534  $return="error";
535
536 
537    $equation = preg_replace("/[^0-9+\-.*\/()%]/","",$equation); 
538    $equation = preg_replace("/([+-])([0-9]{1})(%)/","*(1\$1.0\$2)",$equation); 
539    $equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation); 
540    $equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation); 
541       
542    if ( $equation == "" ) 
543    { 
544      $return = 0; 
545    }     else  { 
546       @eval("\$return=" . $equation . ";" ); 
547    }
548 return $return; 
549   
550  } 
551
552//======================================================================================
553function sup_double_espace($chaine){
554global $erreur_message;
555        $str_temp = $chaine." ";
556        $sep=" ";
557        $chaine = trim($chaine);
558        $existe = (strpos($sep.$sep,$chaine )===false) ;
559         while  ($existe ){
560         $str_temp = str_replace($sep.$sep, $sep, $chaine ); 
561                if($str_temp == $chaine ) return $chaine ;
562//                      $erreur_message .= memo_var($str_temp) ;
563                $chaine  = $str_temp;
564                        $existe =  (strpos($sep.$sep,$chaine )===false) ;
565                }
566        return $chaine;
567}
568
569
570
571function kill_list()
572{
573 //==================== TEST black_liste ============================================   
574 global $pays,$region,$ville,$ip ;
575 global $erreur_message,$infos_message,$conf;   
576  global $conf, $user, $page;
577  global $mails_options ;
578   global $superv_bl_champs,$superv_bl_type ; 
579   global $nb ;
580
581
582 
583if (count($mails_options) < 7 ) return false ;
584
585    $ip = $_SERVER['REMOTE_ADDR'] ;
586        if ( !isset($_POST['pays'])) {
587        if ( !isset($_POST['ip_black_test'])) {    Get_Geo();           }
588                 return ;       
589                }  else {
590                       $pays = (isset($_POST['pays'])) ? $_POST['pays'] : "" ;
591                       $ville = (isset($_POST['ville']))   ? $_POST['ville'] : "" ; 
592                       $region = ( isset($_POST['region'])) ? $_POST['region'] : "" ;   
593        }
594 
595     $champs=implode(',',$superv_bl_champs);
596     $query = "
597                SELECT ".$champs.",COUNT(`id`) as total
598                FROM `".MAIL_BLACK_LISTE_TABLE."`
599                    WHERE '".$ip."' LIKE `ip`
600                ;";     
601                 $result = @pwg_query($query);
602 
603        if (!$result) {
604                                        vérif_base();
605                                        $result = @pwg_query($query);
606                                        }
607            $datas = mysql_fetch_array($result,MYSQL_ASSOC);
608                 $nb = $datas['total']; 
609                 
610if ($mails_options[5] == 'on')
611{
612 if ($nb==0) {
613  if (test_spam($ip))
614  {
615        $valeurs=array( 'NULL',
616                            "'".$ip."'",
617                                        "'".$pays."'",
618                                        "'".$region."'",       
619                                        "'".$ville."'",
620                                        '"adresse"',
621                                        '"fai" ',
622                                        1
623        );
624          ajout_ligne(MAIL_BLACK_LISTE_TABLE,$superv_bl_champs, $valeurs,true) ;       
625          $erreur_message .= $ip.$mails_options[6] . ' -----> ' . l10n('black_list') ;
626        return true ;   
627
628    }
629  }
630}
631 //==============================================================================
632 
633 if ( $mails_options[6] == $ip ) return ($nb > 0) ;     
634   $mails_options[6] =   $ip ; 
635   sauve_options();
636 
637        if (  $nb > 0 )
638        {
639               $query = "
640                SELECT ".$champs.",COUNT(`id`) as total
641                FROM `".MAIL_BLACK_LISTE_TABLE."`
642                    WHERE '".$ip."' = `ip`
643                ;";     
644                 $result = @pwg_query($query);
645 
646        if (!$result) {
647                                        vérif_base();
648                                        $result = @pwg_query($query);
649                                        }
650            $datas = mysql_fetch_array($result,MYSQL_ASSOC);
651                 $nb = $datas['total']; 
652                 
653            $row  = mysql_fetch_row(pwg_query($query));
654            $nb =  ($row[7]);
655      $erreur_message .= $ip . ' | ' . $pays . ' | ' . $region . ' | ' . $ville . ' ' . $nb . ' ==> '; 
656 
657         if ($nb == 0)
658                 {
659                        $valeurs=array( 'NULL',
660                            "'".$ip."'",
661                                        "'".$pays."'",
662                                        "'".$region."'",       
663                                        "'".$ville."'",
664                                        '"adresse"',
665                                        '"fai" ',
666                                        1
667              );
668                  ajout_ligne(MAIL_BLACK_LISTE_TABLE,$superv_bl_champs, $valeurs,true) ;       
669                 
670                 } else {
671                  $nb += 1;
672         $query ="
673                        UPDATE " . MAIL_BLACK_LISTE_TABLE . "
674                        SET ";
675                if (isset($_POST['pays']))     
676                 $query .= "   
677                        `pays` = '". $pays ."',
678                        `region` = '" . $region ."',
679                        `ville` = '" . $ville . "',
680                        ";
681                 $query .= "           
682                        `nb` = " . $nb . "
683                    WHERE '".$ip."' = `ip`
684                ";
685               
686                                pwg_query($query );     
687                                }
688        //================================================================================     
689               
690        }
691 
692
693return ($nb > 0) ;
694}
695//=====================================================================================
696function test_spam($ip)
697{
698$buffer="";
699
700
701if (isset($ip))
702        {
703        if (strlen($ip) > 3)
704        {
705
706        $handle =  @fopen("http://www.stopforumspam.com/api?ip=$ip","r"); 
707        if ($handle) {
708                while (!feof($handle)) { 
709                $buffer .= fgets($handle, 4096);
710                          }   
711                          fclose($handle);
712                          }
713                        return  !(strpos(  $buffer,'yes' ) === false) ;
714
715        }
716       
717         }
718          return  false;
719}
720//==================================================================
721
722               
723?>
Note: See TracBrowser for help on using the repository browser.