Exemple #1
0
 /**
  * @return Model_WatcherMailFilter[]|false
  */
 static function getMatches(CerberusTicket $ticket, $event, $only_worker_id = null)
 {
     $matches = array();
     if (!empty($only_worker_id)) {
         $filters = DAO_WatcherMailFilter::getWhere(sprintf("%s = %d AND %s = %d", DAO_WatcherMailFilter::WORKER_ID, $only_worker_id, DAO_WatcherMailFilter::IS_DISABLED, 0));
     } else {
         $filters = DAO_WatcherMailFilter::getWhere(sprintf("%s = %d", DAO_WatcherMailFilter::IS_DISABLED, 0));
     }
     // [JAS]: Don't send obvious spam to watchers.
     if ($ticket->spam_score >= 0.9) {
         return false;
     }
     // Build our objects
     $ticket_from = DAO_Address::get($ticket->last_wrote_address_id);
     $ticket_group_id = $ticket->team_id;
     // [TODO] These expensive checks should only populate when needed
     $messages = DAO_Ticket::getMessagesByTicket($ticket->id);
     $message_headers = array();
     if (empty($messages)) {
         return false;
     }
     if (null != @($message_last = array_pop($messages))) {
         /* @var $message_last CerberusMessage */
         $message_headers = $message_last->getHeaders();
     }
     // Clear the rest of the message manifests
     unset($messages);
     $custom_fields = DAO_CustomField::getAll();
     // Lazy load when needed on criteria basis
     $ticket_field_values = null;
     $address_field_values = null;
     $org_field_values = null;
     // Worker memberships (for checking permissions)
     $workers = DAO_Worker::getAll();
     $group_rosters = DAO_Group::getRosters();
     // Check filters
     if (is_array($filters)) {
         foreach ($filters as $filter) {
             /* @var $filter Model_WatcherMailFilter */
             $passed = 0;
             // check the worker's group memberships
             if (!isset($workers[$filter->worker_id]) || $workers[$filter->worker_id]->is_disabled || !$workers[$filter->worker_id]->is_superuser && !isset($group_rosters[$ticket->team_id][$filter->worker_id])) {
                 // no membership
                 continue;
             }
             // check criteria
             foreach ($filter->criteria as $rule_key => $rule) {
                 @($value = $rule['value']);
                 switch ($rule_key) {
                     case 'dayofweek':
                         $current_day = strftime('%w');
                         //$current_day = 1;
                         // Forced to English abbrevs as indexes
                         $days = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
                         // Is the current day enabled?
                         if (isset($rule[$days[$current_day]])) {
                             $passed++;
                         }
                         break;
                     case 'timeofday':
                         $current_hour = strftime('%H');
                         $current_min = strftime('%M');
                         //$current_hour = 17;
                         //$current_min = 5;
                         if (null != ($from_time = @$rule['from'])) {
                             list($from_hour, $from_min) = explode(':', $from_time);
                         }
                         if (null != ($to_time = @$rule['to'])) {
                             if (list($to_hour, $to_min) = explode(':', $to_time)) {
                             }
                         }
                         // Do we need to wrap around to the next day's hours?
                         if ($from_hour > $to_hour) {
                             // yes
                             $to_hour += 24;
                             // add 24 hrs to the destination (1am = 25th hour)
                         }
                         // Are we in the right 24 hourly range?
                         if ((int) $current_hour >= $from_hour && (int) $current_hour <= $to_hour) {
                             // If we're in the first hour, are we minutes early?
                             if ($current_hour == $from_hour && (int) $current_min < $from_min) {
                                 break;
                             }
                             // If we're in the last hour, are we minutes late?
                             if ($current_hour == $to_hour && (int) $current_min > $to_min) {
                                 break;
                             }
                             $passed++;
                         }
                         break;
                     case 'event':
                         if (!empty($event) && is_array($rule) && isset($rule[$event])) {
                             $passed++;
                         }
                         break;
                     case 'groups':
                         if (null !== @($group_buckets = $rule['groups'][$ticket->team_id]) && (empty($group_buckets) || in_array($ticket->category_id, $group_buckets))) {
                             $passed++;
                         }
                         break;
                     case 'next_worker_id':
                         // If it's an assigned event, we only care about the filter's owner
                         if (!empty($event) && 0 == strcasecmp($event, 'ticket_assignment')) {
                             if (intval($value) == intval($filter->worker_id)) {
                                 $passed++;
                                 break;
                             }
                         }
                         if (intval($value) == intval($ticket->next_worker_id)) {
                             $passed++;
                         }
                         break;
                     case 'mask':
                         $regexp_mask = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_mask, $ticket->mask)) {
                             $passed++;
                         }
                         break;
                     case 'from':
                         $regexp_from = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_from, $ticket_from->email)) {
                             $passed++;
                         }
                         break;
                     case 'subject':
                         $regexp_subject = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_subject, $ticket->subject)) {
                             $passed++;
                         }
                         break;
                     case 'body':
                         if (null == ($message_body = $message_last->getContent())) {
                             break;
                         }
                         // Line-by-line body scanning (sed-like)
                         $lines = preg_split("/[\r\n]/", $message_body);
                         if (is_array($lines)) {
                             foreach ($lines as $line) {
                                 if (@preg_match($value, $line)) {
                                     $passed++;
                                     break;
                                 }
                             }
                         }
                         break;
                     case 'header1':
                     case 'header2':
                     case 'header3':
                     case 'header4':
                     case 'header5':
                         @($header = strtolower($rule['header']));
                         if (empty($header)) {
                             $passed++;
                             break;
                         }
                         if (empty($value)) {
                             // we're checking for null/blanks
                             if (!isset($message_headers[$header]) || empty($message_headers[$header])) {
                                 $passed++;
                             }
                         } elseif (isset($message_headers[$header]) && !empty($message_headers[$header])) {
                             $regexp_header = DevblocksPlatform::strToRegExp($value);
                             // Flatten CRLF
                             if (@preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $message_headers[$header]))) {
                                 $passed++;
                             }
                         }
                         break;
                     default:
                         // ignore invalids
                         // Custom Fields
                         if (0 == strcasecmp('cf_', substr($rule_key, 0, 3))) {
                             $field_id = substr($rule_key, 3);
                             // Make sure it exists
                             if (null == @($field = $custom_fields[$field_id])) {
                                 continue;
                             }
                             // Lazy values loader
                             $field_values = array();
                             switch ($field->source_extension) {
                                 case ChCustomFieldSource_Address::ID:
                                     if (null == $address_field_values) {
                                         $address_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Address::ID, $ticket_from->id));
                                     }
                                     $field_values =& $address_field_values;
                                     break;
                                 case ChCustomFieldSource_Org::ID:
                                     if (null == $org_field_values) {
                                         $org_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Org::ID, $ticket_from->contact_org_id));
                                     }
                                     $field_values =& $org_field_values;
                                     break;
                                 case ChCustomFieldSource_Ticket::ID:
                                     if (null == $ticket_field_values) {
                                         $ticket_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Ticket::ID, $ticket->id));
                                     }
                                     $field_values =& $ticket_field_values;
                                     break;
                             }
                             // Type sensitive value comparisons
                             // [TODO] Operators
                             switch ($field->type) {
                                 case 'S':
                                     // string
                                 // string
                                 case 'T':
                                     // clob
                                 // clob
                                 case 'U':
                                     // URL
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : '';
                                     $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                     if ($oper == "=" && @preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && @(!preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val))) {
                                         $passed++;
                                     }
                                     break;
                                 case 'N':
                                     // number
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                     if ($oper == "=" && intval($field_val) == intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && intval($field_val) != intval($value)) {
                                         $passed++;
                                     } elseif ($oper == ">" && intval($field_val) > intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "<" && intval($field_val) < intval($value)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'E':
                                     // date
                                     $field_val = isset($field_values[$field_id]) ? intval($field_values[$field_id]) : 0;
                                     $from = isset($rule['from']) ? $rule['from'] : "0";
                                     $to = isset($rule['to']) ? $rule['to'] : "now";
                                     if (intval(@strtotime($from)) <= $field_val && intval(@strtotime($to)) >= $field_val) {
                                         $passed++;
                                     }
                                     break;
                                 case 'C':
                                     // checkbox
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     if (intval($value) == intval($field_val)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'D':
                                     // dropdown
                                 // dropdown
                                 case 'X':
                                     // multi-checkbox
                                 // multi-checkbox
                                 case 'M':
                                     // multi-picklist
                                 // multi-picklist
                                 case 'W':
                                     // worker
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : array();
                                     if (!is_array($value)) {
                                         $value = array($value);
                                     }
                                     if (is_array($field_val)) {
                                         // if multiple things set
                                         foreach ($field_val as $v) {
                                             // loop through possible
                                             if (isset($value[$v])) {
                                                 // is any possible set?
                                                 $passed++;
                                                 break;
                                             }
                                         }
                                     } else {
                                         // single
                                         if (isset($value[$field_val])) {
                                             // is our set field in possibles?
                                             $passed++;
                                             break;
                                         }
                                     }
                                     break;
                             }
                         }
                         break;
                 }
             }
             // If our rule matched every criteria, stop and return the filter
             if ($passed == count($filter->criteria)) {
                 DAO_WatcherMailFilter::increment($filter->id);
                 // ++ the times we've matched
                 $matches[$filter->id] = $filter;
             }
         }
     }
     if (!empty($matches)) {
         return $matches;
     }
     // No matches
     return false;
 }
