Changeset 4539


Ignore:
Timestamp:
05/27/11 15:09:18 (9 years ago)
Author:
alexandrecorreia
Message:

Ticket #1927 - Correcao para regras modificadas quando migra o expresso 2.0 para o 2.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2/expressoMail1_2/inc/class.ScriptS.inc.php

    r4484 r4539  
    66class ScriptS { 
    77 
    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      = 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        { 
     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    } 
    526527 
    527528// Fim da Função 
    528         // Cria o script sieve, caso nao possua; 
    529         function createScript() { 
    530  
    531                 // Cria o cabeçalho do arquivo; 
    532                 $newScriptHead = ""; 
    533                 $newScriptHead .= "#Mail filter rules for " . $this->username . "\n"; 
    534                 $newScriptHead .= '#Generated by ' . $this->username . ' using ExpressoMail '; 
    535                 $newScriptHead .= "\n"; 
    536  
    537                 //Cria o rodapé do arquivo; 
    538                 $newScriptFoot = ""; 
    539                 $newScriptFoot .= "##PSEUDO Script Start\n"; 
    540                 $newScriptFoot .= "#mode&&basic\n"; 
    541  
    542                 //Para passar para o arquivo; 
    543                 $newScript = $newScriptHead . $newScriptFoot; 
    544  
    545                 return $newScript; 
    546         } 
    547  
    548         //Lê o conteúdo do script; 
    549         function readScript($scriptName) { 
    550  
    551                 // Verifica se a conexão foi bem sucedida; 
    552                 if (!$scriptName) { 
    553                         $this->errstr = "Não foi possível conectar com o Servidor"; 
    554                         return "false 2"; 
    555                 } 
    556  
    557                 // Recebe o conteúdo do array; 
    558                 $lines = array(); 
    559                 $lines = preg_split("/\n/", $scriptName); 
    560  
    561                 // Pega o tamanho da regra na primeira do script; 
    562                 $size_rule = array_shift($lines); 
    563  
    564                 // Recebe o tamanho do script, pela primeira linha; 
    565                 $this->size = trim($size_rule); 
    566  
    567                 // Verifica a composição do script; 
    568                 $line = array_shift($lines); 
    569                 if (!preg_match("/^# ?Mail(.*)rules for/", $line)) { 
    570                         $this->errstr = "Formato nao reconhecido"; 
    571                         return false; 
    572                 } 
    573  
    574                 // Variaveis para a regra e o campo ferias; 
    575                 $regexps = array('^ *##PSEUDO', '^ *#rule', '^ *#vacation', '^ *#mode'); 
    576                 $retorno['rule'] = array(); 
    577                 $retorno['vacation'] = array(); 
    578                 $retorno['mode'] = array(); 
    579  
    580                 $line = array_shift($lines); 
    581                 while (isset($line)) { 
    582                         foreach ($regexps as $regp) { 
    583                                 if (preg_match("/$regp/i", $line)) { 
    584                                         // Recebe todas as regras criadas no servidor; 
    585                                         if (preg_match("/^ *#rule&&/i", $line)) { 
    586                                                 $retorno['rule'][] = $line . "\n"; 
    587                                         } 
    588                                         if (preg_match("/^ *#vacation&&/i", $line)) { 
    589                                                 $retorno['vacation'][] = $line . "\n"; 
    590                                         } 
    591                                         if (preg_match("/^ *#mode&&(.*)/i", $line)) { 
    592                                                 $retorno['mode'][] = $line . "\n"; 
    593                                         } 
    594                                 } 
    595                         } 
    596                         // Pega a proxima linha do sript; 
    597                         $line = array_shift($lines); 
    598                 } 
    599                 return $retorno; 
    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    } 
    601602 
    602603} 
Note: See TracChangeset for help on using the changeset viewer.