Changeset 4551 for branches/2.2.0.1/expressoMail1_2/inc
- Timestamp:
- 05/31/11 14:55:18 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.0.1/expressoMail1_2/inc/class.ScriptS.inc.php
r4506 r4551 6 6 class ScriptS { 7 7 8 //Declaração de Variáveis; 9 var $SieveS; // Var para criação do objeto; 10 var $reply; // Var para resposta; 11 var $scriptfile; // Nome do script; 12 var $username; // Nome do usuario; 13 var $rules; // Regras do sieve; 14 var $errstr; // Erros retornados; 15 var $size; // Tamanho; 16 var $so; // Verifica se a regra foi criada por outro tipo serviço de filtros; 17 var $continuebit; 18 var $sizebit; 19 var $anyofbit; 20 var $keepbit; 21 var $regexbit; 22 var $newrules = array(); 23 var $newout; 24 var $teste; 25 var $EmailVoip; 26 var $EmailExpresso; 27 28 function ScriptS() { 29 30 //Cria o objeto; 31 $this->SieveS = new SieveS(); 32 33 //$this->scriptfile = $GLOBALS['HTTP_SESSION_VARS']['phpgw_info']['expressomail']['user']['account_lid']; 34 $this->scriptfile = $_SESSION['phpgw_info']['expressomail']['user']['account_lid']; 35 $this->username = $this->scriptfile; 36 37 $this->reply = ""; 38 $this->rules = ""; 39 $this->errstr = ""; 40 $this->size = ""; 41 42 $this->continuebit = 1; 43 $this->sizebit = 1; 44 $this->anyofbit = 4; 45 $this->keepbit = 4; 46 $this->regexbit = 128; 47 48 $this->EmailVoip = trim($_SESSION['phpgw_info']['user']['preferences']['expressoMail']['voip_email_redirect']); 49 $this->EmailExpresso = trim($_SESSION['phpgw_info']['expressomail']['user']['email']); 50 } 51 52 function init_a() { 53 54 //Abre a conexão 55 $this->SieveS->start(); 56 57 $this->reply = $this->SieveS->getscript(); 58 59 if (!$this->reply) { 60 61 $aux = $this->SieveS->putscript($this->scriptfile, $this->createScript()); 62 if (!$aux) { 63 // Caso de erro, grava dentro da variável errstr; 64 $this->errstr = "Error: file not created"; 65 return $this->errstr; 66 } 67 // Mata a variavel; 68 unset($aux); 69 // Ativa o script; 70 $aux = $this->SieveS->activatescript($this->scriptfile); 71 72 if (!$aux) { 73 // Caso de erro, grava dentro da variavel errstr; 74 $this->errstr = "Error: error to activate file"; 75 return $this->errstr; 76 } else { 77 $this->reply = $this->SieveS->getscript(); 78 $this->rules = $this->readScript($this->reply); 79 } 80 } else { 81 $this->rules = $this->readScript($this->reply); 82 } 83 84 //Fecha a conexao 85 $this->SieveS->close(); 86 87 if ($this->rules) 88 return $this->rules; 89 } 90 91 function rec_rules($params) { 92 93 $newr1 = array(); 94 $newr2 = array(); 95 $newr3 = array(); 96 97 $var_decode = rawurldecode($params['arfilter']); 98 $var_decode = preg_replace('/\n\./', '.', $var_decode); 99 100 $narray = explode("_end_", $var_decode); 101 102 foreach ($narray as $key => $tmp) { 103 if ($tmp != "") { 104 $newr1[] = $tmp; 105 } 106 } 107 unset($key); 108 unset($tmp); 109 foreach ($newr1 as $key => $tmp) { 110 $tmp2 = explode("_begin_##", $tmp); 111 foreach ($tmp2 as $tmp3) { 112 if ($tmp3 != "") { 113 $newr2[] = trim($tmp3); 114 } 115 } 116 } 117 118 unset($tmp); 119 unset($tmp2); 120 unset($tmp3); 121 122 foreach ($newr2 as $tmp) { 123 if (trim($tmp) != "") { 124 $tmp2 = explode("##", $tmp); 125 foreach ($tmp2 as $tmp3) { 126 $tmp4 .= trim($tmp3) . "&&"; 127 } 128 $newr3[] = substr($tmp4, 0, (strlen($tmp4) - 4)); 129 unset($tmp2); 130 unset($tmp3); 131 unset($tmp4); 132 } 133 } 134 135 $tmp = $newr3[count($newr3) - 1]; 136 137 if (substr($tmp, 0, 9) == "#vacation") { 138 $this->newout = array_pop($newr3); 139 foreach ($newr3 as $key => $tmp) { 140 $this->newrules[] = $tmp; 141 } 142 } else { 143 foreach ($newr3 as $tmp) { 144 $this->newrules[] = $tmp; 145 } 146 } 147 148 unset($tmp); 149 $tmp = explode("&&", $this->newout); 150 $tmp1 = explode(",", $tmp[2]); 151 foreach ($tmp1 as $key => $tmp2) { 152 $tmp3 .= stripslashes(trim($tmp2)) . ", "; 153 } 154 $tmp3 = substr($tmp3, 0, (strlen($tmp3) - 2)); 155 156 unset($tmp); 157 unset($tmp1); 158 unset($tmp2); 159 unset($key); 160 $tmp = explode("&&", $this->newout); 161 foreach ($tmp as $key => $tmp1) { 162 if ($key == 2) { 163 $tmp2 .= trim($tmp3) . "&&"; 164 } else { 165 $tmp2 .= trim($tmp1) . "&&"; 166 } 167 } 168 unset($this->newout); 169 $this->newout = substr($tmp2, 0, (strlen($tmp2) - 2)); 170 171 //Abre a conexao 172 $this->SieveS->start(); 173 $this->errstr = ""; 174 175 // Escreve a nova regra; 176 $this->reply = $this->SieveS->getscript(); 177 /* 178 if($this->reply){ 179 $this->errstr = $this->SieveS->deletescript($this->scriptfile); 180 } 181 */ 182 183 $error_log_file = "/home/expressolivre/sieve_error.log"; 184 //Escreve a(s) nova(s) regra(s); 185 $newrule = $this->write_rule(); 186 if (strlen($newrule) > 0) 187 $this->errstr = $this->SieveS->putscript($this->scriptfile, $newrule); 188 else { 189 if ($_SESSION['phpgw_info']['server']['expressomail']['expressoMail_enable_log_messages'] == "True") 190 error_log(date("D M j G:i:s T Y") . ": SieveError, Invalid rule for " 191 . $_SESSION['phpgw_info']['expressomail']['user']['userid'] . "=>" 192 . $this->teste . "\nRule:" 193 . $var_decode . "\n", 3, $error_log_file); 194 return "Invalid rule\n" . $this->teste; 195 } 196 197 //Ativa o script; 198 $this->errstr = $this->SieveS->activatescript($this->scriptfile); 199 200 //Fecha a conexao 201 $this->SieveS->close(); 202 203 if ($this->errstr) { 204 return "Ok"; 205 } else { 206 if ($_SESSION['phpgw_info']['server']['expressomail']['expressoMail_enable_log_messages'] == "True") 207 error_log(date("D M j G:i:s T Y") 208 . ": SieveError, Problem for " 209 . $_SESSION['phpgw_info']['expressomail']['user']['userid'] . "=>" 210 . " " 211 . $this->SieveS->errstr . "\n", 3, $error_log_file); 212 return "Problemas na criação do arquivo!\n" . $this->teste; 213 } 214 } 215 216 function convert_specialchar($input) { 217 $special_char = false; 218 for ($i = 0; $i < strlen($input); $i++) { 219 if (preg_match('/[^a-z0-9.@~_+=&\'*^\ \-\[\]]/i', $input[$i])) { 220 $special_char = true; 221 $input = preg_replace('/\\' . $input[$i] . '/', '=' . bin2hex($input[$i]), $input); 222 } 223 } 224 225 if ($special_char) { 226 /* * 227 * When using arrays with pattern and replacement, 228 * the keys are processed in the order they appear in the array. 229 * See preg_replace in php.net/preg_replace 230 * */ 231 $patterns[0] = '/=c3/i'; 232 $patterns[1] = '/ /'; 233 $replacements[1] = ''; 234 $replacements[0] = '_'; 235 $input = preg_replace($patterns, $replacements, $input); 236 } 237 238 return($input); 239 } 240 241 // build the rule 242 function write_rule() { 243 244 // Variaveis; 245 $rule = array(); 246 $vacation = array(); 247 $newruletext = ""; 248 $activerules = 0; 249 $regexused = 0; 250 $rejectused = 0; 251 $notify = 0; 252 $flaggedused = 0; 253 $newscriptbody = ""; 254 $continue = 1; 255 $tmpSubject = ""; 256 257 // Recebe os valores das regras; 258 foreach ($this->newrules as $tmp) { 259 $tmp1 = explode("&&", $tmp); 260 $rule['priority'] = $tmp1[1]; 261 $rule['status'] = $tmp1[2]; 262 $rule['from'] = $this->convert_specialchar($tmp1[3]); 263 $rule['to'] = $this->convert_specialchar($tmp1[4]); 264 $tmpSubject = $tmp1[5]; 265 $rule['subject'] = $this->convert_specialchar($tmp1[5]); 266 $rule['action'] = $tmp1[6]; 267 $rule['action_arg'] = utf8_encode(preg_replace("/\\r\\n/", "\r\n", $tmp1[7])); 268 $rule['flg'] = $tmp1[8]; 269 $rule['field'] = $tmp1[9]; 270 $rule['field_val'] = $tmp1[10]; 271 $rule['size'] = $tmp1[11]; 272 $rule['continue'] = ($tmp1[8] & $this->continuebit); 273 $rule['gthan'] = ($tmp1[8] & $this->sizebit); 274 $rule['anyof'] = ($tmp1[8] & $this->anyofbit); 275 $rule['keep'] = ($tmp1[8] & $this->keepbit); 276 $rule['regexp'] = ($tmp1[8] & $this->regexbit); 277 $rule['unconditional'] = 0; 278 279 if (!$rule['from'] && !$rule['to'] && !$rule['subject'] && !$rule['field'] && empty($rule['size']) && $rule['action']) { 280 $rule['unconditional'] = 1; 281 282 if ($rule['unconditional'] && ($rule['size'] == "0" || $rule['size'] == 0 )) 283 $rule['unconditional'] = 0; 284 } 285 unset($tmp1); 286 287 // Monta as regras; 288 if ($rule['status'] != 'ENABLED') { 289 290 } else { 291 $activerules = 1; 292 293 // Condições para montagem das regras; 294 $anyall = "allof"; 295 if ($rule['anyof']) 296 $anyall = "anyof"; 297 if ($rule['regexp']) { 298 $regexused = 1; 299 } 300 $started = 0; 301 302 if (!$rule['unconditional']) { 303 if (!$continue) 304 $newruletext .= "els"; 305 $newruletext .= "if " . $anyall . " ("; 306 if ($rule['from']) { 307 if (preg_match("/^\s*!/", $rule['from'])) { 308 $newruletext .= 'not '; 309 $rule['from'] = preg_replace("/^\s*!/", "", $rule['from']); 310 } 311 $match = ':contains'; 312 if (preg_match("/\*|\?/", $rule['from'])) 313 $match = ':matches'; 314 if ($rule['regexp']) 315 $match = ':regex'; 316 $newruletext .= "header " . $match . " [\"From\"]"; 317 $newruletext .= " \"" . $rule['from'] . "\""; 318 $started = 1; 319 } 320 if ($rule['to']) { 321 if ($started) 322 $newruletext .= ", "; 323 if (preg_match("/^\s*!/", $rule['to'])) { 324 $newruletext .= 'not '; 325 $rule['to'] = preg_replace("/^\s*!/", "", $rule['to']); 326 } 327 $match = ':contains'; 328 if (preg_match("/\*|\?/", $rule['to'])) 329 $match = ':matches'; 330 if ($rule['regexp']) 331 $match = ':regex'; 332 $newruletext .= "address " . $match . " [\"To\",\"TO\",\"Cc\",\"CC\"]"; 333 $newruletext .= " \"" . $rule['to'] . "\""; 334 $started = 1; 335 } 336 if ($rule['subject']) { 337 if ($started) 338 $newruletext .= ", "; 339 if (preg_match("/^\s*!/", $rule['subject'])) { 340 $newruletext .= 'not '; 341 $rule['subject'] = preg_replace("/^\s*!/", "", $rule['subject']); 342 } 343 $match = ':contains'; 344 if (preg_match("/\*|\?/", $rule['subject'])) 345 $match = ':matches'; 346 if ($rule['regexp']) 347 $match = ':regex'; 348 $newruletext .= "header " . $match . " \"subject\""; 349 $newruletext .= " \"" . $rule['subject'] . "\""; 350 $started = 1; 351 } 352 if ($rule['field'] && $rule['field_val']) { 353 if ($started) 354 $newruletext .= ", "; 355 if (preg_match("/^\s*!/", $rule['field_val'])) { 356 $newruletext .= 'not '; 357 $rule['field_val'] = preg_replace("/^\s*!/", "", $rule['field_val']); 358 } 359 $match = ':contains'; 360 if (preg_match("/\*|\?/", $rule['field_val'])) 361 $match = ':matches'; 362 if ($rule['regexp']) 363 $match = ':regex'; 364 $newruletext .= "header " . $match . " \"" . $rule['field'] . "\""; 365 $newruletext .= " \"" . $rule['field_val'] . "\""; 366 $started = 1; 367 } 368 369 if ($rule['size'] != '') 370 { 371 if ($rule['size'] == 0) { 372 $xthan = " :under "; 373 if ($rule['gthan']) 374 $xthan = " :over "; 375 if ($started) 376 $newruletext .= ", "; 377 378 $newruletext .= "size " . $xthan . "0K"; 379 $started = 1; 380 } 381 382 if ($rule['size'] > 0) { 383 $xthan = " :under "; 384 if ($rule['gthan']) 385 $xthan = " :over "; 386 if ($started) 387 $newruletext .= ", "; 388 389 $newruletext .= "size " . $xthan . $rule['size'] . "K"; 390 $started = 1; 391 } 392 } 393 } 394 395 // Don't write half rule! 396 if (strlen($newruletext) == 0) 397 return false; 398 // Actions 399 if (!$rule['unconditional']) 400 $newruletext .= ") {\n\t"; 401 402 if (preg_match("/folder/i", $rule['action'])) { 403 $newruletext .= "fileinto \"" . $rule['action_arg'] . "\";"; 404 } 405 406 if (preg_match("/reject/i", $rule['action'])) { 407 $newruletext .= "reject text: \n" . $rule['action_arg'] . "\n.\n;"; 408 $rejectused = 1; 409 } 410 if (preg_match("/flagged/i", $rule['action'])) { 411 $newruletext .= "addflag \"\\\\Flagged\";"; 412 $flaggedused = 1; 413 } 414 if (preg_match("/address/i", $rule['action'])) { 415 $newruletext .= "redirect \"" . $rule['action_arg'] . "\";"; 416 } 417 418 if (preg_match("/notify/i", $rule['action'])) { 419 $newruletext .= "notify :method \"mailto\" :options [\"" . $this->EmailVoip . "\"]:" . 420 "message \"<expressovoip><from>" . $this->EmailExpresso . "</from>" . 421 "<br/><Subject>" . utf8_encode($tmpSubject) . "</Subject></expressovoip>\";"; 422 $notify = 1; 423 } 424 425 if (preg_match("/discard/i", $rule['action'])) { 426 $newruletext .= "discard;"; 427 } 428 if ($rule['keep']) 429 $newruletext .= "\n\tfileinto \"INBOX\";"; 430 //if ($rule['keep']) $newruletext .= "\n\tkeep;"; 431 if (!$rule['unconditional']) 432 $newruletext .= "\n}"; 433 434 $continue = 0; 435 if ($rule['continue']) 436 $continue = 1; 437 if ($rule['unconditional']) 438 $continue = 1; 439 440 $newscriptbody .= $newruletext . "\n\n"; 441 unset($newruletext); 442 } 443 }// Fim do Foreach; 444 $this->teste = $newscriptbody; 445 // Para a regras fora do escritorio; 446 unset($tmp); 447 if ($this->newout != "") { 448 $aux = explode("&&", $this->newout); 449 $vacation['days'] = $aux[1]; 450 $vacation['addresses'] = $aux[2]; 451 $vacation['text'] = preg_replace("/\\\\n/", "\r\n", $aux[3]); 452 $vacation['status'] = $aux[4]; 453 } 454 455 // Monta a regra para fora do escritorio; 456 if ($vacation['status'] == 'on') { 457 $newscriptbody .= "vacation :days " . $vacation['days'] . " :addresses ["; 458 $newscriptbody .= $vacation['addresses']; 459 $newscriptbody .= "] text:\n" . utf8_encode($vacation['text']) . "\n.\n;\n\n"; 460 } 461 462 // Cria o cabeçalho do arquivo; 463 $newscripthead = ""; 464 $newscripthead .= "#Mail filter rules for " . $this->username . "\n"; 465 $newscripthead .= '#Generated by ' . $this->username . ' using Expressomail '; 466 $newscripthead .= "\n"; 467 468 // Continuação do cabeçalho do arquivo; 469 if ($activerules) { 470 $newscripthead .= "require [\"fileinto\""; 471 472 if ($notify) { 473 $newscripthead .= ",\"notify\""; 474 } 475 if ($regexused) { 476 $newscripthead .= ",\"regex\""; 477 } 478 if ($rejectused) { 479 $newscripthead .= ",\"reject\""; 480 } 481 if ($flaggedused) { 482 $newscripthead .= ",\"imapflags\""; 483 } 484 if ($this->newout && $vacation['status'] == 'on') { 485 $newscripthead .= ",\"vacation\""; 486 } 487 $newscripthead .= "];\n\n"; 488 } else { 489 if ($vacation && $vacation['status'] == 'on') { 490 $newscripthead .= "require [\"vacation\"];\n\n"; 491 } 492 } 493 494 // Cria o rodapé do arquivo; 495 $newscriptfoot = ""; 496 $newscriptfoot .= "##PSEUDO script start\n"; 497 // Lê as regras; 498 foreach ($this->newrules as $tmp) { 499 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $tmp) . "\n"; 500 } 501 // Lê as regras fora do escritório; 502 if ($this->newout != "") { 503 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $this->newout) . "\n"; 504 } 505 $newscriptfoot .= "#mode&&basic\n"; 506 507 $newscript = $newscripthead . $newscriptbody . $newscriptfoot; 508 509 // Destroi as variaveis; 510 unset($rule); 511 unset($vacation); 512 unset($activerules); 513 unset($regexused); 514 unset($rejectused); 515 unset($flaggedused); 516 unset($newscripthead); 517 unset($newscriptbody); 518 unset($newscriptfoot); 519 unset($continue); 520 unset($this->newrules); 521 unset($this->newout); 522 523 // Retorna o script construido; 524 return $newscript; 525 } 8 //Declaração de Variáveis; 9 var $SieveS; // Var para criação do objeto; 10 var $reply; // Var para resposta; 11 var $scriptfile; // Nome do script; 12 var $username; // Nome do usuario; 13 var $rules; // Regras do sieve; 14 var $errstr; // Erros retornados; 15 var $size; // Tamanho; 16 var $so; // Verifica se a regra foi criada por outro tipo serviço de filtros; 17 var $continuebit; 18 var $sizebit; 19 var $anyofbit; 20 var $keepbit; 21 var $regexbit; 22 var $newrules = array(); 23 var $newout; 24 var $teste; 25 var $EmailVoip; 26 var $EmailExpresso; 27 28 function ScriptS() { 29 30 //Cria o objeto; 31 $this->SieveS = new SieveS(); 32 33 //$this->scriptfile = $GLOBALS['HTTP_SESSION_VARS']['phpgw_info']['expressomail']['user']['account_lid']; 34 $this->scriptfile = $_SESSION['phpgw_info']['expressomail']['user']['account_lid']; 35 $this->username = $this->scriptfile; 36 37 $this->reply = ""; 38 $this->rules = ""; 39 $this->errstr = ""; 40 $this->size = ""; 41 42 $this->continuebit = 1; 43 $this->sizebit = 1; 44 $this->anyofbit = 4; 45 $this->keepbit = 8; 46 $this->regexbit = 128; 47 48 $this->EmailVoip = trim($_SESSION['phpgw_info']['user']['preferences']['expressoMail']['voip_email_redirect']); 49 $this->EmailExpresso = trim($_SESSION['phpgw_info']['expressomail']['user']['email']); 50 } 51 52 function init_a() { 53 54 //Abre a conexão 55 $this->SieveS->start(); 56 57 $this->reply = $this->SieveS->getscript(); 58 59 if (!$this->reply) { 60 61 $aux = $this->SieveS->putscript($this->scriptfile, $this->createScript()); 62 if (!$aux) { 63 // Caso de erro, grava dentro da variável errstr; 64 $this->errstr = "Error: file not created"; 65 return $this->errstr; 66 } 67 // Mata a variavel; 68 unset($aux); 69 // Ativa o script; 70 $aux = $this->SieveS->activatescript($this->scriptfile); 71 72 if (!$aux) { 73 // Caso de erro, grava dentro da variavel errstr; 74 $this->errstr = "Error: error to activate file"; 75 return $this->errstr; 76 } else { 77 $this->reply = $this->SieveS->getscript(); 78 $this->rules = $this->readScript($this->reply); 79 } 80 } else { 81 $this->rules = $this->readScript($this->reply); 82 } 83 84 //Fecha a conexao 85 $this->SieveS->close(); 86 87 if ($this->rules) 88 return $this->rules; 89 } 90 91 function rec_rules($params) { 92 93 $newr1 = array(); 94 $newr2 = array(); 95 $newr3 = array(); 96 97 $var_decode = rawurldecode($params['arfilter']); 98 $var_decode = preg_replace('/\n\./', '.', $var_decode); 99 100 $narray = explode("_end_", $var_decode); 101 102 foreach ($narray as $key => $tmp) { 103 if ($tmp != "") { 104 $newr1[] = $tmp; 105 } 106 } 107 unset($key); 108 unset($tmp); 109 foreach ($newr1 as $key => $tmp) { 110 $tmp2 = explode("_begin_##", $tmp); 111 foreach ($tmp2 as $tmp3) { 112 if ($tmp3 != "") { 113 $newr2[] = trim($tmp3); 114 } 115 } 116 } 117 118 unset($tmp); 119 unset($tmp2); 120 unset($tmp3); 121 122 foreach ($newr2 as $tmp) { 123 if (trim($tmp) != "") { 124 $tmp2 = explode("##", $tmp); 125 foreach ($tmp2 as $tmp3) { 126 $tmp4 .= trim($tmp3) . "&&"; 127 } 128 $newr3[] = substr($tmp4, 0, (strlen($tmp4) - 4)); 129 unset($tmp2); 130 unset($tmp3); 131 unset($tmp4); 132 } 133 } 134 135 $tmp = $newr3[count($newr3) - 1]; 136 137 if (substr($tmp, 0, 9) == "#vacation") { 138 $this->newout = array_pop($newr3); 139 foreach ($newr3 as $key => $tmp) { 140 $this->newrules[] = $tmp; 141 } 142 } else { 143 foreach ($newr3 as $tmp) { 144 $this->newrules[] = $tmp; 145 } 146 } 147 148 unset($tmp); 149 $tmp = explode("&&", $this->newout); 150 $tmp1 = explode(",", $tmp[2]); 151 foreach ($tmp1 as $key => $tmp2) { 152 $tmp3 .= stripslashes(trim($tmp2)) . ", "; 153 } 154 $tmp3 = substr($tmp3, 0, (strlen($tmp3) - 2)); 155 156 unset($tmp); 157 unset($tmp1); 158 unset($tmp2); 159 unset($key); 160 $tmp = explode("&&", $this->newout); 161 foreach ($tmp as $key => $tmp1) { 162 if ($key == 2) { 163 $tmp2 .= trim($tmp3) . "&&"; 164 } else { 165 $tmp2 .= trim($tmp1) . "&&"; 166 } 167 } 168 unset($this->newout); 169 $this->newout = substr($tmp2, 0, (strlen($tmp2) - 2)); 170 171 //Abre a conexao 172 $this->SieveS->start(); 173 $this->errstr = ""; 174 175 // Escreve a nova regra; 176 $this->reply = $this->SieveS->getscript(); 177 /* 178 if($this->reply){ 179 $this->errstr = $this->SieveS->deletescript($this->scriptfile); 180 } 181 */ 182 183 $error_log_file = "/home/expressolivre/sieve_error.log"; 184 //Escreve a(s) nova(s) regra(s); 185 $newrule = $this->write_rule(); 186 if (strlen($newrule) > 0) 187 $this->errstr = $this->SieveS->putscript($this->scriptfile, $newrule); 188 else { 189 if ($_SESSION['phpgw_info']['server']['expressomail']['expressoMail_enable_log_messages'] == "True") 190 error_log(date("D M j G:i:s T Y") . ": SieveError, Invalid rule for " 191 . $_SESSION['phpgw_info']['expressomail']['user']['userid'] . "=>" 192 . $this->teste . "\nRule:" 193 . $var_decode . "\n", 3, $error_log_file); 194 return "Invalid rule\n" . $this->teste; 195 } 196 197 //Ativa o script; 198 $this->errstr = $this->SieveS->activatescript($this->scriptfile); 199 200 //Fecha a conexao 201 $this->SieveS->close(); 202 203 if ($this->errstr) { 204 return "Ok"; 205 } else { 206 if ($_SESSION['phpgw_info']['server']['expressomail']['expressoMail_enable_log_messages'] == "True") 207 error_log(date("D M j G:i:s T Y") 208 . ": SieveError, Problem for " 209 . $_SESSION['phpgw_info']['expressomail']['user']['userid'] . "=>" 210 . " " 211 . $this->SieveS->errstr . "\n", 3, $error_log_file); 212 return "Problemas na criação do arquivo!\n" . $this->teste; 213 } 214 } 215 216 function convert_specialchar($input) { 217 $special_char = false; 218 for ($i = 0; $i < strlen($input); $i++) { 219 if (preg_match('/[^a-z0-9.@~_+=&\'*^\ \-\[\]]/i', $input[$i])) { 220 $special_char = true; 221 $input = preg_replace('/\\' . $input[$i] . '/', '=' . bin2hex($input[$i]), $input); 222 } 223 } 224 225 if ($special_char) { 226 /* * 227 * When using arrays with pattern and replacement, 228 * the keys are processed in the order they appear in the array. 229 * See preg_replace in php.net/preg_replace 230 * */ 231 $patterns[0] = '/=c3/i'; 232 $patterns[1] = '/ /'; 233 $replacements[1] = ''; 234 $replacements[0] = '_'; 235 $input = preg_replace($patterns, $replacements, $input); 236 } 237 238 return($input); 239 } 240 241 // build the rule 242 function write_rule() { 243 244 // Variaveis; 245 $rule = array(); 246 $vacation = array(); 247 $newruletext = ""; 248 $activerules = 0; 249 $regexused = 0; 250 $rejectused = 0; 251 $notify = 0; 252 $flaggedused = 0; 253 $newscriptbody = ""; 254 $continue = 1; 255 $tmpSubject = ""; 256 257 // Recebe os valores das regras; 258 foreach ($this->newrules as $tmp) 259 { 260 $tmp1 = explode("&&", $tmp); 261 $rule['priority'] = $tmp1[1]; 262 $rule['status'] = $tmp1[2]; 263 $rule['from'] = $this->convert_specialchar($tmp1[3]); 264 $rule['to'] = $this->convert_specialchar($tmp1[4]); 265 $tmpSubject = $tmp1[5]; 266 $rule['subject'] = $this->convert_specialchar($tmp1[5]); 267 $rule['action'] = $tmp1[6]; 268 $rule['action_arg'] = utf8_encode(preg_replace("/\\r\\n/", "\r\n", $tmp1[7])); 269 $rule['flg'] = $tmp1[8]; 270 $rule['field'] = $tmp1[9]; 271 $rule['field_val'] = $tmp1[10]; 272 $rule['size'] = trim($tmp1[11]); 273 $rule['continue'] = ($tmp1[8] & $this->continuebit); 274 $rule['gthan'] = ($tmp1[8] & $this->sizebit); 275 $rule['anyof'] = ($tmp1[8] & $this->anyofbit); 276 $rule['keep'] = ($tmp1[8] & $this->keepbit); 277 $rule['regexp'] = ($tmp1[8] & $this->regexbit); 278 $rule['unconditional'] = 0; 279 280 if (!$rule['from'] && !$rule['to'] && !$rule['subject'] && !$rule['field'] && empty($rule['size']) && $rule['action']) { 281 $rule['unconditional'] = 1; 282 283 if ($rule['unconditional'] && ($rule['size'] == "0" || $rule['size'] == 0 )) 284 $rule['unconditional'] = 0; 285 } 286 287 unset($tmp1); 288 289 // Monta as regras; 290 if ($rule['status'] == 'ENABLED') 291 { 292 $activerules = 1; 293 294 // Condições para montagem das regras; 295 $anyall = "allof"; 296 if ($rule['anyof']) 297 $anyall = "anyof"; 298 if ($rule['regexp']) { 299 $regexused = 1; 300 } 301 $started = 0; 302 303 if (!$rule['unconditional']) { 304 if (!$continue) 305 $newruletext .= "els"; 306 $newruletext .= "if " . $anyall . " ("; 307 if ($rule['from']) { 308 if (preg_match("/^\s*!/", $rule['from'])) { 309 $newruletext .= 'not '; 310 $rule['from'] = preg_replace("/^\s*!/", "", $rule['from']); 311 } 312 $match = ':contains'; 313 if (preg_match("/\*|\?/", $rule['from'])) 314 $match = ':matches'; 315 if ($rule['regexp']) 316 $match = ':regex'; 317 $newruletext .= "header " . $match . " [\"From\"]"; 318 $newruletext .= " \"" . $rule['from'] . "\""; 319 $started = 1; 320 } 321 if ($rule['to']) { 322 if ($started) 323 $newruletext .= ", "; 324 if (preg_match("/^\s*!/", $rule['to'])) { 325 $newruletext .= 'not '; 326 $rule['to'] = preg_replace("/^\s*!/", "", $rule['to']); 327 } 328 $match = ':contains'; 329 if (preg_match("/\*|\?/", $rule['to'])) 330 $match = ':matches'; 331 if ($rule['regexp']) 332 $match = ':regex'; 333 $newruletext .= "address " . $match . " [\"To\",\"TO\",\"Cc\",\"CC\"]"; 334 $newruletext .= " \"" . $rule['to'] . "\""; 335 $started = 1; 336 } 337 if ($rule['subject']) { 338 if ($started) 339 $newruletext .= ", "; 340 if (preg_match("/^\s*!/", $rule['subject'])) { 341 $newruletext .= 'not '; 342 $rule['subject'] = preg_replace("/^\s*!/", "", $rule['subject']); 343 } 344 $match = ':contains'; 345 if (preg_match("/\*|\?/", $rule['subject'])) 346 $match = ':matches'; 347 if ($rule['regexp']) 348 $match = ':regex'; 349 $newruletext .= "header " . $match . " \"subject\""; 350 $newruletext .= " \"" . $rule['subject'] . "\""; 351 $started = 1; 352 } 353 if ($rule['field'] && $rule['field_val']) { 354 if ($started) 355 $newruletext .= ", "; 356 if (preg_match("/^\s*!/", $rule['field_val'])) { 357 $newruletext .= 'not '; 358 $rule['field_val'] = preg_replace("/^\s*!/", "", $rule['field_val']); 359 } 360 $match = ':contains'; 361 if (preg_match("/\*|\?/", $rule['field_val'])) 362 $match = ':matches'; 363 if ($rule['regexp']) 364 $match = ':regex'; 365 $newruletext .= "header " . $match . " \"" . $rule['field'] . "\""; 366 $newruletext .= " \"" . $rule['field_val'] . "\""; 367 $started = 1; 368 } 369 370 if ($rule['size'] != '') 371 { 372 if ($rule['size'] == 0 && $rule['gthan']) 373 { 374 $xthan = " :over "; 375 376 if ($started) 377 $newruletext .= ", "; 378 379 $newruletext .= "size " . $xthan . "0K"; 380 $started = 1; 381 } 382 383 if ($rule['size'] > 0) { 384 $xthan = " :under "; 385 if ($rule['gthan']) 386 $xthan = " :over "; 387 if ($started) 388 $newruletext .= ", "; 389 390 $newruletext .= "size " . $xthan . $rule['size'] . "K"; 391 $started = 1; 392 } 393 } 394 } 395 396 // Don't write half rule! 397 if (strlen($newruletext) == 0) 398 return false; 399 // Actions 400 if (!$rule['unconditional']) 401 $newruletext .= ") {\n\t"; 402 403 if (preg_match("/folder/i", $rule['action'])) { 404 $newruletext .= "fileinto \"" . $rule['action_arg'] . "\";"; 405 } 406 407 if (preg_match("/reject/i", $rule['action'])) { 408 $newruletext .= "reject text: \n" . $rule['action_arg'] . "\n.\n;"; 409 $rejectused = 1; 410 } 411 if (preg_match("/flagged/i", $rule['action'])) { 412 $newruletext .= "addflag \"\\\\Flagged\";"; 413 $flaggedused = 1; 414 } 415 if (preg_match("/address/i", $rule['action'])) { 416 $newruletext .= "redirect \"" . $rule['action_arg'] . "\";"; 417 } 418 419 if (preg_match("/notify/i", $rule['action'])) { 420 $newruletext .= "notify :method \"mailto\" :options [\"" . $this->EmailVoip . "\"]:" . 421 "message \"<expressovoip><from>" . $this->EmailExpresso . "</from>" . 422 "<br/><Subject>" . utf8_encode($tmpSubject) . "</Subject></expressovoip>\";"; 423 $notify = 1; 424 } 425 426 if (preg_match("/discard/i", $rule['action'])) { 427 $newruletext .= "discard;"; 428 } 429 if ($rule['keep']) 430 $newruletext .= "\n\tfileinto \"INBOX\";"; 431 //if ($rule['keep']) $newruletext .= "\n\tkeep;"; 432 if (!$rule['unconditional']) 433 $newruletext .= "\n}"; 434 435 $continue = 0; 436 if ($rule['continue']) 437 $continue = 1; 438 if ($rule['unconditional']) 439 $continue = 1; 440 441 $newscriptbody .= $newruletext . "\n\n"; 442 unset($newruletext); 443 } 444 }// Fim do Foreach; 445 $this->teste = $newscriptbody; 446 // Para a regras fora do escritorio; 447 unset($tmp); 448 if ($this->newout != "") { 449 $aux = explode("&&", $this->newout); 450 $vacation['days'] = $aux[1]; 451 $vacation['addresses'] = $aux[2]; 452 $vacation['text'] = preg_replace("/\\\\n/", "\r\n", $aux[3]); 453 $vacation['status'] = $aux[4]; 454 } 455 456 // Monta a regra para fora do escritorio; 457 if ($vacation['status'] == 'on') { 458 $newscriptbody .= "vacation :days " . $vacation['days'] . " :addresses ["; 459 $newscriptbody .= $vacation['addresses']; 460 $newscriptbody .= "] text:\n" . utf8_encode($vacation['text']) . "\n.\n;\n\n"; 461 } 462 463 // Cria o cabeçalho do arquivo; 464 $newscripthead = ""; 465 $newscripthead .= "#Mail filter rules for " . $this->username . "\n"; 466 $newscripthead .= '#Generated by ' . $this->username . ' using Expressomail '; 467 $newscripthead .= "\n"; 468 469 // Continuação do cabeçalho do arquivo; 470 if ($activerules) { 471 $newscripthead .= "require [\"fileinto\""; 472 473 if ($notify) { 474 $newscripthead .= ",\"notify\""; 475 } 476 if ($regexused) { 477 $newscripthead .= ",\"regex\""; 478 } 479 if ($rejectused) { 480 $newscripthead .= ",\"reject\""; 481 } 482 if ($flaggedused) { 483 $newscripthead .= ",\"imapflags\""; 484 } 485 if ($this->newout && $vacation['status'] == 'on') { 486 $newscripthead .= ",\"vacation\""; 487 } 488 $newscripthead .= "];\n\n"; 489 } else { 490 if ($vacation && $vacation['status'] == 'on') { 491 $newscripthead .= "require [\"vacation\"];\n\n"; 492 } 493 } 494 495 // Cria o rodapé do arquivo; 496 $newscriptfoot = ""; 497 $newscriptfoot .= "##PSEUDO script start\n"; 498 // Lê as regras; 499 foreach ($this->newrules as $tmp) { 500 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $tmp) . "\n"; 501 } 502 // Lê as regras fora do escritório; 503 if ($this->newout != "") { 504 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $this->newout) . "\n"; 505 } 506 $newscriptfoot .= "#mode&&basic\n"; 507 508 $newscript = $newscripthead . $newscriptbody . $newscriptfoot; 509 510 // Destroi as variaveis; 511 unset($rule); 512 unset($vacation); 513 unset($activerules); 514 unset($regexused); 515 unset($rejectused); 516 unset($flaggedused); 517 unset($newscripthead); 518 unset($newscriptbody); 519 unset($newscriptfoot); 520 unset($continue); 521 unset($this->newrules); 522 unset($this->newout); 523 524 // Retorna o script construido; 525 return $newscript; 526 } 526 527 527 528 // Fim da Função 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 529 // Cria o script sieve, caso nao possua; 530 function createScript() { 531 532 // Cria o cabeçalho do arquivo; 533 $newScriptHead = ""; 534 $newScriptHead .= "#Mail filter rules for " . $this->username . "\n"; 535 $newScriptHead .= '#Generated by ' . $this->username . ' using ExpressoMail '; 536 $newScriptHead .= "\n"; 537 538 //Cria o rodapé do arquivo; 539 $newScriptFoot = ""; 540 $newScriptFoot .= "##PSEUDO Script Start\n"; 541 $newScriptFoot .= "#mode&&basic\n"; 542 543 //Para passar para o arquivo; 544 $newScript = $newScriptHead . $newScriptFoot; 545 546 return $newScript; 547 } 548 549 //Lê o conteúdo do script; 550 function readScript($scriptName) { 551 552 // Verifica se a conexão foi bem sucedida; 553 if (!$scriptName) { 554 $this->errstr = "Não foi possível conectar com o Servidor"; 555 return "false 2"; 556 } 557 558 // Recebe o conteúdo do array; 559 $lines = array(); 560 $lines = preg_split("/\n/", $scriptName); 561 562 // Pega o tamanho da regra na primeira do script; 563 $size_rule = array_shift($lines); 564 565 // Recebe o tamanho do script, pela primeira linha; 566 $this->size = trim($size_rule); 567 568 // Verifica a composição do script; 569 $line = array_shift($lines); 570 if (!preg_match("/^# ?Mail(.*)rules for/", $line)) { 571 $this->errstr = "Formato nao reconhecido"; 572 return false; 573 } 574 575 // Variaveis para a regra e o campo ferias; 576 $regexps = array('^ *##PSEUDO', '^ *#rule', '^ *#vacation', '^ *#mode'); 577 $retorno['rule'] = array(); 578 $retorno['vacation'] = array(); 579 $retorno['mode'] = array(); 580 581 $line = array_shift($lines); 582 while (isset($line)) { 583 foreach ($regexps as $regp) { 584 if (preg_match("/$regp/i", $line)) { 585 // Recebe todas as regras criadas no servidor; 586 if (preg_match("/^ *#rule&&/i", $line)) { 587 $retorno['rule'][] = $line . "\n"; 588 } 589 if (preg_match("/^ *#vacation&&/i", $line)) { 590 $retorno['vacation'][] = $line . "\n"; 591 } 592 if (preg_match("/^ *#mode&&(.*)/i", $line)) { 593 $retorno['mode'][] = $line . "\n"; 594 } 595 } 596 } 597 // Pega a proxima linha do sript; 598 $line = array_shift($lines); 599 } 600 return $retorno; 601 } 601 602 602 603 }
Note: See TracChangeset
for help on using the changeset viewer.