Source for file filters.php

Documentation is available at filters.php

  1. <?php
  2. /**
  3.  * Message and Spam Filter Plugin - Filtering Functions
  4.  *
  5.  * This plugin filters your inbox into different folders based upon given
  6.  * criteria.  It is most useful for people who are subscibed to mailing lists
  7.  * to help organize their messages.  The argument stands that filtering is
  8.  * not the place of the client, which is why this has been made a plugin for
  9.  * SquirrelMail.  You may be better off using products such as Sieve or
  10.  * Procmail to do your filtering so it happens even when SquirrelMail isn't
  11.  * running.
  12.  *
  13.  * If you need help with this, or see improvements that can be made, please
  14.  * email me directly at the address above.  I definately welcome suggestions
  15.  * and comments.  This plugin, as is the case with all SquirrelMail plugins,
  16.  * is not directly supported by the developers.  Please come to me off the
  17.  * mailing list if you have trouble with it.
  18.  *
  19.  * Also view plugins/README.plugins for more information.
  20.  *
  21.  * @version $Id: filters.php,v 1.45.2.18 2006/07/29 08:46:57 tokul Exp $
  22.  * @copyright (c) 1999-2006 The SquirrelMail Project Team
  23.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  24.  * @package plugins
  25.  * @subpackage filters
  26.  */
  27.  
  28. /**
  29.  * FIXME: Undocumented function
  30.  * @access private
  31.  */
  32. function filters_SaveCache ({
  33.     global $data_dir$SpamFilters_DNScache;
  34.  
  35.     if (file_exists($data_dir '/dnscache')) {
  36.         $fp fopen($data_dir '/dnscache''r');
  37.     else {
  38.         $fp false;
  39.     }
  40.     if ($fp{
  41.         flock($fp,LOCK_EX);
  42.     else {
  43.        $fp fopen($data_dir '/dnscache''w+');
  44.        fclose($fp);
  45.        $fp fopen($data_dir '/dnscache''r');
  46.        flock($fp,LOCK_EX);
  47.     }
  48.     $fp1=fopen($data_dir '/dnscache''w+');
  49.  
  50.     foreach ($SpamFilters_DNScache as $Key=> $Value{
  51.        $tstr $Key ',' $Value['L'',' $Value['T'"\n";
  52.        fputs ($fp1$tstr);
  53.     }
  54.     fclose($fp1);
  55.     flock($fp,LOCK_UN);
  56.     fclose($fp);
  57. }
  58.  
  59. /**
  60.  * FIXME: Undocumented function
  61.  * @access private
  62.  */
  63. function filters_LoadCache ({
  64.     global $data_dir$SpamFilters_DNScache;
  65.  
  66.     if (file_exists($data_dir '/dnscache')) {
  67.         $SpamFilters_DNScache array();
  68.         if ($fp fopen ($data_dir '/dnscache''r')) {
  69.             flock($fp,LOCK_SH);
  70.             while ($data=fgetcsv($fp,1024)) {
  71.                if ($data[2time()) {
  72.                   $SpamFilters_DNScache[$data[0]]['L'$data[1];
  73.                   $SpamFilters_DNScache[$data[0]]['T'$data[2];
  74.                }
  75.             }
  76.  
  77.             flock($fp,LOCK_UN);
  78.         }
  79.     }
  80. }
  81.  
  82. /**
  83.  * FIXME: Undocumented function
  84.  * @access private
  85.  */
  86. function filters_bulkquery($filters_spam_scan$filters$read{
  87.     global $SpamFilters_YourHop$attachment_dir$username,
  88.            $SpamFilters_CacheTTL;
  89.  
  90.     $IPs array();
  91.     $i 0;
  92.     while ($i count($read)) {
  93.         // EIMS will give funky results
  94.         $Chunks explode(' '$read[$i]);
  95.         if ($Chunks[0!= '*'{
  96.             $i ++;
  97.             continue;
  98.         }
  99.         $MsgNum $Chunks[1];
  100.  
  101.         $i ++;
  102.  
  103.         // Look through all of the Received headers for IP addresses
  104.         // Stop when I get ")" on a line
  105.         // Stop if I get "*" on a line (don't advance)
  106.         // and above all, stop if $i is bigger than the total # of lines
  107.         while (($i count($read)) &&
  108.                 ($read[$i][0!= ')' && $read[$i][0!= '*' &&
  109.                 $read[$i][0!= "\n")) {
  110.             // Check to see if this line is the right "Received from" line
  111.             // to check
  112.             if (is_int(strpos($read[$i]$SpamFilters_YourHop))) {
  113.                 $read[$iereg_replace('[^0-9\.]'' '$read[$i]);
  114.                 $elements explode(' '$read[$i]);
  115.                 foreach ($elements as $value{
  116.                     if ($value != '' &&
  117.                         ereg('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',
  118.                             $value$regs)) {
  119.                         $Chunks explode('.'$value);
  120.                         $IP $Chunks[3'.' $Chunks[2'.' .
  121.                               $Chunks[1'.' $Chunks[0];
  122.                         foreach ($filters as $key => $value{
  123.                             if ($filters[$key]['enabled'&&
  124.                                       $filters[$key]['dns']{
  125.                                 if (strlen($SpamFilters_DNScache[$IP.'.'.$filters[$key]['dns']]== 0{
  126.                                    $IPs[$IPtrue;
  127.                                    break;
  128.                                 }
  129.                             }
  130.                         }
  131.                         // If we've checked one IP and YourHop is
  132.                         // just a space
  133.                         if ($SpamFilters_YourHop == ' '{
  134.                             break;  // don't check any more
  135.                         }
  136.                     }
  137.                 }
  138.             }
  139.             $i ++;
  140.         }
  141.     }
  142.  
  143.     if (count($IPs0{
  144.         $rbls array();
  145.         foreach ($filters as $key => $value{
  146.             if ($filters[$key]['enabled']{
  147.                 if ($filters[$key]['dns']{
  148.                     $rbls[$filters[$key]['dns']] true;
  149.                 }
  150.             }
  151.         }
  152.  
  153.         $bqfil $attachment_dir $username '-bq.in';
  154.         $fp fopen($bqfil'w');
  155.         fputs ($fp$SpamFilters_CacheTTL "\n");
  156.         foreach ($rbls as $key => $value{
  157.             fputs ($fp'.' $key "\n");
  158.         }
  159.         fputs ($fp"----------\n");
  160.         foreach ($IPs as $key => $value{
  161.             fputs ($fp$key "\n");
  162.         }
  163.         fclose ($fp);
  164.         $bqout array();
  165.         exec ($SpamFilters_BulkQuery ' < ' $bqfil$bqout);
  166.         foreach ($bqout as $value{
  167.             $Chunks explode(','$value);
  168.             $SpamFilters_DNScache[$Chunks[0]]['L'$Chunks[1];
  169.             $SpamFilters_DNScache[$Chunks[0]]['T'$Chunks[2time();
  170.         }
  171.         unlink($bqfil);
  172.     }
  173. }
  174.  
  175. /**
  176.  * FIXME: Undocumented function
  177.  * @access private
  178.  */
  179. function start_filters({
  180.     global $mailbox$imapServerAddress$imapPort$imap,
  181.            $imap_general$filters$imap_stream$imapConnection,
  182.  
  183.     sqgetGlobalVar('username'$usernameSQ_SESSION);
  184.     sqgetGlobalVar('key',      $key,      SQ_COOKIE);
  185.  
  186.  
  187.     $filters load_filters();
  188.  
  189.     // No point running spam filters if there aren't any to run //
  190.     if ($AllowSpamFilters{
  191.         $spamfilters load_spam_filters();
  192.  
  193.         $AllowSpamFilters false;
  194.         foreach($spamfilters as $filterkey=>$value{
  195.             if ($value['enabled'== 'yes'{
  196.                 $AllowSpamFilters true;
  197.                 break;
  198.             }
  199.         }
  200.     }
  201.  
  202.     // No user filters, and no spam filters, no need to continue //
  203.     if (!$AllowSpamFilters && empty($filters)) {
  204.         return;
  205.     }
  206.  
  207.  
  208.     // Detect if we have already connected to IMAP or not.
  209.     // Also check if we are forced to use a separate IMAP connection
  210.     if ((!isset($imap_stream&& !isset($imapConnection)) ||
  211.         $UseSeparateImapConnection {
  212.             $stream sqimap_login($username$key$imapServerAddress,
  213.                                 $imapPort10);
  214.             $previously_connected false;
  215.     else if (isset($imapConnection)) {
  216.         $stream $imapConnection;
  217.         $previously_connected true;
  218.     else {
  219.         $previously_connected true;
  220.         $stream $imap_stream;
  221.     }
  222.     $aStatus sqimap_status_messages ($stream'INBOX'array('MESSAGES'));
  223.  
  224.     if ($aStatus['MESSAGES']{
  225.         sqimap_mailbox_select($stream'INBOX');
  226.         // Filter spam from inbox before we sort them into folders
  227.         if ($AllowSpamFilters{
  228.             spam_filters($stream);
  229.         }
  230.  
  231.         // Sort into folders
  232.         user_filters($stream);
  233.     }
  234.  
  235.     if (!$previously_connected{
  236.         sqimap_logout($stream);
  237.     }
  238. }
  239.  
  240. /**
  241.  * FIXME: Undocumented function
  242.  * @access private
  243.  */
  244. function user_filters($imap_stream{
  245.     global $data_dir$username;
  246.     $filters load_filters();
  247.     if ($filtersreturn;
  248.     $filters_user_scan getPref($data_dir$username'filters_user_scan');
  249.  
  250.     sqimap_mailbox_select($imap_stream'INBOX');
  251.     $id array();
  252.     // For every rule
  253.     for ($i=0$num count($filters)$i $num$i++{
  254.         // If it is the "combo" rule
  255.         if ($filters[$i]['where'== 'To or Cc'{
  256.             /*
  257.             *  If it's "TO OR CC", we have to do two searches, one for TO
  258.             *  and the other for CC.
  259.             */
  260.             $id filter_search_and_delete($imap_stream'TO',
  261.                   $filters[$i]['what']$filters[$i]['folder']$filters_user_scan$id);
  262.             $id filter_search_and_delete($imap_stream'CC',
  263.                   $filters[$i]['what']$filters[$i]['folder']$filters_user_scan$id);
  264.         else {
  265.             /*
  266.             *  If it's a normal TO, CC, SUBJECT, or FROM, then handle it
  267.             *  normally.
  268.             */
  269.             $id filter_search_and_delete($imap_stream$filters[$i]['where'],
  270.                  $filters[$i]['what']$filters[$i]['folder']$filters_user_scan$id);
  271.         }
  272.     }
  273.     // Clean out the mailbox whether or not auto_expunge is on
  274.     // That way it looks like it was redirected properly
  275.     if (count($id)) {
  276.         sqimap_mailbox_expunge($imap_stream'INBOX');
  277.     }
  278. }
  279.  
  280. /**
  281.  * FIXME: Undocumented function
  282.  * @access private
  283.  */
  284. function filter_search_and_delete($imap$where$what$where_to$user_scan
  285.                                   $del_id{
  286.     global $languages$squirrelmail_language$allow_charset_search
  287.            $uid_support$imap_server_type;
  288.  
  289.     if (strtolower($where_to== 'inbox'{
  290.         return array();
  291.     }
  292.  
  293.     if ($user_scan == 'new'{
  294.         $category 'UNSEEN';
  295.     else {
  296.         $category 'ALL';
  297.     }
  298.  
  299.     $category .= ' UNDELETED';
  300.  
  301.     if ($allow_charset_search &&
  302.         isset($languages[$squirrelmail_language]['CHARSET']&&
  303.         $languages[$squirrelmail_language]['CHARSET']{
  304.         $search_str 'SEARCH CHARSET '
  305.                     . strtoupper($languages[$squirrelmail_language]['CHARSET'])
  306.                     . ' ' $category;
  307.     else {
  308.         $search_str 'SEARCH CHARSET US-ASCII ' $category;
  309.     }
  310.     if ($where == 'Header'{
  311.         $what  explode(':'$what);
  312.         $where trim($where ' ' $what[0]);
  313.         $what  addslashes(trim($what[1]));
  314.     }
  315.  
  316.     // see comments in squirrelmail sqimap_search function
  317.     if ($imap_server_type == 'macosx' || $imap_server_type == 'hmailserver'{
  318.         $search_str .= ' ' $where ' ' $what;
  319.     else {
  320.         $search_str .= ' ' $where ' {' strlen($what"}\r\n"
  321.                     . $what;
  322.     }
  323.  
  324.     /* read data back from IMAP */
  325.     $read sqimap_run_command($imap$search_strtrue$response$message$uid_support);
  326.  
  327.     // This may have problems with EIMS due to it being goofy
  328.  
  329.     for ($r=0$num count($read)$r $num &&
  330.                 substr($read[$r]08!= '* SEARCH'$r++{}
  331.     if ($response == 'OK'{
  332.         $ids explode(' '$read[$r]);
  333.         if (sqimap_mailbox_exists($imap$where_to)) {
  334.             /*
  335.              * why we do n calls instead of just one. It is safer to copy 
  336.              * messages one by one, but code does not call expunge after 
  337.              * message is copied and quota limits are not resolved.
  338.              */
  339.             for ($j=2$num count($ids)$j $num$j++{
  340.                 $id trim($ids[$j]);
  341.                 if (sqimap_messages_copy ($imap$id$id$where_tofalse)) {
  342.                     $del_id[$id;
  343.                     sqimap_messages_flag ($imap$id$id'Deleted'false);
  344.                 }
  345.             }
  346.         }
  347.     }
  348.     return $del_id;
  349. }
  350.  
  351. /**
  352.  * FIXME: Undocumented function
  353.  * @access private
  354.  */
  355. function spam_filters($imap_stream{
  356.     global $data_dir$username$uid_support;
  357.     global $SpamFilters_YourHop;
  358.     global $SpamFilters_DNScache;
  359.     global $SpamFilters_SharedCache;
  360.     global $SpamFilters_BulkQuery;
  361.  
  362.     $filters_spam_scan getPref($data_dir$username'filters_spam_scan');
  363.     $filters_spam_folder getPref($data_dir$username'filters_spam_folder');
  364.     $filters load_spam_filters();
  365.  
  366.     if ($SpamFilters_SharedCache{
  367.        filters_LoadCache();
  368.     }
  369.  
  370.     $run 0;
  371.  
  372.     foreach ($filters as $Key=> $Value{
  373.         if ($Value['enabled']{
  374.             $run ++;
  375.         }
  376.     }
  377.  
  378.     // short-circuit
  379.     if ($run == 0{
  380.         return;
  381.     }
  382.  
  383.     sqimap_mailbox_select($imap_stream'INBOX');
  384.  
  385.     // Ask for a big list of all "Received" headers in the inbox with
  386.     // flags for each message.  Kinda big.
  387.     if ($filters_spam_scan != 'new'{
  388.         $read sqimap_run_command($imap_stream'FETCH 1:* (FLAGS BODY.PEEK[HEADER.FIELDS ' .
  389.             '(RECEIVED)])'true$response$message$uid_support);
  390.     else {
  391.         $read sqimap_run_command($imap_stream'SEARCH UNSEEN'true$response$message$uid_support);
  392.         if ($response != 'OK' || trim($read[0]== '* SEARCH'{
  393.             $read sqimap_run_command($imap_stream'FETCH 1:* (FLAGS BODY.PEEK[HEADER.FIELDS ' .
  394.             '(RECEIVED)])'true$response$message$uid_support);
  395.         else {
  396.             if (isset($read[0])) {
  397.                 if (preg_match("/^\* SEARCH (.+)$/"$read[0]$regs)) {
  398.                     $search_array preg_split("/ /"trim($regs[1]));
  399.                 }
  400.             }
  401.             $msgs_str sqimap_message_list_squisher($search_array);
  402.             $imap_query 'FETCH '.$msgs_str;
  403.             $imap_query .= ' (FLAGS BODY.PEEK[HEADER.FIELDS ';
  404.             $imap_query .= '(RECEIVED)])';
  405.             $read sqimap_run_command($imap_stream,$imap_querytrue$response$message$uid_support);
  406.         }
  407.     }
  408.     
  409.     if (isset($response&& $response != 'OK'{
  410.         return;
  411.     }
  412.  
  413.     if (strlen($SpamFilters_BulkQuery0{
  414.        filters_bulkquery($filters_spam_scan$filters$read);
  415.     }
  416.  
  417.     $i 0;
  418.     while ($i count($read)) {
  419.         // EIMS will give funky results
  420.         $Chunks explode(' '$read[$i]);
  421.         if ($Chunks[0!= '*'{
  422.             $i ++;
  423.             continue;
  424.         }
  425.         $MsgNum $Chunks[1];
  426.  
  427.         $IPs array();
  428.         $i ++;
  429.         $IsSpam 0;
  430.  
  431.         // Look through all of the Received headers for IP addresses
  432.         // Stop when I get ")" on a line
  433.         // Stop if I get "*" on a line (don't advance)
  434.         // and above all, stop if $i is bigger than the total # of lines
  435.         while (($i count($read)) &&
  436.                 ($read[$i][0!= ')' && $read[$i][0!= '*' &&
  437.                 $read[$i][0!= "\n"&& ($IsSpam)) {
  438.             // Check to see if this line is the right "Received from" line
  439.             // to check
  440.             if (is_int(strpos($read[$i]$SpamFilters_YourHop))) {
  441.  
  442.                 // short-circuit and skip work if we don't scan this one
  443.                 $read[$iereg_replace('[^0-9\.]'' '$read[$i]);
  444.                 $elements explode(' '$read[$i]);
  445.                 foreach ($elements as $value{
  446.                     if ($value != '' &&
  447.                         ereg('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',
  448.                             $value$regs)) {
  449.                         $Chunks explode('.'$value);
  450.                         if (filters_spam_check_site($Chunks[0],
  451.                                 $Chunks[1]$Chunks[2]$Chunks[3],
  452.                                 $filters)) {
  453.                             $IsSpam ++;
  454.                             break;  // no sense in checking more IPs
  455.                         }
  456.                         // If we've checked one IP and YourHop is
  457.                         // just a space
  458.                         if ($SpamFilters_YourHop == ' '{
  459.                             break;  // don't check any more
  460.                         }
  461.                     }
  462.                 }
  463.             }
  464.             $i ++;
  465.         }
  466.  
  467.         // Lookie!  It's spam!  Yum!
  468.         if ($IsSpam{
  469.             if (sqimap_mailbox_exists($imap_stream$filters_spam_folder)) {
  470.                 // check if message copy was successful
  471.                 if (sqimap_messages_copy ($imap_stream$MsgNum$MsgNum,
  472.                                           $filters_spam_folderfalse)) {
  473.                     sqimap_messages_flag ($imap_stream$MsgNum$MsgNum,
  474.                                           'Deleted'false);
  475.                 }
  476.             }
  477.         else {
  478.         }
  479.     }
  480.  
  481.     sqimap_mailbox_expunge($imap_stream'INBOX');
  482.  
  483.     if ($SpamFilters_SharedCache{
  484.        filters_SaveCache();
  485.     else {
  486.        sqsession_register($SpamFilters_DNScache'SpamFilters_DNScache');
  487.     }
  488.  
  489. }
  490.  
  491. /**
  492.  * FIXME: Undocumented function
  493.  * Does the loop through each enabled filter for the specified IP address.
  494.  * IP format:  $a.$b.$c.$d
  495.  * @access private
  496.  */
  497. function filters_spam_check_site($a$b$c$d&$filters{
  498.     foreach ($filters as $key => $value{
  499.         if ($filters[$key]['enabled']{
  500.             if ($filters[$key]['dns']{
  501.                 $filter_revip $d '.' $c '.' $b '.' $a '.' .
  502.                                 $filters[$key]['dns'];
  503.  
  504.                 if(!isset($SpamFilters_DNScache[$filter_revip]['L']))
  505.                         $SpamFilters_DNScache[$filter_revip]['L''';
  506.  
  507.                 if(!isset($SpamFilters_DNScache[$filter_revip]['T']))
  508.                         $SpamFilters_DNScache[$filter_revip]['T''';
  509.  
  510.                 if (strlen($SpamFilters_DNScache[$filter_revip]['L']== 0{
  511.                     $SpamFilters_DNScache[$filter_revip]['L'=
  512.                                     gethostbyname($filter_revip);
  513.                     $SpamFilters_DNScache[$filter_revip]['T'=
  514.                                        time($SpamFilters_CacheTTL;
  515.                 }
  516.                 if ($SpamFilters_DNScache[$filter_revip]['L'==
  517.                     $filters[$key]['result']{
  518.                     return 1;
  519.                 }
  520.             }
  521.         }
  522.     }
  523.     return 0;
  524. }
  525.  
  526. /**
  527.  * FIXME: Undocumented function
  528.  * @access private
  529.  */
  530. function load_filters({
  531.     global $data_dir$username;
  532.  
  533.     $filters array();
  534.     for ($i=0$fltr getPref($data_dir$username'filter' $i)$i++{
  535.         $ary explode(','$fltr);
  536.         $filters[$i]['where'$ary[0];
  537.         $filters[$i]['what'$ary[1];
  538.         $filters[$i]['folder'$ary[2];
  539.     }
  540.     return $filters;
  541. }
  542.  
  543. /**
  544.  * FIXME: Undocumented function
  545.  * @access private
  546.  */
  547. function load_spam_filters({
  548.     global $data_dir$username$SpamFilters_ShowCommercial;
  549.  
  550.     if ($SpamFilters_ShowCommercial{
  551.         $filters['MAPS RBL']['prefname''filters_spam_maps_rbl';
  552.         $filters['MAPS RBL']['name''MAPS Realtime Blackhole List';
  553.         $filters['MAPS RBL']['link''http://www.mail-abuse.org/rbl/';
  554.         $filters['MAPS RBL']['dns''blackholes.mail-abuse.org';
  555.         $filters['MAPS RBL']['result''127.0.0.2';
  556.         $filters['MAPS RBL']['comment'=
  557.             _("COMMERCIAL - This list contains servers that are verified spam senders. It is a pretty reliable list to scan spam from.");
  558.  
  559.         $filters['MAPS RSS']['prefname''filters_spam_maps_rss';
  560.         $filters['MAPS RSS']['name''MAPS Relay Spam Stopper';
  561.         $filters['MAPS RSS']['link''http://www.mail-abuse.org/rss/';
  562.         $filters['MAPS RSS']['dns''relays.mail-abuse.org';
  563.         $filters['MAPS RSS']['result''127.0.0.2';
  564.         $filters['MAPS RSS']['comment'=
  565.             _("COMMERCIAL - Servers that are configured (or misconfigured) to allow spam to be relayed through their system will be banned with this. Another good one to use.");
  566.  
  567.         $filters['MAPS DUL']['prefname''filters_spam_maps_dul';
  568.         $filters['MAPS DUL']['name''MAPS Dial-Up List';
  569.         $filters['MAPS DUL']['link''http://www.mail-abuse.org/dul/';
  570.         $filters['MAPS DUL']['dns''dialups.mail-abuse.org';
  571.         $filters['MAPS DUL']['result''127.0.0.3';
  572.         $filters['MAPS DUL']['comment'=
  573.             _("COMMERCIAL - Dial-up users are often filtered out since they should use their ISP's mail servers to send mail. Spammers typically get a dial-up account and send spam directly from there.");
  574.  
  575.         $filters['MAPS RBLplus-RBL']['prefname''filters_spam_maps_rblplus_rbl';
  576.         $filters['MAPS RBLplus-RBL']['name''MAPS RBL+ RBL List';
  577.         $filters['MAPS RBLplus-RBL']['link''http://www.mail-abuse.org/';
  578.         $filters['MAPS RBLplus-RBL']['dns''rbl-plus.mail-abuse.org';
  579.         $filters['MAPS RBLplus-RBL']['result''127.0.0.2';
  580.         $filters['MAPS RBLplus-RBL']['comment'=
  581.             _("COMMERCIAL - RBL+ Blackhole entries.");
  582.  
  583.         $filters['MAPS RBLplus-RSS']['prefname''filters_spam_maps_rblplus_rss';
  584.         $filters['MAPS RBLplus-RSS']['name''MAPS RBL+ List RSS entries';
  585.         $filters['MAPS RBLplus-RSS']['link''http://www.mail-abuse.org/';
  586.         $filters['MAPS RBLplus-RSS']['dns''rbl-plus.mail-abuse.org';
  587.         $filters['MAPS RBLplus-RSS']['result''127.0.0.2';
  588.         $filters['MAPS RBLplus-RSS']['comment'=
  589.             _("COMMERCIAL - RBL+ OpenRelay entries.");
  590.  
  591.         $filters['MAPS RBLplus-DUL']['prefname''filters_spam_maps_rblplus_dul';
  592.         $filters['MAPS RBLplus-DUL']['name''MAPS RBL+ List DUL entries';
  593.         $filters['MAPS RBLplus-DUL']['link''http://www.mail-abuse.org/';
  594.         $filters['MAPS RBLplus-DUL']['dns''rbl-plus.mail-abuse.org';
  595.         $filters['MAPS RBLplus-DUL']['result''127.0.0.3';
  596.         $filters['MAPS RBLplus-DUL']['comment'=
  597.             _("COMMERCIAL - RBL+ Dial-up entries.");
  598.     }
  599.  
  600.     $filters['ORDB']['prefname''filters_spam_ordb';
  601.     $filters['ORDB']['name''Open Relay Database List';
  602.     $filters['ORDB']['link''http://www.ordb.org/';
  603.     $filters['ORDB']['dns''relays.ordb.org';
  604.     $filters['ORDB']['result''127.0.0.2';
  605.     $filters['ORDB']['comment'=
  606.         _("FREE - ORDB was born when ORBS went off the air. It seems to have fewer false positives than ORBS did though.");
  607.  
  608.     $filters['FiveTen Direct']['prefname''filters_spam_fiveten_src';
  609.     $filters['FiveTen Direct']['name''Five-Ten-sg.com Direct SPAM Sources';
  610.     $filters['FiveTen Direct']['link''http://www.five-ten-sg.com/blackhole.php';
  611.     $filters['FiveTen Direct']['dns''blackholes.five-ten-sg.com';
  612.     $filters['FiveTen Direct']['result''127.0.0.2';
  613.     $filters['FiveTen Direct']['comment'=
  614.         _("FREE - Five-Ten-sg.com - Direct SPAM sources.");
  615.  
  616.     $filters['FiveTen DUL']['prefname''filters_spam_fiveten_dul';
  617.     $filters['FiveTen DUL']['name''Five-Ten-sg.com DUL Lists';
  618.     $filters['FiveTen DUL']['link''http://www.five-ten-sg.com/blackhole.php';
  619.     $filters['FiveTen DUL']['dns''blackholes.five-ten-sg.com';
  620.     $filters['FiveTen DUL']['result''127.0.0.3';
  621.     $filters['FiveTen DUL']['comment'=
  622.         _("FREE - Five-Ten-sg.com - Dial-up lists - includes some DSL IPs.");
  623.  
  624.     $filters['FiveTen Unc. OptIn']['prefname''filters_spam_fiveten_oi';
  625.     $filters['FiveTen Unc. OptIn']['name''Five-Ten-sg.com Unconfirmed OptIn Lists';
  626.     $filters['FiveTen Unc. OptIn']['link''http://www.five-ten-sg.com/blackhole.php';
  627.     $filters['FiveTen Unc. OptIn']['dns''blackholes.five-ten-sg.com';
  628.     $filters['FiveTen Unc. OptIn']['result''127.0.0.4';
  629.     $filters['FiveTen Unc. OptIn']['comment'=
  630.         _("FREE - Five-Ten-sg.com - Bulk mailers that do not use confirmed opt-in.");
  631.  
  632.     $filters['FiveTen Others']['prefname''filters_spam_fiveten_oth';
  633.     $filters['FiveTen Others']['name''Five-Ten-sg.com Other Misc. Servers';
  634.     $filters['FiveTen Others']['link''http://www.five-ten-sg.com/blackhole.php';
  635.     $filters['FiveTen Others']['dns''blackholes.five-ten-sg.com';
  636.     $filters['FiveTen Others']['result''127.0.0.5';
  637.     $filters['FiveTen Others']['comment'=
  638.         _("FREE - Five-Ten-sg.com - Other misc. servers.");
  639.  
  640.     $filters['FiveTen Single Stage']['prefname''filters_spam_fiveten_ss';
  641.     $filters['FiveTen Single Stage']['name''Five-Ten-sg.com Single Stage Servers';
  642.     $filters['FiveTen Single Stage']['link''http://www.five-ten-sg.com/blackhole.php';
  643.     $filters['FiveTen Single Stage']['dns''blackholes.five-ten-sg.com';
  644.     $filters['FiveTen Single Stage']['result''127.0.0.6';
  645.     $filters['FiveTen Single Stage']['comment'=
  646.         _("FREE - Five-Ten-sg.com - Single Stage servers.");
  647.  
  648.     $filters['FiveTen SPAM Support']['prefname''filters_spam_fiveten_supp';
  649.     $filters['FiveTen SPAM Support']['name''Five-Ten-sg.com SPAM Support Servers';
  650.     $filters['FiveTen SPAM Support']['link''http://www.five-ten-sg.com/blackhole.php';
  651.     $filters['FiveTen SPAM Support']['dns''blackholes.five-ten-sg.com';
  652.     $filters['FiveTen SPAM Support']['result''127.0.0.7';
  653.     $filters['FiveTen SPAM Support']['comment'=
  654.         _("FREE - Five-Ten-sg.com - SPAM Support servers.");
  655.  
  656.     $filters['FiveTen Web forms']['prefname''filters_spam_fiveten_wf';
  657.     $filters['FiveTen Web forms']['name''Five-Ten-sg.com Web Form IPs';
  658.     $filters['FiveTen Web forms']['link''http://www.five-ten-sg.com/blackhole.php';
  659.     $filters['FiveTen Web forms']['dns''blackholes.five-ten-sg.com';
  660.     $filters['FiveTen Web forms']['result''127.0.0.8';
  661.     $filters['FiveTen Web forms']['comment'=
  662.         _("FREE - Five-Ten-sg.com - Web Form IPs.");
  663.  
  664.     $filters['Dorkslayers']['prefname''filters_spam_dorks';
  665.     $filters['Dorkslayers']['name''Dorkslayers Lists';
  666.     $filters['Dorkslayers']['link''http://www.dorkslayers.com';
  667.     $filters['Dorkslayers']['dns''orbs.dorkslayers.com';
  668.     $filters['Dorkslayers']['result''127.0.0.2';
  669.     $filters['Dorkslayers']['comment'=
  670.         _("FREE - Dorkslayers appears to include only really bad open relays outside the US to avoid being sued. Interestingly enough, their website recommends you NOT use their service.");
  671.  
  672.     $filters['SPAMhaus']['prefname''filters_spam_spamhaus';
  673.     $filters['SPAMhaus']['name''SPAMhaus Lists';
  674.     $filters['SPAMhaus']['link''http://www.spamhaus.org';
  675.     $filters['SPAMhaus']['dns''sbl.spamhaus.org';
  676.     $filters['SPAMhaus']['result''127.0.0.6';
  677.     $filters['SPAMhaus']['comment'=
  678.         _("FREE - SPAMhaus - A list of well-known SPAM sources.");
  679.  
  680.     $filters['SPAMcop']['prefname''filters_spam_spamcop';
  681.     $filters['SPAMcop']['name''SPAM Cop Lists';
  682.     $filters['SPAMcop']['link''http://spamcop.net/bl.shtml';
  683.     $filters['SPAMcop']['dns''bl.spamcop.net';
  684.     $filters['SPAMcop']['result''127.0.0.2';
  685.     $filters['SPAMcop']['comment'=
  686.         _("FREE, for now - SpamCop - An interesting solution that lists servers that have a very high spam to legit email ratio (85 percent or more).");
  687.  
  688.     $filters['dev.null.dk']['prefname''filters_spam_devnull';
  689.     $filters['dev.null.dk']['name''dev.null.dk Lists';
  690.     $filters['dev.null.dk']['link''http://dev.null.dk/';
  691.     $filters['dev.null.dk']['dns''dev.null.dk';
  692.     $filters['dev.null.dk']['result''127.0.0.2';
  693.     $filters['dev.null.dk']['comment'=
  694.         _("FREE - dev.null.dk - I don't have any detailed info on this list.");
  695.  
  696.     $filters['visi.com']['prefname''filters_spam_visi';
  697.     $filters['visi.com']['name''visi.com Relay Stop List';
  698.     $filters['visi.com']['link''http://relays.visi.com';
  699.     $filters['visi.com']['dns''relays.visi.com';
  700.     $filters['visi.com']['result''127.0.0.2';
  701.     $filters['visi.com']['comment'=
  702.         _("FREE - visi.com - Relay Stop List. Very conservative OpenRelay List.");
  703.  
  704.     $filters['ahbl.org Open Relays']['prefname''filters_spam_2mb_or';
  705.     $filters['ahbl.org Open Relays']['name''ahbl.org Open Relays List';
  706.     $filters['ahbl.org Open Relays']['link''http://www.ahbl.org/';
  707.     $filters['ahbl.org Open Relays']['dns''dnsbl.ahbl.org';
  708.     $filters['ahbl.org Open Relays']['result''127.0.0.2';
  709.     $filters['ahbl.org Open Relays']['comment'=
  710.         _("FREE - ahbl.org Open Relays - Another list of Open Relays.");
  711.  
  712.     $filters['ahbl.org SPAM Source']['prefname''filters_spam_2mb_ss';
  713.     $filters['ahbl.org SPAM Source']['name''ahbl.org SPAM Source List';
  714.     $filters['ahbl.org SPAM Source']['link''http://www.ahbl.org/';
  715.     $filters['ahbl.org SPAM Source']['dns''dnsbl.ahbl.org';
  716.     $filters['ahbl.org SPAM Source']['result''127.0.0.4';
  717.     $filters['ahbl.org SPAM Source']['comment'=
  718.         _("FREE - ahbl.org SPAM Source - List of Direct SPAM Sources.");
  719.  
  720.     $filters['ahbl.org SPAM ISPs']['prefname''filters_spam_2mb_isp';
  721.     $filters['ahbl.org SPAM ISPs']['name''ahbl.org SPAM-friendly ISP List';
  722.     $filters['ahbl.org SPAM ISPs']['link''http://www.ahbl.org/';
  723.     $filters['ahbl.org SPAM ISPs']['dns''dnsbl.ahbl.org';
  724.     $filters['ahbl.org SPAM ISPs']['result''127.0.0.7';
  725.     $filters['ahbl.org SPAM ISPs']['comment'=
  726.         _("FREE - ahbl.org SPAM ISPs - List of SPAM-friendly ISPs.");
  727.  
  728.     $filters['Leadmon DUL']['prefname''filters_spam_lm_dul';
  729.     $filters['Leadmon DUL']['name''Leadmon.net DUL List';
  730.     $filters['Leadmon DUL']['link''http://www.leadmon.net/spamguard/';
  731.     $filters['Leadmon DUL']['dns''spamguard.leadmon.net';
  732.     $filters['Leadmon DUL']['result''127.0.0.2';
  733.     $filters['Leadmon DUL']['comment'=
  734.         _("FREE - Leadmon DUL - Another list of Dial-up or otherwise dynamically assigned IPs.");
  735.  
  736.     $filters['Leadmon SPAM Source']['prefname''filters_spam_lm_ss';
  737.     $filters['Leadmon SPAM Source']['name''Leadmon.net SPAM Source List';
  738.     $filters['Leadmon SPAM Source']['link''http://www.leadmon.net/spamguard/';
  739.     $filters['Leadmon SPAM Source']['dns''spamguard.leadmon.net';
  740.     $filters['Leadmon SPAM Source']['result''127.0.0.3';
  741.     $filters['Leadmon SPAM Source']['comment'=
  742.         _("FREE - Leadmon SPAM Source - List of IPs Leadmon.net has received SPAM directly from.");
  743.  
  744.     $filters['Leadmon Bulk Mailers']['prefname''filters_spam_lm_bm';
  745.     $filters['Leadmon Bulk Mailers']['name''Leadmon.net Bulk Mailers List';
  746.     $filters['Leadmon Bulk Mailers']['link''http://www.leadmon.net/spamguard/';
  747.     $filters['Leadmon Bulk Mailers']['dns''spamguard.leadmon.net';
  748.     $filters['Leadmon Bulk Mailers']['result''127.0.0.4';
  749.     $filters['Leadmon Bulk Mailers']['comment'=
  750.         _("FREE - Leadmon Bulk Mailers - Bulk mailers that do not require confirmed opt-in or that have allowed known spammers to become clients and abuse their services.");
  751.  
  752.     $filters['Leadmon Open Relays']['prefname''filters_spam_lm_or';
  753.     $filters['Leadmon Open Relays']['name''Leadmon.net Open Relays List';
  754.     $filters['Leadmon Open Relays']['link''http://www.leadmon.net/spamguard/';
  755.     $filters['Leadmon Open Relays']['dns''spamguard.leadmon.net';
  756.     $filters['Leadmon Open Relays']['result''127.0.0.5';
  757.     $filters['Leadmon Open Relays']['comment'=
  758.         _("FREE - Leadmon Open Relays - Single Stage Open Relays that are not listed on other active RBLs.");
  759.  
  760.     $filters['Leadmon Multi-stage']['prefname''filters_spam_lm_ms';
  761.     $filters['Leadmon Multi-stage']['name''Leadmon.net Multi-Stage Relay List';
  762.     $filters['Leadmon Multi-stage']['link''http://www.leadmon.net/spamguard/';
  763.     $filters['Leadmon Multi-stage']['dns''spamguard.leadmon.net';
  764.     $filters['Leadmon Multi-stage']['result''127.0.0.6';
  765.     $filters['Leadmon Multi-stage']['comment'=
  766.         _("FREE - Leadmon Multi-stage - Multi-Stage Open Relays that are not listed on other active RBLs and that have sent SPAM to Leadmon.net.");
  767.  
  768.     $filters['Leadmon SpamBlock']['prefname''filters_spam_lm_sb';
  769.     $filters['Leadmon SpamBlock']['name''Leadmon.net SpamBlock Sites List';
  770.     $filters['Leadmon SpamBlock']['link''http://www.leadmon.net/spamguard/';
  771.     $filters['Leadmon SpamBlock']['dns''spamguard.leadmon.net';
  772.     $filters['Leadmon SpamBlock']['result''127.0.0.7';
  773.     $filters['Leadmon SpamBlock']['comment'=
  774.         _("FREE - Leadmon SpamBlock - Sites on this listing have sent Leadmon.net direct SPAM from IPs in netblocks where the entire block has no DNS mappings. It's a list of BLOCKS of IPs being used by people who have SPAMmed Leadmon.net.");
  775.  
  776.     $filters['NJABL Open Relays']['prefname''filters_spam_njabl_or';
  777.     $filters['NJABL Open Relays']['name''NJABL Open Relay/Direct Spam Source List';
  778.     $filters['NJABL Open Relays']['link''http://www.njabl.org/';
  779.     $filters['NJABL Open Relays']['dns''dnsbl.njabl.org';
  780.     $filters['NJABL Open Relays']['result''127.0.0.2';
  781.     $filters['NJABL Open Relays']['comment'=
  782.         _("FREE, for now - Not Just Another Blacklist - Both Open Relays and Direct SPAM Sources.");
  783.  
  784.     $filters['NJABL DUL']['prefname''filters_spam_njabl_dul';
  785.     $filters['NJABL DUL']['name''NJABL Dial-ups List';
  786.     $filters['NJABL DUL']['link''http://www.njabl.org/';
  787.     $filters['NJABL DUL']['dns''dnsbl.njabl.org';
  788.     $filters['NJABL DUL']['result''127.0.0.3';
  789.     $filters['NJABL DUL']['comment'=
  790.         _("FREE, for now - Not Just Another Blacklist - Dial-up IPs.");
  791.  
  792.     $filters['Conf DSBL.ORG Relay']['prefname''filters_spam_dsbl_conf_ss';
  793.     $filters['Conf DSBL.ORG Relay']['name''DSBL.org Confirmed Relay List';
  794.     $filters['Conf DSBL.ORG Relay']['link''http://www.dsbl.org/';
  795.     $filters['Conf DSBL.ORG Relay']['dns''list.dsbl.org';
  796.     $filters['Conf DSBL.ORG Relay']['result''127.0.0.2';
  797.     $filters['Conf DSBL.ORG Relay']['comment'=
  798.         _("FREE - Distributed Sender Boycott List - Confirmed Relays");
  799.  
  800.     $filters['Conf DSBL.ORG Multi-Stage']['prefname''filters_spam_dsbl_conf_ms';
  801.     $filters['Conf DSBL.ORG Multi-Stage']['name''DSBL.org Confirmed Multi-Stage Relay List';
  802.     $filters['Conf DSBL.ORG Multi-Stage']['link''http://www.dsbl.org/';
  803.     $filters['Conf DSBL.ORG Multi-Stage']['dns''multihop.dsbl.org';
  804.     $filters['Conf DSBL.ORG Multi-Stage']['result''127.0.0.2';
  805.     $filters['Conf DSBL.ORG Multi-Stage']['comment'=
  806.         _("FREE - Distributed Sender Boycott List - Confirmed Multi-stage Relays");
  807.  
  808.     $filters['UN-Conf DSBL.ORG']['prefname''filters_spam_dsbl_unc';
  809.     $filters['UN-Conf DSBL.ORG']['name''DSBL.org UN-Confirmed Relay List';
  810.     $filters['UN-Conf DSBL.ORG']['link''http://www.dsbl.org/';
  811.     $filters['UN-Conf DSBL.ORG']['dns''unconfirmed.dsbl.org';
  812.     $filters['UN-Conf DSBL.ORG']['result''127.0.0.2';
  813.     $filters['UN-Conf DSBL.ORG']['comment'=
  814.         _("FREE - Distributed Sender Boycott List - UN-Confirmed Relays");
  815.  
  816.     foreach ($filters as $Key => $Value{
  817.         $filters[$Key]['enabled'getPref($data_dir$username,
  818.             $filters[$Key]['prefname']);
  819.     }
  820.  
  821.     return $filters;
  822. }
  823.  
  824. /**
  825.  * FIXME: Undocumented function
  826.  * @access private
  827.  */
  828. function remove_filter ($id{
  829.     global $data_dir$username;
  830.  
  831.     while ($nextFilter getPref($data_dir$username'filter' .
  832.         ($id 1))) {
  833.         setPref($data_dir$username'filter' $id$nextFilter);
  834.         $id ++;
  835.     }
  836.  
  837.     removePref($data_dir$username'filter' $id);
  838. }
  839.  
  840. /**
  841.  * FIXME: Undocumented function
  842.  * @access private
  843.  */
  844. function filter_swap($id1$id2{
  845.     global $data_dir$username;
  846.  
  847.     $FirstFilter getPref($data_dir$username'filter' $id1);
  848.     $SecondFilter getPref($data_dir$username'filter' $id2);
  849.  
  850.     if ($FirstFilter && $SecondFilter{
  851.         setPref($data_dir$username'filter' $id2$FirstFilter);
  852.         setPref($data_dir$username'filter' $id1$SecondFilter);
  853.     }
  854. }
  855.  
  856. /**
  857.  * This update the filter rules when renaming or deleting folders
  858.  * @param array $args 
  859.  * @access private
  860.  */
  861. function update_for_folder ($args{
  862.     $old_folder $args[0];
  863.         $new_folder $args[2];
  864.         $action $args[1];
  865.     global $plugins$data_dir$username;
  866.     $filters array();
  867.     $filters load_filters();
  868.     $filter_count count($filters);
  869.     $p 0;
  870.     for ($i=0;$i<$filter_count;$i++{
  871.         if (!empty($filters)) {
  872.             if ($old_folder == $filters[$i]['folder']{
  873.                 if ($action == 'rename'{
  874.                     $filters[$i]['folder'$new_folder;
  875.                     setPref($data_dir$username'filter'.$i,
  876.                     $filters[$i]['where'].','.$filters[$i]['what'].','.$new_folder);
  877.                 }
  878.                 elseif ($action == 'delete'{
  879.                     remove_filter($p);
  880.                     $p $p-1;
  881.                 }
  882.             }
  883.         $p++;
  884.         }
  885.     }
  886. }
  887.  
  888. /**
  889.  * Display formated error message
  890.  * @param string $string text message
  891.  * @return string html formated text message
  892.  * @access private
  893.  */
  894. function do_error($string{
  895.     global $color;
  896.     echo "<p align=\"center\"><font color=\"$color[2]\">";
  897.     echo $string;
  898.     echo "</font></p>\n";
  899. }
  900. ?>

Documentation generated on Sat, 07 Oct 2006 16:31:13 +0300 by phpDocumentor 1.3.0RC6