Exemple #2
0
 static function getMatches(Model_Address $fromAddress, CerberusParserMessage $message)
 {
     //		print_r($fromAddress);
     //		print_r($message);
     $matches = array();
     $rules = DAO_MailToGroupRule::getWhere();
     $message_headers = $message->headers;
     $custom_fields = DAO_CustomField::getAll();
     // Lazy load when needed on criteria basis
     $address_field_values = null;
     $org_field_values = null;
     // Check filters
     if (is_array($rules)) {
         foreach ($rules as $rule) {
             /* @var $rule Model_MailToGroupRule */
             $passed = 0;
             // check criteria
             foreach ($rule->criteria as $crit_key => $crit) {
                 @($value = $crit['value']);
                 switch ($crit_key) {
                     case 'dayofweek':
                         $current_day = strftime('%w');
                         //						$current_day = 1;
                         // Forced to English abbrevs as indexes
                         $days = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
                         // Is the current day enabled?
                         if (isset($crit[$days[$current_day]])) {
                             $passed++;
                         }
                         break;
                     case 'timeofday':
                         $current_hour = strftime('%H');
                         $current_min = strftime('%M');
                         //						$current_hour = 17;
                         //						$current_min = 5;
                         if (null != ($from_time = @$crit['from'])) {
                             list($from_hour, $from_min) = explode(':', $from_time);
                         }
                         if (null != ($to_time = @$crit['to'])) {
                             if (list($to_hour, $to_min) = explode(':', $to_time)) {
                             }
                         }
                         // Do we need to wrap around to the next day's hours?
                         if ($from_hour > $to_hour) {
                             // yes
                             $to_hour += 24;
                             // add 24 hrs to the destination (1am = 25th hour)
                         }
                         // Are we in the right 24 hourly range?
                         if ((int) $current_hour >= $from_hour && (int) $current_hour <= $to_hour) {
                             // If we're in the first hour, are we minutes early?
                             if ($current_hour == $from_hour && (int) $current_min < $from_min) {
                                 break;
                             }
                             // If we're in the last hour, are we minutes late?
                             if ($current_hour == $to_hour && (int) $current_min > $to_min) {
                                 break;
                             }
                             $passed++;
                         }
                         break;
                     case 'tocc':
                         $tocc = array();
                         $destinations = DevblocksPlatform::parseCsvString($value);
                         // Build a list of To/Cc addresses on this message
                         @($to_list = imap_rfc822_parse_adrlist($message_headers['to'], 'localhost'));
                         @($cc_list = imap_rfc822_parse_adrlist($message_headers['cc'], 'localhost'));
                         if (is_array($to_list)) {
                             foreach ($to_list as $addy) {
                                 $tocc[] = $addy->mailbox . '@' . $addy->host;
                             }
                         }
                         if (is_array($cc_list)) {
                             foreach ($cc_list as $addy) {
                                 $tocc[] = $addy->mailbox . '@' . $addy->host;
                             }
                         }
                         $dest_flag = false;
                         // bail out when true
                         if (is_array($destinations) && is_array($tocc)) {
                             foreach ($destinations as $dest) {
                                 if ($dest_flag) {
                                     break;
                                 }
                                 $regexp_dest = DevblocksPlatform::strToRegExp($dest);
                                 foreach ($tocc as $addy) {
                                     if (@preg_match($regexp_dest, $addy)) {
                                         $passed++;
                                         $dest_flag = false;
                                         break;
                                     }
                                 }
                             }
                         }
                         break;
                     case 'from':
                         $regexp_from = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_from, $fromAddress->email)) {
                             $passed++;
                         }
                         break;
                     case 'subject':
                         // [TODO] Decode if necessary
                         @($subject = $message_headers['subject']);
                         $regexp_subject = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_subject, $subject)) {
                             $passed++;
                         }
                         break;
                     case 'body':
                         // Line-by-line body scanning (sed-like)
                         $lines = preg_split("/[\r\n]/", $message->body);
                         if (is_array($lines)) {
                             foreach ($lines as $line) {
                                 if (@preg_match($value, $line)) {
                                     $passed++;
                                     break;
                                 }
                             }
                         }
                         break;
                     case 'header1':
                     case 'header2':
                     case 'header3':
                     case 'header4':
                     case 'header5':
                         @($header = strtolower($crit['header']));
                         if (empty($header)) {
                             $passed++;
                             break;
                         }
                         if (empty($value)) {
                             // we're checking for null/blanks
                             if (!isset($message_headers[$header]) || empty($message_headers[$header])) {
                                 $passed++;
                             }
                         } elseif (isset($message_headers[$header]) && !empty($message_headers[$header])) {
                             $regexp_header = DevblocksPlatform::strToRegExp($value);
                             // Flatten CRLF
                             if (@preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $message_headers[$header]))) {
                                 $passed++;
                             }
                         }
                         break;
                     default:
                         // ignore invalids
                         // Custom Fields
                         if (0 == strcasecmp('cf_', substr($crit_key, 0, 3))) {
                             $field_id = substr($crit_key, 3);
                             // Make sure it exists
                             if (null == @($field = $custom_fields[$field_id])) {
                                 continue;
                             }
                             // Lazy values loader
                             $field_values = array();
                             switch ($field->source_extension) {
                                 case ChCustomFieldSource_Address::ID:
                                     if (null == $address_field_values) {
                                         $address_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Address::ID, $fromAddress->id));
                                     }
                                     $field_values =& $address_field_values;
                                     break;
                                 case ChCustomFieldSource_Org::ID:
                                     if (null == $org_field_values) {
                                         $org_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Org::ID, $fromAddress->contact_org_id));
                                     }
                                     $field_values =& $org_field_values;
                                     break;
                             }
                             // No values, default.
                             if (!isset($field_values[$field_id])) {
                                 continue;
                             }
                             // Type sensitive value comparisons
                             switch ($field->type) {
                                 case 'S':
                                     // string
                                 // string
                                 case 'T':
                                     // clob
                                 // clob
                                 case 'U':
                                     // URL
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : '';
                                     $oper = isset($crit['oper']) ? $crit['oper'] : "=";
                                     if ($oper == "=" && @preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && @(!preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val))) {
                                         $passed++;
                                     }
                                     break;
                                 case 'N':
                                     // number
                                     if (!isset($field_values[$field_id])) {
                                         break;
                                     }
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     $oper = isset($crit['oper']) ? $crit['oper'] : "=";
                                     if ($oper == "=" && intval($field_val) == intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && intval($field_val) != intval($value)) {
                                         $passed++;
                                     } elseif ($oper == ">" && intval($field_val) > intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "<" && intval($field_val) < intval($value)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'E':
                                     // date
                                     $field_val = isset($field_values[$field_id]) ? intval($field_values[$field_id]) : 0;
                                     $from = isset($crit['from']) ? $crit['from'] : "0";
                                     $to = isset($crit['to']) ? $crit['to'] : "now";
                                     if (intval(@strtotime($from)) <= $field_val && intval(@strtotime($to)) >= $field_val) {
                                         $passed++;
                                     }
                                     break;
                                 case 'C':
                                     // checkbox
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     if (intval($value) == intval($field_val)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'D':
                                     // dropdown
                                 // dropdown
                                 case 'X':
                                     // multi-checkbox
                                 // multi-checkbox
                                 case 'M':
                                     // multi-picklist
                                 // multi-picklist
                                 case 'W':
                                     // worker
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : array();
                                     if (!is_array($value)) {
                                         $value = array($value);
                                     }
                                     if (is_array($field_val)) {
                                         // if multiple things set
                                         foreach ($field_val as $v) {
                                             // loop through possible
                                             if (isset($value[$v])) {
                                                 // is any possible set?
                                                 $passed++;
                                                 break;
                                             }
                                         }
                                     } else {
                                         // single
                                         if (isset($value[$field_val])) {
                                             // is our set field in possibles?
                                             $passed++;
                                             break;
                                         }
                                     }
                                     break;
                             }
                         }
                         break;
                 }
             }
             // If our rule matched every criteria, stop and return the filter
             if ($passed == count($rule->criteria)) {
                 DAO_MailToGroupRule::increment($rule->id);
                 // ++ the times we've matched
                 $matches[$rule->id] = $rule;
                 // Bail out if this rule had a move action
                 if (isset($rule->actions['move'])) {
                     return $matches;
                 }
             }
         }
     }
     // If we're at the end of rules and didn't bail out yet
     if (!empty($matches)) {
         return $matches;
     }
     // No matches
     return NULL;
 }
