source: trunk/prototype/modules/filters/interceptors/FilterMapping.php @ 5629

Revision 5629, 15.1 KB checked in by gustavo, 12 years ago (diff)

Ticket #2088 - Melhorias no editor de regras de filtro de mensagens do Expresso

Line 
1<?php
2/**
3*
4* Copyright (C) 2011 Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
5*
6* This program is free software; you can redistribute it and/or modify it under
7* the terms of the GNU Affero General Public License version 3 as published by
8* the Free Software Foundation with the addition of the following permission
9* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
10* WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE
11* WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
12*
13* This program is distributed in the hope that it will be useful, but WITHOUT
14* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15* FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
16* details.
17*
18* You should have received a copy of the GNU Affero General Public License
19* along with this program; if not, see www.gnu.org/licenses or write to
20* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21* MA 02110-1301 USA.
22*
23* This code is based on the OpenXchange Connector and on the Prognus pSync
24* Connector both developed by the community and licensed under the GPL
25* version 2 or above as published by the Free Software Foundation.
26*
27* You can contact Prognus Software Livre headquarters at Av. Tancredo Neves,
28* 6731, PTI, Bl. 05, Esp. 02, Sl. 10, Foz do Iguaçu - PR - Brasil or at
29* e-mail address prognus@prognus.com.br.
30*
31* Descrição rápida do arquivo
32*
33* Arquivo responsável pela manipulação dos filtros
34*
35* @package    filters
36* @license    http://www.gnu.org/copyleft/gpl.html GPL
37* @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
38* @version    1.0
39* @sponsor    Caixa EconÃŽmica Federal
40* @since      Arquivo disponibilizado na versão 2.4
41*/
42
43
44
45/**
46* Classe responsável pela manipulação dos filtros.
47*
48*
49* @package    prototype
50* @license    http://www.gnu.org/copyleft/gpl.html GPL
51* @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
52* @author     Airton Bordin Junior
53* @author     Gustavo Pereira dos Santos
54* @version    1.0
55* @since      Classe disponibilizada na versão 2.4
56*/
57class FilterMapping
58{
59       
60        var $service;
61       
62       
63        /**
64        * Método que formata o Script de acordo com a sintaxe do Sieve.
65        *
66        * @license    http://www.gnu.org/copyleft/gpl.html GPL
67        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
68        * @sponsor    Caixa EconÃŽmica Federal
69        * @author     Airton Bordin Junior
70        * @author         Gustavo Pereira dos Santos   
71        * @param      <Array> <$rules> <Array com as regras do usuário>
72        * @return     <Regra de acordo com a sintaxe do Sieve>
73        * @access     <public>
74        */
75        public function formatSieveScript( $rules )
76    {
77                $require_fileinto = $require_flag = $require_reject = $require_vacation = $require_body = $require_imapflag = $vacation = $startswith = $endswith = false;
78
79                $script_rules = $script_header = $script_criteria = $vacation_action = "";
80
81                $i = 0;
82
83                foreach( $rules as $name => $data )
84                {
85
86                        if( $data['enabled'] == 'false' )
87                                continue;
88
89                        $vacation = false;
90                        $criteria = $data['criteria'];
91                        $action   = $data['actions'];
92                       
93                        ($i >0) ? $script_match = 'els' : $script_match = '';
94                        $data['isExact'] == 'false' ?  $script_match .= 'if anyof (' : $script_match .= 'if allof (';
95
96                        for ($j=0; $j<count($criteria); $j++)
97                        {                                       
98                                switch($criteria[$j]['field']) {
99                                        case 'To':   
100                                        case 'to':   
101                                        case 'CC':
102                                        case 'Cc':
103                                                $criteria[$j]['field'] = "[\"To\", \"TO\", \"Cc\", \"CC\"]";
104                                                $script_criteria .= "address :";
105                                                break;
106                                        case 'from':
107                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
108                                                $script_criteria .= "address :";
109                                                break;
110                                        case 'size':   
111                                                $criteria[$j]['field'] = '';
112                                                $script_criteria .= "size :";
113                                                break;
114                                        case 'subject':
115                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
116                                                $criteria[$j]['value'] = "" . imap_8bit($criteria[$j]['value']) . "\", \"" . base64_encode($criteria[$j]['value']) . "";
117                                                $script_criteria .= "header :";
118                                                break;
119                                        case 'body':
120                                                $criteria[$j]['field'] = '';
121                                                $script_criteria .= "body :";
122                                                $require_body = true;
123                                                break;
124                                        case 'vacation':
125                                                continue;
126                                        default:
127                                                $script_criteria .= "header :";
128                                                break;
129                                }
130                               
131                                switch ($criteria[$j]['operator']) {
132                                        case '>':
133                                                $criteria[$j]['operator'] = "over";
134                                                break;
135                                        case '<':
136                                                $criteria[$j]['operator'] = "under";
137                                                break;
138                                        case '=':
139                                                $criteria[$j]['operator'] = "is";
140                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
141                                                break;
142                                        case '*':
143                                                $criteria[$j]['operator'] = "contains";
144                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
145                                                break;                                         
146                                        case '^':
147                                                $criteria[$j]['operator'] = "matches";
148                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "*\"]";
149                                                $startswith = true;
150                                                break;
151                                        case '$':
152                                                $criteria[$j]['operator'] = "matches";
153                                                $criteria[$j]['value'] = "[\"*" . $criteria[$j]['value'] . "\"]";
154                                                $endswith = true;
155                                                break;
156                                        /*
157                                           TO-DO:
158                                           Arrrumar regra do "não contém".
159                                        */
160                                        case '!*':
161                                                $criteria[$j]['operator'] = "contains";
162                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
163                                                break;
164                                }
165                               
166                                if ($criteria[$j]['field'] == "" || $criteria[$j]['field'] == "\"subject\"" || $startswith || $endswith)
167                                {
168                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
169                                        $startswith = $endswith = false;
170                                }
171                                else
172                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
173                        }
174                        $script_criteria = substr($script_criteria,0,-2);
175                        /* if ($vacation == false) */
176                        $script_criteria .= ")";
177
178                        $script_action = " {\r\n ";
179                        for ($k=0; $k<count($action); $k++)
180                        {
181                                switch ($action[$k]['type']) {
182                                        case 'redirect':
183                                                break;
184                                        case 'reject':
185                                                $require_reject = true;
186                                                break;
187                                        case 'fileinto':
188                                                $require_fileinto = true;
189                                                break;
190                                        case 'vacation':
191                                                $require_vacation = true;
192                                                $action[$k]['parameter'] = "\"" . $action[$k]['parameter'] . "\"";
193                                                $vacation_action = " :subject \"Fora do Escritório\" " . $action[$k]['parameter'] . ";";
194                                                $vacation = true;
195                                                continue;
196                                        case 'setflag':
197                                                $require_flag = true;
198                                                $action[$k]['parameter'] = "\\\\" . $action[$k]['parameter'];
199                                                break;
200                                        case 'discard':
201                                                break;
202                                }
203                                if ($vacation == false) $script_action .= $action[$k]['type'] . " \"" . $action[$k]['parameter'] . "\";\r\n ";
204                        }
205
206                        $script_action .= "}";
207                       
208                        if($vacation != true)
209                                $script_rules .= $script_match . $script_criteria . $script_action . "\r\n";
210
211                        if($data['id'] != "vacation")
212                                $i++;
213                        $script_match = "";
214                        $script_criteria = "";
215                       
216                }
217
218                if($require_reject || $require_fileinto || $require_vacation || $require_body || $require_flag)
219                {
220                        $script_header .= "require [";
221                        $require_reject ? $script_header .= "\"reject\", " : "";
222                        $require_fileinto ? $script_header .= "\"fileinto\", " : "";
223                        $require_vacation? $script_header .= "\"vacation\", " : ""; 
224                        $require_flag ? $script_header .= "\"imapflags\", " : ""; 
225                        $require_body ? $script_header .= "\"body\", " : "";  /* tem que instalar as extensões no Cyrus */
226                        $script_header = substr($script_header,0,-2);
227                        $script_header .= "];\r\n";
228                }
229
230                if( $vacation_action )
231                {
232                  $script_rules .= "vacation" . $vacation_action . "\r\n";
233                }
234
235                $json_data = json_encode($rules);
236               
237                $script_begin = "#Filtro gerado por Expresso Livre versão 2.4\r\n\r\n";
238
239                $content = $script_begin . $script_header . $script_rules . "\r\n\r\n#PseudoScript#" . "\r\n#" . $json_data;
240                //$content = "";
241                return( $content );
242        }
243       
244
245        /**
246        * Método que faz o parsing do Script Sieve, transformando em Array.
247        *
248        * @license    http://www.gnu.org/copyleft/gpl.html GPL
249        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
250        * @sponsor    Caixa EconÃŽmica Federal
251        * @author     Airton Bordin Junior
252        * @author         Gustavo Pereira dos Santos   
253        * @param      <String> <$script> <Script Sieve com as regras do usuário>
254        * @return     <Regras do usuário em Array>
255        * @access     <public>
256        */
257        public function parseSieveScript( $script )
258        {
259                $pos = strripos($script, "#PseudoScript#");
260                $pseudo_script = substr( $script, $pos+17 );
261
262                $return = json_decode( $pseudo_script, true );
263
264                return $return;
265        }
266
267        var $rules = false;
268
269        /**
270        * Construtor da classe.
271        *
272        * @license    http://www.gnu.org/copyleft/gpl.html GPL
273        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
274        * @sponsor    Caixa EconÃŽmica Federal
275        * @author     Airton Bordin Junior
276        * @author         Gustavo Pereira dos Santos   
277        * @access     <public>
278        */
279        public function __construct()
280        {
281                $this->service = Controller::service("Sieve");
282        }
283
284       
285        /**
286        * Método que recupera as regras do usuário.
287        *
288        * @license    http://www.gnu.org/copyleft/gpl.html GPL
289        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
290        * @sponsor    Caixa EconÃŽmica Federal
291        * @author     Airton Bordin Junior
292        * @author         Gustavo Pereira dos Santos   
293        * @return     <Regras do usuário>
294        * @access     <public>
295        */
296        public function getRules()
297        {
298                $this->rules = Controller::find( array( 'concept' => 'filter' ) );
299
300                if( !$this->rules ) {
301                        $this->rules = array();
302                }
303                return( $this->rules );
304        }
305
306       
307        /**
308        * Método que aplica o filtro para as mensagens do usuário.
309        *
310        * @license    http://www.gnu.org/copyleft/gpl.html GPL
311        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
312        * @sponsor    Caixa EconÃŽmica Federal
313        * @author     Airton Bordin Junior
314        * @author         Gustavo Pereira dos Santos   
315        * @param      <$uri>
316        * @param      <$result>
317        * @param      <$criteria>
318        * @param      <$original>
319        * @access     <public>
320        */
321        public function applySieveFilter( &$uri , &$result , &$criteria , $original  )
322        {
323                 $result['id'] = $uri['id'];
324
325                 if( $original['properties']['applyMessages'] )
326                 {
327                      $filter = Controller::read($uri);
328
329                      $proc = array();
330                      $proc['keep'] = false;
331                     
332                      foreach ($filter['actions'] as $v){
333                              if($v['type'] == 'keep')
334                                      $proc['keep'] = true;
335                              else{
336                                      $proc['type'] = $v['type'];
337                                      $proc['parameter'] = $v['parameter'];
338                              }
339                      }
340
341                      $imap = Controller::service( 'Imap' );
342                      $imap->apliSieveFilter($original['properties']['applyMessages'] , $proc );
343                      return $result;
344                  }
345        }
346
347       
348        /**
349        * Método que lê o script do usuário.
350        *
351        * @license    http://www.gnu.org/copyleft/gpl.html GPL
352        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
353        * @sponsor    Caixa EconÃŽmica Federal
354        * @author     Airton Bordin Junior
355        * @author         Gustavo Pereira dos Santos   
356        * @param      <$uri>
357        * @param      <$result>
358        * @param      <$criteria>
359        * @param      <$original>
360        * @return     <Script do usuário>
361        * @access     <public>
362        */
363        public function readUserScript( &$uri , &$params , &$criteria , $original )
364        { 
365                $uri['id'] = $this->service->config['user'];
366        }
367 
368 
369        /**
370        * Método que seta o script do usuário.
371        *
372        * @license    http://www.gnu.org/copyleft/gpl.html GPL
373        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
374        * @sponsor    Caixa EconÃŽmica Federal
375        * @author     Airton Bordin Junior
376        * @author         Gustavo Pereira dos Santos   
377        * @param      <$uri>
378        * @param      <$result>
379        * @param      <$criteria>
380        * @param      <$original>
381        * @return     <Script do usuário>
382        * @access     <public>
383        */
384        public function setRule( &$uri , &$params , &$criteria , $original  )
385        {
386            if( !$this->rules )
387                $this->rules = $this->getRules();
388
389            $uri['id'] = $params['id'] = isset($params['id']) ? $params['id'] : urlencode($params['name']);
390
391            $i = 0;
392
393            for( ; isset($this->rules[$i]) && $this->rules[$i]['id'] !== $params['id']; $i++ );
394
395            $this->rules[$i] = array_merge( ( isset($this->rules[$i]) ? $this->rules[$i] : array() ), $params );
396
397            $params = array( 'name' => $this->service->config['user'],
398                             'content' => $this->formatSieveScript( $this->rules ),
399                             'active' => true );
400        }
401
402       
403        /**
404        * Método que deleta o script do usuário.
405        *
406        * @license    http://www.gnu.org/copyleft/gpl.html GPL
407        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
408        * @sponsor    Caixa EconÃŽmica Federal
409        * @author     Airton Bordin Junior
410        * @author         Gustavo Pereira dos Santos   
411        * @param      <$uri>
412        * @param      <$result>
413        * @param      <$criteria>
414        * @param      <$original>
415        * @access     <public>
416        */
417        public function deleteRule( &$uri, &$params, &$criteria, $original )
418        {
419                if( !$this->rules ) {   
420                        $this->rules = $this->getRules();
421                }         
422                $params['id'] = $uri['id'];
423
424                $update = false;
425               
426                $rules = array();
427
428                foreach( $this->rules as $i => $rule )
429                        if( $rule['id'] !== $uri['id'] )
430                                $rules[] = $this->rules[$i];
431
432                $this->rules = $rules;
433               
434                $uri['id'] = '';
435
436                $params = array( 'name' => $this->service->config['user'],
437                           'content' => $this->formatSieveScript( $this->rules ),
438                           'active' => true );
439
440                $URI = Controller::URI( $uri['concept'], $this->service->config['user'] );
441                $this->service->update( $URI, $params );
442       
443                return( false );
444        }
445
446       
447        /**
448        * Método que pega o script do usuário.
449        *
450        * @license    http://www.gnu.org/copyleft/gpl.html GPL
451        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
452        * @sponsor    Caixa EconÃŽmica Federal
453        * @author     Airton Bordin Junior
454        * @author         Gustavo Pereira dos Santos   
455        * @param      <$uri>
456        * @param      <$result>
457        * @param      <$criteria>
458        * @param      <$original>
459        * @return     <Script do usuário>
460        * @access     <public>
461        */
462        public function getSieveRule( &$uri , &$params , &$criteria , $original )
463        {         
464                $script = $this->parseSieveScript( $params['content'] );
465
466                foreach( $script as $i => $rule )
467                        if( $rule['name'] === $original['id'] )
468                                return( $params = $rule );
469        }
470
471       
472        /**
473        * Método que lista as regras do usuário.
474        *
475        * @license    http://www.gnu.org/copyleft/gpl.html GPL
476        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
477        * @sponsor    Caixa EconÃŽmica Federal
478        * @author     Airton Bordin Junior
479        * @author         Gustavo Pereira dos Santos   
480        * @param      <$uri>
481        * @param      <$result>
482        * @param      <$criteria>
483        * @param      <$original>
484        * @return     <Regras do usuário>
485        * @access     <public>
486        */
487        public function listSieveRules( &$uri , &$params , &$criteria , $original  )
488        {
489                $return = $params = $this->parseSieveScript( $params[0]['content'] );
490                return( $return );
491        }
492}
Note: See TracBrowser for help on using the repository browser.