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;