source: branches/2.2/expressoMail1_2/inc/class.ScriptS.inc.php @ 3859

Revision 3859, 16.3 KB checked in by alexandrecorreia, 13 years ago (diff)

Ticket #1650 - Filtros de tamanho de mensagem maior que zero nao sao criados.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2
3//Inclui o arquivo contendo a classe SieveS;
4include('class.SieveS.inc.php');
5
6class ScriptS {
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 = 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                        $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        }
526
527// 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        }
601
602}
603
604//Fim da Classe
605?>
Note: See TracBrowser for help on using the repository browser.