Exemple #3
0
 /**
  * @return Model_Sensor[]|false
  */
 public function getMatches($sensors)
 {
     $matches = array();
     // Check the sensor
     if (empty($sensors)) {
         return false;
     }
     $custom_fields = DAO_CustomField::getAll();
     // Lazy load when needed on criteria basis
     $sensor_field_values = null;
     // Criteria extensions
     $alert_criteria_exts = DevblocksPlatform::getExtensions('portsensor.alert.criteria', false);
     if (is_array($sensors)) {
         foreach ($sensors as $sensor) {
             // Check filters
             $passed = 0;
             // Skip alerts with no criteria
             if (!is_array($this->criteria) || empty($this->criteria)) {
                 continue;
             }
             // check criteria
             if (is_array($this->criteria)) {
                 foreach ($this->criteria as $rule_key => $rule) {
                     @($value = $rule['value']);
                     switch ($rule_key) {
                         case 'dayofweek':
                             $current_day = strftime('%w');
                             //						$current_day = 1;
                             // Forced to English abbrevs as indexes
                             $days = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
                             // Is the current day enabled?
                             if (isset($rule[$days[$current_day]])) {
                                 $passed++;
                             }
                             break;
                         case 'timeofday':
                             $current_hour = strftime('%H');
                             $current_min = strftime('%M');
                             //						$current_hour = 17;
                             //						$current_min = 5;
                             if (null != ($from_time = @$rule['from'])) {
                                 list($from_hour, $from_min) = explode(':', $from_time);
                             }
                             if (null != ($to_time = @$rule['to'])) {
                                 if (list($to_hour, $to_min) = explode(':', $to_time)) {
                                 }
                             }
                             // Do we need to wrap around to the next day's hours?
                             if ($from_hour > $to_hour) {
                                 // yes
                                 $to_hour += 24;
                                 // add 24 hrs to the destination (1am = 25th hour)
                             }
                             // Are we in the right 24 hourly range?
                             if ((int) $current_hour >= $from_hour && (int) $current_hour <= $to_hour) {
                                 // If we're in the first hour, are we minutes early?
                                 if ($current_hour == $from_hour && (int) $current_min < $from_min) {
                                     break;
                                 }
                                 // If we're in the last hour, are we minutes late?
                                 if ($current_hour == $to_hour && (int) $current_min > $to_min) {
                                     break;
                                 }
                                 $passed++;
                             }
                             break;
                         case 'event':
                             switch ($sensor->status) {
                                 case 0:
                                     // OK
                                     if (isset($rule['ok'])) {
                                         $passed++;
                                     }
                                     break;
                                 case 1:
                                     // WARNING
                                     if (isset($rule['warning'])) {
                                         $passed++;
                                     }
                                     break;
                                 case 2:
                                     // CRITICAL
                                     if (isset($rule['critical'])) {
                                         $passed++;
                                     }
                                     break;
                             }
                             break;
                         case 'alert_last_ran':
                             @($from = DevblocksPlatform::importGPC($rule['from'], 'string', ''));
                             @($to = DevblocksPlatform::importGPC($rule['to'], 'string', ''));
                             if (intval(@strtotime($from)) <= $this->last_alert_date && intval(@strtotime($to)) >= $this->last_alert_date) {
                                 $passed++;
                             }
                             break;
                         case 'sensor_name':
                             $regexp_sensor_name = DevblocksPlatform::strToRegExp($value);
                             if (@preg_match($regexp_sensor_name, $sensor->name)) {
                                 $passed++;
                             }
                             break;
                         case 'sensor_type':
                             if (isset($rule[$sensor->extension_id])) {
                                 $passed++;
                             }
                             break;
                         case 'sensor_fail_count':
                             $oper = $rule['oper'];
                             switch ($oper) {
                                 default:
                                     if ($sensor->fail_count == $value) {
                                         $passed++;
                                     }
                                     break;
                                 case '!=':
                                     if ($sensor->fail_count != $value) {
                                         $passed++;
                                     }
                                     break;
                                 case '>':
                                     if ($sensor->fail_count > $value) {
                                         $passed++;
                                     }
                                     break;
                                 case '<':
                                     if ($sensor->fail_count < $value) {
                                         $passed++;
                                     }
                                     break;
                             }
                             break;
                         default:
                             // ignore invalids
                             // Custom Fields
                             if (0 == strcasecmp('cf_', substr($rule_key, 0, 3))) {
                                 $field_id = substr($rule_key, 3);
                                 // Make sure it exists
                                 if (null == @($field = $custom_fields[$field_id])) {
                                     continue;
                                 }
                                 // Lazy values loader
                                 $field_values = array();
                                 switch ($field->source_extension) {
                                     case PsCustomFieldSource_Sensor::ID:
                                         if (null == $sensor_field_values) {
                                             $sensor_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(PsCustomFieldSource_Sensor::ID, $sensor->id));
                                         }
                                         $field_values =& $sensor_field_values;
                                         break;
                                 }
                                 // No values, default.
                                 //							if(!isset($field_values[$field_id]))
                                 //								continue;
                                 // Type sensitive value comparisons
                                 // [TODO] Operators
                                 switch ($field->type) {
                                     case 'S':
                                         // string
                                     // string
                                     case 'T':
                                         // clob
                                     // clob
                                     case 'U':
                                         // URL
                                         $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : '';
                                         $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                         if ($oper == "=" && @preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val)) {
                                             $passed++;
                                         } elseif ($oper == "!=" && @(!preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val))) {
                                             $passed++;
                                         }
                                         break;
                                     case 'N':
                                         // number
                                         if (!isset($field_values[$field_id])) {
                                             break;
                                         }
                                         $field_val = intval($field_values[$field_id]);
                                         $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                         if ($oper == "=" && $field_val == intval($value)) {
                                             $passed++;
                                         } elseif ($oper == "!=" && $field_val != intval($value)) {
                                             $passed++;
                                         } elseif ($oper == ">" && $field_val > intval($value)) {
                                             $passed++;
                                         } elseif ($oper == "<" && $field_val < intval($value)) {
                                             $passed++;
                                         }
                                         break;
                                     case 'E':
                                         // date
                                         $field_val = isset($field_values[$field_id]) ? intval($field_values[$field_id]) : 0;
                                         $from = isset($rule['from']) ? $rule['from'] : "0";
                                         $to = isset($rule['to']) ? $rule['to'] : "now";
                                         if (intval(@strtotime($from)) <= $field_val && intval(@strtotime($to)) >= $field_val) {
                                             $passed++;
                                         }
                                         break;
                                     case 'C':
                                         // checkbox
                                         $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                         if (intval($value) == intval($field_val)) {
                                             $passed++;
                                         }
                                         break;
                                     case 'D':
                                         // dropdown
                                     // dropdown
                                     case 'X':
                                         // multi-checkbox
                                     // multi-checkbox
                                     case 'M':
                                         // multi-picklist
                                     // multi-picklist
                                     case 'W':
                                         // worker
                                         $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : array();
                                         if (!is_array($value)) {
                                             $value = array($value);
                                         }
                                         if (is_array($field_val)) {
                                             // if multiple things set
                                             foreach ($field_val as $v) {
                                                 // loop through possible
                                                 if (isset($value[$v])) {
                                                     // is any possible set?
                                                     $passed++;
                                                     break;
                                                 }
                                             }
                                         } else {
                                             // single
                                             if (isset($value[$field_val])) {
                                                 // is our set field in possibles?
                                                 $passed++;
                                                 break;
                                             }
                                         }
                                         break;
                                 }
                             } elseif (isset($alert_criteria_exts[$rule_key])) {
                                 // criteria extensions
                                 try {
                                     $crit_ext = $alert_criteria_exts[$rule_key]->createInstance();
                                     if ($crit_ext->matches($this, $sensor)) {
                                         $passed++;
                                         break;
                                     }
                                 } catch (Exception $e) {
                                     // Oops!
                                     //print_r($e);
                                 }
                             }
                             break;
                     }
                 }
             }
             // If our alert matched every criteria, stop and return the alert
             if ($passed == count($this->criteria)) {
                 DAO_Alert::update($this->id, array(DAO_Alert::LAST_ALERT_DATE => time()));
                 DAO_Alert::increment($this->id);
                 // ++ the times we've matched
                 $matches[$sensor->id] = $sensor;
             }
         }
     }
     // If last alert was still stackable...
     if (!empty($matches)) {
         return $matches;
     }
     // No matches
     return false;
 }
