* @author Gustavo Pereira dos Santos * @version 1.0 * @since Classe disponibilizada na versão 2.4 */ class FilterMapping { var $service; var $msgs_apply = array(); /** * Método que cria o ID da regra que está sendo criada. * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author Airton Bordin Junior * @author Gustavo Pereira dos Santos * @author Natan Fonseca * @param <$uri> * @param <$result> * @param <$criteria> * @param <$original> * @access */ public function makeId(&$uri , &$result , &$criteria , $original) { $result['id'] = $uri['id']; } /** * Método que formata o Script de acordo com a sintaxe do Sieve. * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author Airton Bordin Junior * @author Gustavo Pereira dos Santos * @param <$rules> * @return * @access */ public function formatSieveScript( $rules ) { $require_fileinto = $require_flag = $require_reject = $require_vacation = $require_body = $require_imapflag = $vacation = $startswith = $endswith = false; $script_rules = $script_header = $script_criteria = $vacation_action = ""; $i = 0; foreach( $rules as $name => $data ) { if( $data['enabled'] == 'false' ) continue; if(array_key_exists("block", $data)) { /* Usado na opção Bloquear usuário do ExpressoMail */ if($data['block']) { ($i >0) ? $script_match = 'elsif anyof' : $script_match = 'if anyof'; $script_match = $script_match . "(address :is \"from\" [\"" .$data['name'] . "\"]) {\r\n"; $script_match .= "fileinto \"INBOX/Spam\"; \r\n}\r\n"; $script_rules .= $script_match; $script_match = ""; $script_criteria = ""; $require_fileinto = true; ++$i; continue; } } $vacation = false; $criteria = $data['criteria']; $action = $data['actions']; ($i >0 && $verifyNextRule == 'false') ? $script_match = 'els' : $script_match = ''; $data['isExact'] == 'false' ? $script_match .= 'if anyof (' : $script_match .= 'if allof ('; $verifyNextRule = 'false'; if( is_array($criteria) ) foreach ($criteria as $j => $value) { if ($criteria[$j]['operator'] == '!*') $script_criteria .= "not "; switch(strtoupper($criteria[$j]['field'])) { case 'TO': case 'CC': $criteria[$j]['field'] = "[\"To\", \"TO\", \"Cc\", \"CC\"]"; $script_criteria .= "address :"; break; case 'FROM': $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\""; $script_criteria .= "address :"; break; case 'SIZE': $criteria[$j]['field'] = ''; $script_criteria .= "size :"; break; case 'SUBJECT': $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\""; $script_criteria .= "header :"; if($criteria[$j]['operator'] == "$") { $criteria[$j]['value'] = "" . $criteria[$j]['value'] . "\", \"*" . base64_encode($criteria[$j]['value']) . ""; break; } if($criteria[$j]['operator'] == "^") { $criteria[$j]['value'] = "" . $criteria[$j]['value'] . "*\", \"" . base64_encode($criteria[$j]['value']) . ""; break; } $criteria[$j]['value'] = "" . $criteria[$j]['value'] . "\", \"" . base64_encode($criteria[$j]['value']) . ""; break; case 'BODY': $criteria[$j]['field'] = ''; $script_criteria .= "body :"; $require_body = true; break; case 'VACATION': continue; case 'HASATTACHMENT': $criteria[$j]['field'] = ''; $script_criteria .= "body :"; $criteria[$j]['operator'] = "^^"; $require_body = true; break; default: $script_criteria .= "header :"; break; } switch ($criteria[$j]['operator']) { case '>': $criteria[$j]['operator'] = "over"; $criteria[$j]['value'] = $criteria[$j]['value'] . "K"; break; case '<': $criteria[$j]['operator'] = "under"; $criteria[$j]['value'] = $criteria[$j]['value'] . "K"; break; case '=': $criteria[$j]['operator'] = "is"; $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]"; break; case '*': $criteria[$j]['operator'] = "contains"; $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]"; break; case '^': $criteria[$j]['operator'] = "matches"; $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "*\"]"; $startswith = true; break; case '^^': $criteria[$j]['operator'] = "raw :matches"; $criteria[$j]['value'] = "[\"*filename=*\"]"; $startswith = true; break; case '$': $criteria[$j]['operator'] = "matches"; $criteria[$j]['value'] = "[\"*" . $criteria[$j]['value'] . "\"]"; $endswith = true; break; case '!*': $criteria[$j]['operator'] = "contains"; $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]"; break; } if ($criteria[$j]['field'] == "" || $criteria[$j]['field'] == "\"subject\"" || $startswith || $endswith) { $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", "; $startswith = $endswith = false; } else $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", "; } $script_criteria = substr($script_criteria,0,-2); $script_criteria .= ")"; $action_addFlag = ''; if( is_array($action) ) foreach ($action as $k => $value) { switch ($action[$k]['type']) { case 'setflag': $require_flag = true; $action[$k]['parameter'] = "\\\\" . $action[$k]['parameter']; break; case 'addflag': $require_flag = true; $action_addFlag = "addflag \"" . $action[$k]['parameter'] . "\";\r\n "; break; case 'redirect': break; case 'reject': $require_reject = true; break; case 'fileinto': $require_fileinto = true; $action[$k]['parameter'] = mb_convert_encoding($action[$k]['parameter'], "UTF7-IMAP","UTF-8, ISO-8859-1, UTF7-IMAP"); break; case 'vacation': $require_vacation = true; $action[$k]['parameter'] = "\"" . $action[$k]['parameter'] . "\""; $user = Controller::read(array('concept' => 'user' , 'id' => config::me('uidNumber') , 'service' => 'OpenLDAP')); $vacation_action = ' :subject "=?ISO-8859-1?Q?Fora_do_Escrit=F3rio?=" :days 1 :addresses ["'.$user['mail'].'"] ' . $action[$k]['parameter'] . ";"; $vacation = true; continue; case 'discard': break; } if ($vacation == false && $action[$k]['type'] != 'addflag') $script_action .= $action[$k]['type'] . " \"" . $action[$k]['parameter'] . "\";\r\n "; } /* ATENÇÃO: Colocar sempre o comando addflag antes de qualquer outro no caso de ações compostas no Sieve */ if ($action_addFlag != '') $script_action = $action_addFlag . $script_action; $script_action = "{\r\n " . $script_action . "}"; $action_addFlag = ''; if($vacation == false) $script_rules .= $script_match . $script_criteria . $script_action . "\r\n"; if($data['id'] != "vacation") ++$i; $script_match = ""; $script_criteria = ""; $script_action = ""; $data['applyMessages'] = ""; $verifyNextRule = $data['verifyNextRule']; } if($require_reject || $require_fileinto || $require_vacation || $require_body || $require_flag) { /* Para habilitar as funções desejadas, edite a diretiva sieve_extensions no arquivo de configuração "/etc/imapd.conf" */ $script_header .= "require ["; $require_reject ? $script_header .= "\"reject\", " : ""; $require_fileinto ? $script_header .= "\"fileinto\", " : ""; $require_vacation? $script_header .= "\"vacation\", " : ""; $require_flag ? $script_header .= "\"imapflags\", " : ""; $require_body ? $script_header .= "\"body\", " : ""; $script_header = substr($script_header,0,-2); $script_header .= "];\r\n"; } if( $vacation_action ) $script_rules .= "vacation" . $vacation_action . "\r\n"; foreach ($rules as &$values) { if($values['applyMessages']) $this->msgs_apply[] = $values['applyMessages']; $values['applyMessages'] = array(); } $json_data = json_encode($rules); $script_begin = "#Filtro gerado por Expresso Livre\r\n\r\n"; $content = $script_begin . $script_header . $script_rules . "\r\n\r\n#PseudoScript#" . "\r\n#" . $json_data; return( $content ); } /** * Método que lê e faz o parser dos filtros antigos * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author Airton Bordin Junior * @author Gustavo Pereira dos Santos * @param <$scriptName> * @return * @access */ public function readOldScript($scriptName) { // Recebe o conteúdo do array; $lines = array(); $lines = preg_split("/\n/", $scriptName); // Pega o tamanho da regra na primeira do script; $size_rule = array_shift($lines); // Recebe o tamanho do script, pela primeira linha; //$this->size = trim($size_rule); // Verifica a composição do script; */ $line = array_shift($lines); // Variaveis para a regra e o campo ferias; $regexps = array('##PSEUDO', '#rule', '#vacation', '#mode'); $retorno['rule'] = array(); $line = array_shift($lines); while (isset($line)) { foreach ($regexps as $regp) { if (preg_match("/$regp/i", $line)) { // Recebe todas as regras criadas no servidor; if (preg_match("/#rule&&/i", $line)) { $retorno['rule'][] = ltrim($line) . "\n"; } } } // Pega a proxima linha do sript; $line = array_shift($lines); } return $retorno; } /** * Método que faz o parsing do Script Sieve, transformando em Array. * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author Airton Bordin Junior * @author Gustavo Pereira dos Santos * @param <$script>