X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=plugins%2Ffilters%2Ffilters.php;h=995adf2e1ff4a43c6909e1cbf3c19f58d1a69e70;hp=be2c1a053e1a6513b6683c43961d9d2bb175f59e;hb=5d55011bdf7fe06a1f88c5502f44a4f5a245b4cb;hpb=15d98101f0c2b3cae541e1e8de0f5edfaa820965 diff --git a/plugins/filters/filters.php b/plugins/filters/filters.php index be2c1a05..995adf2e 100644 --- a/plugins/filters/filters.php +++ b/plugins/filters/filters.php @@ -1,39 +1,55 @@ _("Message Filters"), 'url' => SM_PATH . 'plugins/filters/options.php', @@ -61,6 +76,18 @@ 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; + + if ($statusarr['MAILBOX'] == 'INBOX') + { + if (!empty($statusarr['MESSAGES'])) $filter_inbox_count=$statusarr['MESSAGES']; + } +} + /** * Saves the DNS Cache to disk * @access private @@ -159,22 +186,49 @@ function filters_bulkquery($filters, $IPs) { /** * Starts the filtering process + * @param array $hook_args (since 1.5.2) 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; - - if (!file_exists(SM_PATH . 'plugins/filters/config.php')) return; - - sqgetGlobalVar('username', $username, SQ_SESSION); - sqgetGlobalVar('key', $key, SQ_COOKIE); + $UseSeparateImapConnection, $AllowSpamFilters, $filter_inbox_count, + $username; + + /** + * 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 // + 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, + $stream = sqimap_login($username, false, $imapServerAddress, $imapPort, 10); $previously_connected = false; } else if (isset($imapConnection)) { @@ -184,9 +238,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 +293,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 +316,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 */ @@ -262,6 +324,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(); } @@ -284,26 +348,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 . "\r\n"; + $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)) { @@ -311,6 +390,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') { + $query = $search_str . "\r\n".$what ."\r\n"; + if ($response == 'NO') { + 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; @@ -558,14 +649,6 @@ function load_spam_filters() { _("COMMERCIAL - RBL+ Dial-up entries."); } - $filters['ORDB']['prefname'] = 'filters_spam_ordb'; - $filters['ORDB']['name'] = 'Open Relay Database List'; - $filters['ORDB']['link'] = 'http://www.ordb.org/'; - $filters['ORDB']['dns'] = 'relays.ordb.org'; - $filters['ORDB']['result'] = '127.0.0.2'; - $filters['ORDB']['comment'] = - _("FREE - ORDB was born when ORBS went off the air. It seems to have fewer false positives than ORBS did though."); - $filters['FiveTen Direct']['prefname'] = 'filters_spam_fiveten_src'; $filters['FiveTen Direct']['name'] = 'Five-Ten-sg.com Direct SPAM Sources'; $filters['FiveTen Direct']['link'] = 'http://www.five-ten-sg.com/blackhole.php'; @@ -800,7 +883,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 +905,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]; @@ -862,5 +943,3 @@ function do_error($string) { echo $string; echo "

\n"; } - -?> \ No newline at end of file