Patches from Michael Long
[squirrelmail.git] / plugins / filters / filters.php
index be2c1a053e1a6513b6683c43961d9d2bb175f59e..ea01c2d0dc8615d94140587067d8ad84f8c491b0 100644 (file)
@@ -1,17 +1,44 @@
 <?php
+
 /**
  * Message and Spam Filter Plugin - Filtering Functions
  *
- * @version $Id$
- * @copyright (c) 1999-2005 The SquirrelMail Project Team
+ * @copyright &copy; 1999-2006 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
+ * @version $Id$
  * @package plugins
  * @subpackage filters
  */
 
-/** load config */
-if (file_exists(SM_PATH . 'plugins/filters/config.php'))
+/** @ignore */
+if (! defined('SM_PATH')) define('SM_PATH','../../');
+
+/** load globals */
+global $UseSeparateImapConnection,
+    $AllowSpamFilters, $SpamFilters_YourHop, $SpamFilters_ShowCommercial,
+    $SpamFilters_DNScache, $SpamFilters_BulkQuery, $SpamFilters_SharedCache,
+    $SpamFilters_CacheTTL;
+
+/** load default config */
+if (file_exists(SM_PATH . 'plugins/filters/config_default.php')) {
+    include_once (SM_PATH . 'plugins/filters/config_default.php');
+} else {
+    // default config was removed.
+    $UseSeparateImapConnection = false;
+    $AllowSpamFilters = true;
+    $SpamFilters_YourHop = ' ';
+    $SpamFilters_ShowCommercial = false;
+    $SpamFilters_DNScache = array();
+    $SpamFilters_BulkQuery = '';
+    $SpamFilters_SharedCache = true;
+    $SpamFilters_CacheTTL = 7200;
+}
+
+if (file_exists(SM_PATH . 'config/filters_config.php')) {
+    include_once (SM_PATH . 'config/filters_config.php');
+} elseif (file_exists(SM_PATH . 'plugins/filters/config.php')) {
     include_once (SM_PATH . 'plugins/filters/config.php');
+}
 
 /**
  * Init Hooks
@@ -19,10 +46,8 @@ if (file_exists(SM_PATH . 'plugins/filters/config.php'))
  */
 function filters_init_hooks () {
     global $squirrelmail_plugin_hooks;
-    if (!file_exists(SM_PATH . 'plugins/filters/config.php')) return;
-    if (sqgetGlobalVar('mailbox',$mailbox,SQ_FORM)) {
-        sqgetGlobalVar('mailbox',$mailbox,SQ_FORM);
-    } else {
+
+    if (! sqgetGlobalVar('mailbox',$mailbox,SQ_FORM)) {
         $mailbox = 'INBOX';
     }
 
@@ -34,6 +59,7 @@ function filters_init_hooks () {
     $squirrelmail_plugin_hooks['special_mailbox']['filters'] = 'filters_special_mailbox';
     $squirrelmail_plugin_hooks['rename_or_delete_folder']['filters'] = 'update_for_folder_hook';
     $squirrelmail_plugin_hooks['webmail_bottom']['filters'] = 'start_filters_hook';
+    $squirrelmail_plugin_hooks['folder_status']['filters'] = 'filters_folder_status';
 }
 
 /**
@@ -42,8 +68,7 @@ function filters_init_hooks () {
  */
 function filters_optpage_register_block() {
     global $optpage_blocks, $AllowSpamFilters;
-    if (!file_exists(SM_PATH . 'plugins/filters/config.php')) return;
-    
+
     $optpage_blocks[] = array(
         'name' => _("Message Filters"),
         'url'  => SM_PATH . 'plugins/filters/options.php',
@@ -61,6 +86,22 @@ function filters_optpage_register_block() {
     }
 }
 
+/* Receive the status of the folder and do something with it */
+function filters_folder_status($statusarr) {
+
+       global $filter_inbox_count;
+       if (empty($filter_inbox_count)) $filter_inbox_count=0;
+
+    //echo "GOT HOOK<br><pre>";
+    //var_dump($statusarr);
+    //echo "</pre><br>\n";
+
+       if ($statusarr['MAILBOX'] == 'INBOX')
+    {
+     if (!empty($statusarr['MESSAGES'])) $filter_inbox_count=$statusarr['MESSAGES'];
+    }
+}
+
 /**
  * Saves the DNS Cache to disk
  * @access private
@@ -163,20 +204,37 @@ function filters_bulkquery($filters, $IPs) {
  */
 function start_filters() {
     global $imapServerAddress, $imapPort, $imap_stream, $imapConnection,
-           $UseSeparateImapConnection, $AllowSpamFilters;
-           
-    if (!file_exists(SM_PATH . 'plugins/filters/config.php')) return;
-    
+           $UseSeparateImapConnection, $AllowSpamFilters, $filter_inbox_count;
+
     sqgetGlobalVar('username', $username, SQ_SESSION);
     sqgetGlobalVar('key',      $key,      SQ_COOKIE);
 
+    $filters = load_filters();
+
+    // No point running spam filters if there aren't any to run //
+    if ($AllowSpamFilters) {
+        $spamfilters = load_spam_filters();
+
+        $AllowSpamFilters = false;
+        foreach($spamfilters as $filterskey=>$value) {
+            if ($value['enabled'] == 'yes') {
+                $AllowSpamFilters = true;
+                break;
+            }
+        }
+    }
+
+    if (!$AllowSpamFilters && empty($filters)) {
+        return;
+    }
+
+
     // Detect if we have already connected to IMAP or not.
     // Also check if we are forced to use a separate IMAP connection
     if ((!isset($imap_stream) && !isset($imapConnection)) ||
         $UseSeparateImapConnection ) {
-            $stream = sqimap_login($username, $key, $imapServerAddress,
-                                $imapPort, 10);
-            $previously_connected = false;
+        $stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, 10);
+        $previously_connected = false;
     } else if (isset($imapConnection)) {
         $stream = $imapConnection;
         $previously_connected = true;
@@ -184,9 +242,17 @@ function start_filters() {
         $previously_connected = true;
         $stream = $imap_stream;
     }
-    $aStatus = sqimap_status_messages ($stream, 'INBOX', array('MESSAGES'));
 
-    if ($aStatus['MESSAGES']) {
+    if (!isset($filter_inbox_count)) {
+        $aStatus = sqimap_status_messages ($stream, 'INBOX', array('MESSAGES'));
+        if (!empty($aStatus['MESSAGES'])) {
+            $filter_inbox_count=$aStatus['MESSAGES'];
+        } else {
+            $filter_inbox_count=0;
+        }
+    }
+
+    if ($filter_inbox_count > 0) {
         sqimap_mailbox_select($stream, 'INBOX');
         // Filter spam from inbox before we sort them into folders
         if ($AllowSpamFilters) {
@@ -231,7 +297,7 @@ function user_filters($imap_stream) {
                   $filters[$i]['what'], $filters[$i]['folder'], $filters_user_scan, $expunge);
         } else if ($filters[$i]['where'] == 'Message Body') {
             $expunge = filter_search_and_delete($imap_stream, 'BODY',
-                  $filters[$i]['what'], $filters[$i]['folder'], $filters_user_scan, $expunge);                  
+                  $filters[$i]['what'], $filters[$i]['folder'], $filters_user_scan, $expunge);
         } else {
             /*
             *  If it's a normal TO, CC, SUBJECT, or FROM, then handle it
@@ -254,7 +320,7 @@ function user_filters($imap_stream) {
  * @param string $what String to search for
  * @param string $where_to Folder it will move to
  * @param string $user_scan Whether to search all or just unseen
- * @param string $should_expunge 
+ * @param string $should_expunge
  * @param boolean $where Which part of location to search
  * @access private
  */
@@ -293,7 +359,7 @@ function filter_search_and_delete($imap_stream, $where, $what, $where_to, $user_
         $search_str .= ' ' . $where . ' ' . $what;
     } else {
         $search_str .= ' ' . $where . ' {' . strlen($what) . "}\r\n"
-                    . $what . "\r\n";
+                    . $what;
     }
 
     /* read data back from IMAP */
@@ -800,7 +866,7 @@ function remove_filter ($id) {
 /**
  * Swaps two filters
  * @param int $id1 ID of first filter to swap
- * @param int $id2 ID of second filter to swap 
+ * @param int $id2 ID of second filter to swap
  * @access private
  */
 function filter_swap($id1, $id2) {
@@ -822,8 +888,6 @@ function filter_swap($id1, $id2) {
  */
 function update_for_folder ($args) {
 
-    if (!file_exists(SM_PATH . 'plugins/filters/config.php')) return;
-    
     $old_folder = $args[0];
     $new_folder = $args[2];
     $action = $args[1];
@@ -863,4 +927,4 @@ function do_error($string) {
     echo "</font></p>\n";
 }
 
-?>
\ No newline at end of file
+?>