Changeset 4706
- Timestamp:
- 07/13/11 16:52:06 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/expressoMail1_2/inc/class.ScriptS.inc.php
r4523 r4706 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 $temp_input = $input; 218 $temp_input = imap_8bit($temp_input); 219 220 $patterns[0] = '/ /'; 221 $replacements[0] = '_'; 222 $temp_input = preg_replace($patterns, $replacements, $temp_input); 223 return ($temp_input); 224 } 225 226 // build the rule 227 function write_rule() { 228 229 // Variaveis; 230 $rule = array(); 231 $vacation = array(); 232 $newruletext = ""; 233 $activerules = 0; 234 $regexused = 0; 235 $rejectused = 0; 236 $notify = 0; 237 $flaggedused = 0; 238 $newscriptbody = ""; 239 $continue = 1; 240 $tmpSubject = ""; 241 242 // Recebe os valores das regras; 243 foreach ($this->newrules as $tmp) { 244 $tmp1 = explode("&&", $tmp); 245 $rule['priority'] = $tmp1[1]; 246 $rule['status'] = $tmp1[2]; 247 $rule['from'] = $this->convert_specialchar($tmp1[3]); 248 $rule['to'] = $this->convert_specialchar($tmp1[4]); 249 $tmpSubject = $tmp1[5]; 250 $rule['subject'] = $rule['subject'] = " [\"" . $this->convert_specialchar($tmp1[5]) . "\", \"" . base64_encode($tmp1[5]) . "\"]"; 251 $rule['action'] = $tmp1[6]; 252 $rule['action_arg'] = utf8_encode(preg_replace("/\\r\\n/", "\r\n", $tmp1[7])); 253 $rule['flg'] = $tmp1[8]; 254 $rule['field'] = $tmp1[9]; 255 $rule['field_val'] = $tmp1[10]; 256 $rule['size'] = $tmp1[11]; 257 $rule['continue'] = ($tmp1[8] & $this->continuebit); 258 $rule['gthan'] = ($tmp1[8] & $this->sizebit); 259 $rule['anyof'] = ($tmp1[8] & $this->anyofbit); 260 $rule['keep'] = ($tmp1[8] & $this->keepbit); 261 $rule['regexp'] = ($tmp1[8] & $this->regexbit); 262 $rule['unconditional'] = 0; 263 264 if (!$rule['from'] && !$rule['to'] && !$rule['subject'] && !$rule['field'] && empty($rule['size']) && $rule['action']) { 265 $rule['unconditional'] = 1; 266 267 if ($rule['unconditional'] && ($rule['size'] == "0" || $rule['size'] == 0 )) 268 $rule['unconditional'] = 0; 269 } 270 unset($tmp1); 271 272 // Monta as regras; 273 if ($rule['status'] != 'ENABLED') { 274 275 } else { 276 $activerules = 1; 277 278 // Condições para montagem das regras; 279 $anyall = "allof"; 280 if ($rule['anyof']) 281 $anyall = "anyof"; 282 if ($rule['regexp']) { 283 $regexused = 1; 284 } 285 $started = 0; 286 287 if (!$rule['unconditional']) { 288 if (!$continue) 289 $newruletext .= "els"; 290 $newruletext .= "if " . $anyall . " ("; 291 if ($rule['from']) { 292 if (preg_match("/^\s*!/", $rule['from'])) { 293 $newruletext .= 'not '; 294 $rule['from'] = preg_replace("/^\s*!/", "", $rule['from']); 295 } 296 $match = ':contains'; 297 if (preg_match("/\*|\?/", $rule['from'])) 298 $match = ':matches'; 299 if ($rule['regexp']) 300 $match = ':regex'; 301 $newruletext .= "header " . $match . " [\"From\"]"; 302 $newruletext .= " \"" . $rule['from'] . "\""; 303 $started = 1; 304 } 305 if ($rule['to']) { 306 if ($started) 307 $newruletext .= ", "; 308 if (preg_match("/^\s*!/", $rule['to'])) { 309 $newruletext .= 'not '; 310 $rule['to'] = preg_replace("/^\s*!/", "", $rule['to']); 311 } 312 $match = ':contains'; 313 if (preg_match("/\*|\?/", $rule['to'])) 314 $match = ':matches'; 315 if ($rule['regexp']) 316 $match = ':regex'; 317 $newruletext .= "address " . $match . " [\"To\",\"TO\",\"Cc\",\"CC\"]"; 318 $newruletext .= " \"" . $rule['to'] . "\""; 319 $started = 1; 320 } 321 if ($rule['subject']) { 322 if ($started) 323 $newruletext .= ", "; 324 if (preg_match("/^\s*!/", $rule['subject'])) { 325 $newruletext .= 'not '; 326 $rule['subject'] = preg_replace("/^\s*!/", "", $rule['subject']); 327 } 328 $match = ':contains'; 329 if (preg_match("/\*|\?/", $rule['subject'])) 330 $match = ':matches'; 331 if ($rule['regexp']) 332 $match = ':regex'; 333 $newruletext .= "header " . $match . " \"subject\""; 334 $newruletext .= "" . $rule['subject'] . ""; 335 $started = 1; 336 } 337 if ($rule['field'] && $rule['field_val']) { 338 if ($started) 339 $newruletext .= ", "; 340 if (preg_match("/^\s*!/", $rule['field_val'])) { 341 $newruletext .= 'not '; 342 $rule['field_val'] = preg_replace("/^\s*!/", "", $rule['field_val']); 343 } 344 $match = ':contains'; 345 if (preg_match("/\*|\?/", $rule['field_val'])) 346 $match = ':matches'; 347 if ($rule['regexp']) 348 $match = ':regex'; 349 $newruletext .= "header " . $match . " \"" . $rule['field'] . "\""; 350 $newruletext .= " \"" . $rule['field_val'] . "\""; 351 $started = 1; 352 } 353 354 if ($rule['size'] != '') 355 { 356 if ($rule['size'] == 0) { 357 $xthan = " :under "; 358 if ($rule['gthan']) 359 $xthan = " :over "; 360 if ($started) 361 $newruletext .= ", "; 362 363 $newruletext .= "size " . $xthan . "0K"; 364 $started = 1; 365 } 366 367 if ($rule['size'] > 0) { 368 $xthan = " :under "; 369 if ($rule['gthan']) 370 $xthan = " :over "; 371 if ($started) 372 $newruletext .= ", "; 373 374 $newruletext .= "size " . $xthan . $rule['size'] . "K"; 375 $started = 1; 376 } 377 } 378 } 379 380 // Don't write half rule! 381 if (strlen($newruletext) == 0) 382 return false; 383 // Actions 384 if (!$rule['unconditional']) 385 $newruletext .= ") {\n\t"; 386 387 if (preg_match("/folder/i", $rule['action'])) { 388 $newruletext .= "fileinto \"" . $rule['action_arg'] . "\";"; 389 } 390 391 if (preg_match("/reject/i", $rule['action'])) { 392 $newruletext .= "reject text: \n" . $rule['action_arg'] . "\n.\n;"; 393 $rejectused = 1; 394 } 395 if (preg_match("/flagged/i", $rule['action'])) { 396 $newruletext .= "addflag \"\\\\Flagged\";"; 397 $flaggedused = 1; 398 } 399 if (preg_match("/address/i", $rule['action'])) { 400 $newruletext .= "redirect \"" . $rule['action_arg'] . "\";"; 401 } 402 403 if (preg_match("/notify/i", $rule['action'])) { 404 $newruletext .= "notify :method \"mailto\" :options [\"" . $this->EmailVoip . "\"]:" . 405 "message \"<expressovoip><from>" . $this->EmailExpresso . "</from>" . 406 "<br/><Subject>" . utf8_encode($tmpSubject) . "</Subject></expressovoip>\";"; 407 $notify = 1; 408 } 409 410 if (preg_match("/discard/i", $rule['action'])) { 411 $newruletext .= "discard;"; 412 } 413 if ($rule['keep']) 414 $newruletext .= "\n\tfileinto \"INBOX\";"; 415 //if ($rule['keep']) $newruletext .= "\n\tkeep;"; 416 if (!$rule['unconditional']) 417 $newruletext .= "\n}"; 418 419 $continue = 0; 420 if ($rule['continue']) 421 $continue = 1; 422 if ($rule['unconditional']) 423 $continue = 1; 424 425 $newscriptbody .= $newruletext . "\n\n"; 426 unset($newruletext); 427 } 428 }// Fim do Foreach; 429 $this->teste = $newscriptbody; 430 // Para a regras fora do escritorio; 431 unset($tmp); 432 if ($this->newout != "") { 433 $aux = explode("&&", $this->newout); 434 $vacation['days'] = $aux[1]; 435 $vacation['addresses'] = $aux[2]; 436 $vacation['text'] = preg_replace("/\\\\n/", "\r\n", $aux[3]); 437 $vacation['status'] = $aux[4]; 438 } 439 440 // Monta a regra para fora do escritorio; 441 if ($vacation['status'] == 'on') { 442 $newscriptbody .= "vacation :days " . $vacation['days'] . " :addresses ["; 443 $newscriptbody .= $vacation['addresses']; 444 $newscriptbody .= "] text:\n" . utf8_encode($vacation['text']) . "\n.\n;\n\n"; 445 } 446 447 // Cria o cabeçalho do arquivo; 448 $newscripthead = ""; 449 $newscripthead .= "#Mail filter rules for " . $this->username . "\n"; 450 $newscripthead .= '#Generated by ' . $this->username . ' using Expressomail '; 451 $newscripthead .= "\n"; 452 453 // Continuação do cabeçalho do arquivo; 454 if ($activerules) { 455 $newscripthead .= "require [\"fileinto\""; 456 457 if ($notify) { 458 $newscripthead .= ",\"notify\""; 459 } 460 if ($regexused) { 461 $newscripthead .= ",\"regex\""; 462 } 463 if ($rejectused) { 464 $newscripthead .= ",\"reject\""; 465 } 466 if ($flaggedused) { 467 $newscripthead .= ",\"imapflags\""; 468 } 469 if ($this->newout && $vacation['status'] == 'on') { 470 $newscripthead .= ",\"vacation\""; 471 } 472 $newscripthead .= "];\n\n"; 473 } else { 474 if ($vacation && $vacation['status'] == 'on') { 475 $newscripthead .= "require [\"vacation\"];\n\n"; 476 } 477 } 478 479 // Cria o rodapé do arquivo; 480 $newscriptfoot = ""; 481 $newscriptfoot .= "##PSEUDO script start\n"; 482 // Lê as regras; 483 foreach ($this->newrules as $tmp) { 484 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $tmp) . "\n"; 485 } 486 // Lê as regras fora do escritório; 487 if ($this->newout != "") { 488 $newscriptfoot .= preg_replace("/[\\n\\r]/", " ", $this->newout) . "\n"; 489 } 490 $newscriptfoot .= "#mode&&basic\n"; 491 492 $newscript = $newscripthead . $newscriptbody . $newscriptfoot; 493 494 // Destroi as variaveis; 495 unset($rule); 496 unset($vacation); 497 unset($activerules); 498 unset($regexused); 499 unset($rejectused); 500 unset($flaggedused); 501 unset($newscripthead); 502 unset($newscriptbody); 503 unset($newscriptfoot); 504 unset($continue); 505 unset($this->newrules); 506 unset($this->newout); 507 508 // Retorna o script construido; 509 return $newscript; 510 } 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 } 511 527 512 528 // Fim da Função 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 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 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 } 586 602 587 603 }
Note: See TracChangeset
for help on using the changeset viewer.