X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=plugins%2Ffilters%2Ffilters.php;h=43ad4f32fafeb0f44980a2614790ac253fcaaef8;hb=348bd627109cf3dc66dafa24c31cb56f9a2c8b05;hp=7470d789957df6284aaf4a7c96704510370b4e29;hpb=47ccfad452e8d345542d09e59112cac317cffed8;p=squirrelmail.git diff --git a/plugins/filters/filters.php b/plugins/filters/filters.php index 7470d789..43ad4f32 100644 --- a/plugins/filters/filters.php +++ b/plugins/filters/filters.php @@ -14,9 +14,9 @@ if (! defined('SM_PATH')) define('SM_PATH','../../'); /** load globals */ -global $UseSeparateImapConnection, - $AllowSpamFilters, $SpamFilters_YourHop, $SpamFilters_ShowCommercial, - $SpamFilters_DNScache, $SpamFilters_BulkQuery, $SpamFilters_SharedCache, +global $UseSeparateImapConnection, + $AllowSpamFilters, $SpamFilters_YourHop, $SpamFilters_ShowCommercial, + $SpamFilters_DNScache, $SpamFilters_BulkQuery, $SpamFilters_SharedCache, $SpamFilters_CacheTTL; /** load default config */ @@ -40,27 +40,6 @@ if (file_exists(SM_PATH . 'config/filters_config.php')) { include_once (SM_PATH . 'plugins/filters/config.php'); } -/** - * Init Hooks - * @access private - */ -function filters_init_hooks () { - global $squirrelmail_plugin_hooks; - - if (! sqgetGlobalVar('mailbox',$mailbox,SQ_FORM)) { - $mailbox = 'INBOX'; - } - - $squirrelmail_plugin_hooks['left_main_before']['filters'] = 'start_filters_hook'; - if (isset($mailbox) && $mailbox == 'INBOX') { - $squirrelmail_plugin_hooks['right_main_after_header']['filters'] = 'start_filters_hook'; - } - $squirrelmail_plugin_hooks['optpage_register_block']['filters'] = 'filters_optpage_register_block_hook'; - $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'; -} - /** * Register option blocks * @access private @@ -85,6 +64,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
";
+    //var_dump($statusarr);
+    //echo "

\n"; + + if ($statusarr['MAILBOX'] == 'INBOX') + { + if (!empty($statusarr['MESSAGES'])) $filter_inbox_count=$statusarr['MESSAGES']; + } +} + /** * Saves the DNS Cache to disk * @access private @@ -183,15 +178,25 @@ function filters_bulkquery($filters, $IPs) { /** * Starts the filtering process + * @param array $hook_args do hook arguments. Is used to check hook name, array key = 0. * @access private */ -function start_filters() { +function start_filters($hook_args) { global $imapServerAddress, $imapPort, $imap_stream, $imapConnection, - $UseSeparateImapConnection, $AllowSpamFilters; + $UseSeparateImapConnection, $AllowSpamFilters, $filter_inbox_count; sqgetGlobalVar('username', $username, SQ_SESSION); sqgetGlobalVar('key', $key, SQ_COOKIE); + /** + * check hook that calls filtering. If filters are called by right_main_after_header, + * do filtering only when we are in INBOX folder. + */ + if ($hook_args[0]=='right_main_after_header' && + (sqgetGlobalVar('mailbox',$mailbox,SQ_FORM) && $mailbox!='INBOX')) { + return; + } + $filters = load_filters(); // No point running spam filters if there aren't any to run // @@ -226,9 +231,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) { @@ -304,6 +317,8 @@ function filter_search_and_delete($imap_stream, $where, $what, $where_to, $user_ $should_expunge) { global $languages, $squirrelmail_language, $allow_charset_search, $imap_server_type; + //TODO: make use of new mailbox cache. See mailbox_display.phpinfo + if (strtolower($where_to) == 'inbox') { return array(); } @@ -326,26 +341,41 @@ function filter_search_and_delete($imap_stream, $where, $what, $where_to, $user_ } if ($where == 'Header') { $what = explode(':', $what); + $where = strtoupper($where); $where = trim($where . ' ' . $what[0]); $what = addslashes(trim($what[1])); } // see comments in squirrelmail sqimap_search function if ($imap_server_type == 'macosx' || $imap_server_type == 'hmailserver') { - $search_str .= ' ' . $where . ' ' . $what; + $search_str .= ' ' . $where . ' ' . $what; + /* read data back from IMAP */ + $read = sqimap_run_command($imap_stream, $search_str, true, $response, $message, TRUE); } else { - $search_str .= ' ' . $where . ' {' . strlen($what) . "}\r\n" - . $what; + $search_str .= ' ' . $where . ' {' . strlen($what) . "}"; + $sid = sqimap_session_id(true); + fputs ($imap_stream, $sid . ' ' . $search_str . "\r\n"); + $read2 = sqimap_fgets($imap_stream); + # server should respond with Ready for argument, then we will send search text + #echo "RR2 $read2
"; + fputs ($imap_stream, "$what\r\n"); + #echo "SS $what
"; + $read2 = sqimap_fgets($imap_stream); + #echo "RR2 $read2
"; + $read[]=$read2; + $read3 = sqimap_fgets($imap_stream); + #echo "RR3 $read3
"; + list($rtag,$response,$message)=explode(' ',$read3,3); +## $read2 = sqimap_retrieve_imap_response($imap_stream, $sid, true, +## $response, $message, $search_str, false, true, false); + #echo "RR2 $read2 / RESPONSE $response
"; } - /* read data back from IMAP */ - $read = sqimap_run_command($imap_stream, $search_str, true, $response, $message, TRUE); if (isset($read[0])) { $ids = array(); for ($i = 0, $iCnt = count($read); $i < $iCnt; ++$i) { if (preg_match("/^\* SEARCH (.+)$/", $read[$i], $regs)) { - $ids = preg_split("/ /", trim($regs[1])); - break; + $ids += preg_split("/ /", trim($regs[1])); } } if ($response == 'OK' && count($ids)) { @@ -353,6 +383,18 @@ function filter_search_and_delete($imap_stream, $where, $what, $where_to, $user_ $should_expunge = true; sqimap_msgs_list_move ($imap_stream, $ids, $where_to, false); } + } elseif ($response != 'OK') { + if ($response == 'NO') { + $query = $search_str . "\r\n".$what ."\r\n"; + if (strpos($message,'BADCHARSET') !== false || + strpos($message,'character') !== false) { + sqm_trigger_imap_error('SQM_IMAP_BADCHARSET',$query, $response, $message); + } else { + sqm_trigger_imap_error('SQM_IMAP_ERROR',$query, $response, $message); + } + } else { + sqm_trigger_imap_error('SQM_IMAP_ERROR',$query, $response, $message); + } } } return $should_expunge;