Exemple #4
0
 /**
  * Returns a Model_PreParserRule on a match, or NULL
  *
  * @param boolean $is_new
  * @param string $from
  * @param string $to
  * @param CerberusParserMessage $message
  * @return Model_PreParserRule
  */
 private static function _checkPreParseRules($is_new, $from, $group_id, CerberusParserMessage $message)
 {
     $filters = DAO_PreParseRule::getAll();
     $headers = $message->headers;
     // check filters
     if (is_array($filters)) {
         foreach ($filters as $filter) {
             $passed = 0;
             // check criteria
             foreach ($filter->criteria as $rule_key => $rule) {
                 @($value = $rule['value']);
                 switch ($rule_key) {
                     case 'type':
                         if ($is_new && 0 == strcasecmp($value, 'new') || !$is_new && 0 == strcasecmp($value, 'reply')) {
                             $passed++;
                         }
                         break;
                     case 'from':
                         $regexp_from = DevblocksPlatform::strToRegExp($value);
                         if (preg_match($regexp_from, $from)) {
                             $passed++;
                         }
                         break;
                     case 'to':
                         if (intval($group_id) == intval($value)) {
                             $passed++;
                         }
                         break;
                     case 'header1':
                     case 'header2':
                     case 'header3':
                     case 'header4':
                     case 'header5':
                         $header = strtolower($rule['header']);
                         if (empty($value)) {
                             // we're checking for null/blanks
                             if (!isset($headers[$header]) || empty($headers[$header])) {
                                 $passed++;
                             }
                         } elseif (isset($headers[$header]) && !empty($headers[$header])) {
                             $regexp_header = DevblocksPlatform::strToRegExp($value);
                             // handle arrays like Received: and (broken)Content-Type headers  (farking spammers)
                             if (is_array($headers[$header])) {
                                 foreach ($headers[$header] as $array_header) {
                                     if (preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $array_header))) {
                                         $passed++;
                                         break;
                                     }
                                 }
                             } else {
                                 // Flatten CRLF
                                 if (preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $headers[$header]))) {
                                     $passed++;
                                 }
                             }
                         }
                         break;
                     case 'body':
                         $regexp_body = DevblocksPlatform::strToRegExp($value);
                         // Flatten CRLF
                         if (preg_match($regexp_body, str_replace(array("\r", "\n"), ' ', $message->body))) {
                             $passed++;
                         }
                         break;
                     case 'body_encoding':
                         $regexp_bodyenc = DevblocksPlatform::strToRegExp($value);
                         if (preg_match($regexp_bodyenc, $message->body_encoding)) {
                             $passed++;
                         }
                         break;
                     case 'attachment':
                         $regexp_file = DevblocksPlatform::strToRegExp($value);
                         // check the files in the raw message
                         foreach ($message->files as $file_name => $file) {
                             /* @var $file ParserFile */
                             if (preg_match($regexp_file, $file_name)) {
                                 $passed++;
                                 break;
                             }
                         }
                         break;
                     default:
                         // ignore invalids
                         continue;
                         break;
                 }
             }
             // If our rule matched every criteria, stop and return the filter
             if ($passed == count($filter->criteria)) {
                 DAO_PreParseRule::increment($filter->id);
                 // ++ the times we've matched
                 return $filter;
             }
         }
     }
     return NULL;
 }
