diff --git a/include/class.filter.php b/include/class.filter.php index bbf8e5a24a08506d21fcdf77676970bf9085af6e..8a24e8cd3f3bf6f18c498f51b967a8e999335b86 100644 --- a/include/class.filter.php +++ b/include/class.filter.php @@ -224,18 +224,10 @@ class Filter { * headers - array of email headers * emailId - osTicket system email id */ - function matches($info) { + function matches($what) { - if(!$info || !is_array($info)) return false; + if(!$what || !is_array($what)) return false; - $what = array( - 'email' => $info['email'], - 'subject' => $info['subject'], - # XXX: Support reply-to too ? - 'name' => $info['name'], - 'body' => $info['message'] - # XXX: Support headers - ); $how = array( # how => array(function, null or === this, null or !== this) 'equal' => array('strcmp', 0), @@ -248,7 +240,7 @@ class Filter { # Respect configured filter email-id if ($this->getEmailId() && !strcasecmp($this->getTarget(), 'Email') - && $this->getEmailId() != $info['emailId']) + && $this->getEmailId() != $what['emailId']) return false; foreach ($this->getRules() as $rule) { @@ -271,6 +263,7 @@ class Filter { } } } + return $match; } /** @@ -644,10 +637,20 @@ class TicketFilter { */ function TicketFilter($origin, $vars=null) { + //Normalize the target based on ticket's origin. $this->target = self::origin2target($origin); - $this->vars = ($vars && is_array($vars))?array_filter(array_map('trim', $vars)):null; - - //Init filters. + + //Extract the vars we care about (fields we filter by!). + $this->vars = array_filter(array_map('trim', + array( + 'email' => $vars['email'], + 'subject' => $vars['subject'], + 'name' => $vars['name'], + 'body' => $vars['message'], + 'emailId' => $vars['emailId']) + )); + + //Init filters. $this->build(); } @@ -720,8 +723,13 @@ class TicketFilter { $sql='SELECT id FROM '.FILTER_TABLE .' WHERE isactive=1 ' - .' AND target IN ("Any", '.db_input($this->getTarget()).') ' - .' ORDER BY execorder'; + .' AND target IN ("Any", '.db_input($this->getTarget()).') '; + + #Take into account email ID. + if($this->vars['emailId']) + $sql.=' AND (email_id=0 OR email_id='.db_input($this->vars['emailId']).')'; + + $sql.=' ORDER BY execorder'; return db_query($sql); } @@ -771,6 +779,8 @@ class TicketFilter { $sql.=" OR (what='name' AND LOCATE(val, ".db_input($this->vars['name']).'))'; if($this->vars['subject']) $sql.=" OR (what='subject' AND LOCATE(val, ".db_input($this->vars['subject']).'))'; + + # Also include filters that do not have any rules concerning either # sender-email-addresses or sender-names or subjects $sql.=") OR filter.id IN (" @@ -785,7 +795,7 @@ class TicketFilter { if (!$this->vars['name']) $sql.=" AND COUNT(*)-COUNT(NULLIF(what,'name'))=0"; if (!$this->vars['subject']) $sql.=" AND COUNT(*)-COUNT(NULLIF(what,'subject'))=0"; # Also include filters that do not have match_all_rules set to and - # have at least one rule 'what' type that wasn't considered + # have at least one rule 'what' type that wasn't considered e.g body $sql.=") OR filter.id IN (" ." SELECT filter_id" ." FROM ".FILTER_RULE_TABLE." rule" @@ -800,7 +810,7 @@ class TicketFilter { .") AND filter.match_all_rules = 0 " # Return filters in declared execution order .") ORDER BY filter.execorder"; - + return db_query($sql); } /**