Exemple #5
0
 /**
  * @return Model_GroupInboxFilter|false
  */
 static function getMatches($group_id, $ticket_id, $only_rule_id = 0)
 {
     $matches = array();
     if (empty($group_id)) {
         return false;
     }
     if (!empty($only_rule_id)) {
         $filters = array(DAO_GroupInboxFilter::get($only_rule_id));
     } else {
         $filters = DAO_GroupInboxFilter::getByGroupId($group_id);
     }
     // Check the ticket
     if (null === ($ticket = DAO_Ticket::getTicket($ticket_id))) {
         return false;
     }
     // Build our objects
     $ticket_from = DAO_Address::get($ticket->last_wrote_address_id);
     $ticket_group_id = $ticket->team_id;
     // [TODO] These expensive checks should only populate when needed
     $messages = DAO_Ticket::getMessagesByTicket($ticket_id);
     if (empty($messages)) {
         return false;
     }
     if (null == @($message = array_pop($messages))) {
         /* @var $message CerberusMessage */
         return false;
     }
     $message_headers = $message->getHeaders();
     $custom_fields = DAO_CustomField::getAll();
     // Lazy load when needed on criteria basis
     $ticket_field_values = null;
     $address_field_values = null;
     $org_field_values = null;
     // Check filters
     if (is_array($filters)) {
         foreach ($filters as $filter) {
             /* @var $filter Model_GroupInboxFilter */
             $passed = 0;
             // check criteria
             foreach ($filter->criteria as $rule_key => $rule) {
                 @($value = $rule['value']);
                 switch ($rule_key) {
                     case 'tocc':
                         $destinations = DevblocksPlatform::parseCsvString($value);
                         // Build a list of To/Cc addresses on this message
                         @($to_list = imap_rfc822_parse_adrlist($message_headers['to'], 'localhost'));
                         @($cc_list = imap_rfc822_parse_adrlist($message_headers['cc'], 'localhost'));
                         if (is_array($to_list)) {
                             foreach ($to_list as $addy) {
                                 $tocc[] = $addy->mailbox . '@' . $addy->host;
                             }
                         }
                         if (is_array($cc_list)) {
                             foreach ($cc_list as $addy) {
                                 $tocc[] = $addy->mailbox . '@' . $addy->host;
                             }
                         }
                         $dest_flag = false;
                         // bail out when true
                         if (is_array($destinations) && is_array($tocc)) {
                             foreach ($destinations as $dest) {
                                 if ($dest_flag) {
                                     break;
                                 }
                                 $regexp_dest = DevblocksPlatform::strToRegExp($dest);
                                 foreach ($tocc as $addy) {
                                     if (@preg_match($regexp_dest, $addy)) {
                                         $passed++;
                                         $dest_flag = false;
                                         break;
                                     }
                                 }
                             }
                         }
                         break;
                     case 'from':
                         $regexp_from = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_from, $ticket_from->email)) {
                             $passed++;
                         }
                         break;
                     case 'subject':
                         $regexp_subject = DevblocksPlatform::strToRegExp($value);
                         if (@preg_match($regexp_subject, $ticket->subject)) {
                             $passed++;
                         }
                         break;
                     case 'header1':
                     case 'header2':
                     case 'header3':
                     case 'header4':
                     case 'header5':
                         @($header = strtolower($rule['header']));
                         if (empty($header)) {
                             $passed++;
                             break;
                         }
                         if (empty($value)) {
                             // we're checking for null/blanks
                             if (!isset($message_headers[$header]) || empty($message_headers[$header])) {
                                 $passed++;
                             }
                         } elseif (isset($message_headers[$header]) && !empty($message_headers[$header])) {
                             $regexp_header = DevblocksPlatform::strToRegExp($value);
                             // Flatten CRLF
                             if (@preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $message_headers[$header]))) {
                                 $passed++;
                             }
                         }
                         break;
                     default:
                         // ignore invalids
                         // Custom Fields
                         if (0 == strcasecmp('cf_', substr($rule_key, 0, 3))) {
                             $field_id = substr($rule_key, 3);
                             // Make sure it exists
                             if (null == @($field = $custom_fields[$field_id])) {
                                 continue;
                             }
                             // Lazy values loader
                             $field_values = array();
                             switch ($field->source_extension) {
                                 case ChCustomFieldSource_Address::ID:
                                     if (null == $address_field_values) {
                                         $address_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Address::ID, $ticket_from->id));
                                     }
                                     $field_values =& $address_field_values;
                                     break;
                                 case ChCustomFieldSource_Org::ID:
                                     if (null == $org_field_values) {
                                         $org_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Org::ID, $ticket_from->contact_org_id));
                                     }
                                     $field_values =& $org_field_values;
                                     break;
                                 case ChCustomFieldSource_Ticket::ID:
                                     if (null == $ticket_field_values) {
                                         $ticket_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Ticket::ID, $ticket->id));
                                     }
                                     $field_values =& $ticket_field_values;
                                     break;
                             }
                             // No values, default.
                             //							if(!isset($field_values[$field_id]))
                             //								continue;
                             // Type sensitive value comparisons
                             // [TODO] Operators
                             switch ($field->type) {
                                 case 'S':
                                     // string
                                 // string
                                 case 'T':
                                     // clob
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : '';
                                     $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                     if ($oper == "=" && @preg_match(DevblocksPlatform::strToRegExp($value), $field_val)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && @(!preg_match(DevblocksPlatform::strToRegExp($value), $field_val))) {
                                         $passed++;
                                     }
                                     break;
                                 case 'N':
                                     // number
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     $oper = isset($rule['oper']) ? $rule['oper'] : "=";
                                     if ($oper == "=" && intval($field_val) == intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "!=" && intval($field_val) != intval($value)) {
                                         $passed++;
                                     } elseif ($oper == ">" && $intval($field_val) > intval($value)) {
                                         $passed++;
                                     } elseif ($oper == "<" && $intval($field_val) < intval($value)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'E':
                                     // date
                                     $field_val = isset($field_values[$field_id]) ? intval($field_values[$field_id]) : 0;
                                     $from = isset($rule['from']) ? $rule['from'] : "0";
                                     $to = isset($rule['to']) ? $rule['to'] : "now";
                                     if (intval(@strtotime($from)) <= $field_val && intval(@strtotime($to)) >= $field_val) {
                                         $passed++;
                                     }
                                     break;
                                 case 'C':
                                     // checkbox
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0;
                                     if (intval($value) == intval($field_val)) {
                                         $passed++;
                                     }
                                     break;
                                 case 'D':
                                     // dropdown
                                 // dropdown
                                 case 'X':
                                     // multi-checkbox
                                 // multi-checkbox
                                 case 'M':
                                     // multi-picklist
                                     $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : array();
                                     if (!is_array($value)) {
                                         $value = array($value);
                                     }
                                     foreach ($value as $v) {
                                         if (isset($field_val[$v])) {
                                             $passed++;
                                         }
                                     }
                                     break;
                             }
                         }
                         break;
                 }
             }
             // If our rule matched every criteria, stop and return the filter
             if ($passed == count($filter->criteria)) {
                 DAO_GroupInboxFilter::increment($filter->id);
                 // ++ the times we've matched
                 $matches[$filter->id] = $filter;
                 // If we're not stackable anymore, bail out.
                 if (!$filter->is_stackable) {
                     return $matches;
                 }
             }
         }
     }
     // If last rule was still stackable...
     if (!empty($matches)) {
         return $matches;
     }
     // No matches
     return false;
 }