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

Revision 5630, 15.5 KB checked in by airton, 12 years ago (diff)

Ticket #2088 - Melhorias no filtro de mensagens do Expresso - Pequena adequacao para bloqueio de usuario

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       
78                $require_fileinto = $require_flag = $require_reject = $require_vacation = $require_body = $require_imapflag = $vacation = $startswith = $endswith = false;
79
80                $script_rules = $script_header = $script_criteria = $vacation_action = "";
81
82                $i = 0;
83
84                foreach( $rules as $name => $data )
85                {
86                        /* Usado na opção Bloquear usuário do ExpressoMail */
87                        if($data['block']) {
88                                ($i >0) ? $script_match = 'elsif anyof' : $script_match = 'if anyof';
89                                $script_match = $script_match . "(address :is \"from\" [\"" .$data['name'] . "\"]) {\r\n"; 
90                                $script_match .= "fileinto \"INBOX/Spam\"; \r\n}\r\n";
91                                $script_rules .= $script_match;
92                                $script_match = "";
93                                $script_criteria = "";
94                                $require_fileinto = true;
95                                $i++;
96                                continue;
97                        }
98                       
99                        if( $data['enabled'] == 'false' )
100                                continue;
101
102                        $vacation = false;
103                        $criteria = $data['criteria'];
104                        $action   = $data['actions'];
105                       
106                        ($i >0) ? $script_match = 'els' : $script_match = '';
107                        $data['isExact'] == 'false' ?  $script_match .= 'if anyof (' : $script_match .= 'if allof (';
108
109                        for ($j=0; $j<count($criteria); $j++)
110                        {                                       
111                                switch($criteria[$j]['field']) {
112                                        case 'To':   
113                                        case 'to':   
114                                        case 'CC':
115                                        case 'Cc':
116                                                $criteria[$j]['field'] = "[\"To\", \"TO\", \"Cc\", \"CC\"]";
117                                                $script_criteria .= "address :";
118                                                break;
119                                        case 'from':
120                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
121                                                $script_criteria .= "address :";
122                                                break;
123                                        case 'size':   
124                                                $criteria[$j]['field'] = '';
125                                                $script_criteria .= "size :";
126                                                break;
127                                        case 'subject':
128                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
129                                                $criteria[$j]['value'] = "" . imap_8bit($criteria[$j]['value']) . "\", \"" . base64_encode($criteria[$j]['value']) . "";
130                                                $script_criteria .= "header :";
131                                                break;
132                                        case 'body':
133                                                $criteria[$j]['field'] = '';
134                                                $script_criteria .= "body :";
135                                                $require_body = true;
136                                                break;
137                                        case 'vacation':
138                                                continue;
139                                        default:
140                                                $script_criteria .= "header :";
141                                                break;
142                                }
143                               
144                                switch ($criteria[$j]['operator']) {
145                                        case '>':
146                                                $criteria[$j]['operator'] = "over";
147                                                break;
148                                        case '<':
149                                                $criteria[$j]['operator'] = "under";
150                                                break;
151                                        case '=':
152                                                $criteria[$j]['operator'] = "is";
153                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
154                                                break;
155                                        case '*':
156                                                $criteria[$j]['operator'] = "contains";
157                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
158                                                break;                                         
159                                        case '^':
160                                                $criteria[$j]['operator'] = "matches";
161                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "*\"]";
162                                                $startswith = true;
163                                                break;
164                                        case '$':
165                                                $criteria[$j]['operator'] = "matches";
166                                                $criteria[$j]['value'] = "[\"*" . $criteria[$j]['value'] . "\"]";
167                                                $endswith = true;
168                                                break;
169                                        /*
170                                           TO-DO:
171                                           Arrrumar regra do "não contém".
172                                        */
173                                        case '!*':
174                                                $criteria[$j]['operator'] = "contains";
175                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
176                                                break;
177                                }
178                               
179                                if ($criteria[$j]['field'] == "" || $criteria[$j]['field'] == "\"subject\"" || $startswith || $endswith)
180                                {
181                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
182                                        $startswith = $endswith = false;
183                                }
184                                else
185                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
186                        }
187                        $script_criteria = substr($script_criteria,0,-2);
188                        /* if ($vacation == false) */
189                        $script_criteria .= ")";
190
191                        $script_action = " {\r\n ";
192                        for ($k=0; $k<count($action); $k++)
193                        {
194                                switch ($action[$k]['type']) {
195                                        case 'redirect':
196                                                break;
197                                        case 'reject':
198                                                $require_reject = true;
199                                                break;
200                                        case 'fileinto':
201                                                $require_fileinto = true;
202                                                break;
203                                        case 'vacation':
204                                                $require_vacation = true;
205                                                $action[$k]['parameter'] = "\"" . $action[$k]['parameter'] . "\"";
206                                                $vacation_action = " :subject \"Fora do Escritório\" " . $action[$k]['parameter'] . ";";
207                                                $vacation = true;
208                                                continue;
209                                        case 'setflag':
210                                                $require_flag = true;
211                                                $action[$k]['parameter'] = "\\\\" . $action[$k]['parameter'];
212                                                break;
213                                        case 'discard':
214                                                break;
215                                }
216                                if ($vacation == false) $script_action .= $action[$k]['type'] . " \"" . $action[$k]['parameter'] . "\";\r\n ";
217                        }
218
219                        $script_action .= "}";
220                       
221                        if($vacation != true)
222                                $script_rules .= $script_match . $script_criteria . $script_action . "\r\n";
223
224                        if($data['id'] != "vacation")
225                                $i++;
226                        $script_match = "";
227                        $script_criteria = "";
228                       
229                }
230
231                if($require_reject || $require_fileinto || $require_vacation || $require_body || $require_flag)
232                {
233                        $script_header .= "require [";
234                        $require_reject ? $script_header .= "\"reject\", " : "";
235                        $require_fileinto ? $script_header .= "\"fileinto\", " : "";
236                        $require_vacation? $script_header .= "\"vacation\", " : ""; 
237                        $require_flag ? $script_header .= "\"imapflags\", " : ""; 
238                        $require_body ? $script_header .= "\"body\", " : "";  /* tem que instalar as extensões no Cyrus */
239                        $script_header = substr($script_header,0,-2);
240                        $script_header .= "];\r\n";
241                }
242
243                if( $vacation_action )
244                {
245                  $script_rules .= "vacation" . $vacation_action . "\r\n";
246                }
247
248                $json_data = json_encode($rules);
249               
250                $script_begin = "#Filtro gerado por Expresso Livre versão 2.4\r\n\r\n";
251
252                $content = $script_begin . $script_header . $script_rules . "\r\n\r\n#PseudoScript#" . "\r\n#" . $json_data;
253                //$content = "";
254                return( $content );
255        }
256       
257
258        /**
259        * Método que faz o parsing do Script Sieve, transformando em Array.
260        *
261        * @license    http://www.gnu.org/copyleft/gpl.html GPL
262        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
263        * @sponsor    Caixa EconÃŽmica Federal
264        * @author     Airton Bordin Junior
265        * @author         Gustavo Pereira dos Santos   
266        * @param      <String> <$script> <Script Sieve com as regras do usuário>
267        * @return     <Regras do usuário em Array>
268        * @access     <public>
269        */
270        public function parseSieveScript( $script )
271        {
272                $pos = strripos($script, "#PseudoScript#");
273                $pseudo_script = substr( $script, $pos+17 );
274
275                $return = json_decode( $pseudo_script, true );
276
277                return $return;
278        }
279
280        var $rules = false;
281
282        /**
283        * Construtor da classe.
284        *
285        * @license    http://www.gnu.org/copyleft/gpl.html GPL
286        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
287        * @sponsor    Caixa EconÃŽmica Federal
288        * @author     Airton Bordin Junior
289        * @author         Gustavo Pereira dos Santos   
290        * @access     <public>
291        */
292        public function __construct()
293        {
294                $this->service = Controller::service("Sieve");
295        }
296
297       
298        /**
299        * Método que recupera as regras do usuário.
300        *
301        * @license    http://www.gnu.org/copyleft/gpl.html GPL
302        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
303        * @sponsor    Caixa EconÃŽmica Federal
304        * @author     Airton Bordin Junior
305        * @author         Gustavo Pereira dos Santos   
306        * @return     <Regras do usuário>
307        * @access     <public>
308        */
309        public function getRules()
310        {
311                $this->rules = Controller::find( array( 'concept' => 'filter' ) );
312
313                if( !$this->rules ) {
314                        $this->rules = array();
315                }
316                return( $this->rules );
317        }
318
319       
320        /**
321        * Método que aplica o filtro para as mensagens do usuário.
322        *
323        * @license    http://www.gnu.org/copyleft/gpl.html GPL
324        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
325        * @sponsor    Caixa EconÃŽmica Federal
326        * @author     Airton Bordin Junior
327        * @author         Gustavo Pereira dos Santos   
328        * @param      <$uri>
329        * @param      <$result>
330        * @param      <$criteria>
331        * @param      <$original>
332        * @access     <public>
333        */
334        public function applySieveFilter( &$uri , &$result , &$criteria , $original  )
335        {
336                 $result['id'] = $uri['id'];
337
338                 if( $original['properties']['applyMessages'] )
339                 {
340                      $filter = Controller::read($uri);
341
342                      $proc = array();
343                      $proc['keep'] = false;
344                     
345                      foreach ($filter['actions'] as $v){
346                              if($v['type'] == 'keep')
347                                      $proc['keep'] = true;
348                              else{
349                                      $proc['type'] = $v['type'];
350                                      $proc['parameter'] = $v['parameter'];
351                              }
352                      }
353
354                      $imap = Controller::service( 'Imap' );
355                      $imap->apliSieveFilter($original['properties']['applyMessages'] , $proc );
356                      return $result;
357                  }
358        }
359
360       
361        /**
362        * Método que lê o script do usuário.
363        *
364        * @license    http://www.gnu.org/copyleft/gpl.html GPL
365        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
366        * @sponsor    Caixa EconÃŽmica Federal
367        * @author     Airton Bordin Junior
368        * @author         Gustavo Pereira dos Santos   
369        * @param      <$uri>
370        * @param      <$result>
371        * @param      <$criteria>
372        * @param      <$original>
373        * @return     <Script do usuário>
374        * @access     <public>
375        */
376        public function readUserScript( &$uri , &$params , &$criteria , $original )
377        { 
378                $uri['id'] = $this->service->config['user'];
379        }
380 
381 
382        /**
383        * Método que seta o script do usuário.
384        *
385        * @license    http://www.gnu.org/copyleft/gpl.html GPL
386        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
387        * @sponsor    Caixa EconÃŽmica Federal
388        * @author     Airton Bordin Junior
389        * @author         Gustavo Pereira dos Santos   
390        * @param      <$uri>
391        * @param      <$result>
392        * @param      <$criteria>
393        * @param      <$original>
394        * @return     <Script do usuário>
395        * @access     <public>
396        */
397        public function setRule( &$uri , &$params , &$criteria , $original  )
398        {
399                if( !$this->rules )
400                $this->rules = $this->getRules();
401
402            $uri['id'] = $params['id'] = isset($params['id']) ? $params['id'] : urlencode($params['name']);
403
404            $i = 0;
405
406            for( ; isset($this->rules[$i]) && $this->rules[$i]['id'] !== $params['id']; $i++ );
407
408            $this->rules[$i] = array_merge( ( isset($this->rules[$i]) ? $this->rules[$i] : array() ), $params );
409
410            $params = array( 'name' => $this->service->config['user'],
411                             'content' => $this->formatSieveScript( $this->rules ),
412                             'active' => true );
413        }
414
415       
416        /**
417        * Método que deleta o script do usuário.
418        *
419        * @license    http://www.gnu.org/copyleft/gpl.html GPL
420        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
421        * @sponsor    Caixa EconÃŽmica Federal
422        * @author     Airton Bordin Junior
423        * @author         Gustavo Pereira dos Santos   
424        * @param      <$uri>
425        * @param      <$result>
426        * @param      <$criteria>
427        * @param      <$original>
428        * @access     <public>
429        */
430        public function deleteRule( &$uri, &$params, &$criteria, $original )
431        {
432                if( !$this->rules ) {   
433                        $this->rules = $this->getRules();
434                }         
435                $params['id'] = $uri['id'];
436
437                $update = false;
438               
439                $rules = array();
440
441                foreach( $this->rules as $i => $rule )
442                        if( $rule['id'] !== $uri['id'] )
443                                $rules[] = $this->rules[$i];
444
445                $this->rules = $rules;
446               
447                $uri['id'] = '';
448
449                $params = array( 'name' => $this->service->config['user'],
450                           'content' => $this->formatSieveScript( $this->rules ),
451                           'active' => true );
452
453                $URI = Controller::URI( $uri['concept'], $this->service->config['user'] );
454                $this->service->update( $URI, $params );
455       
456                return( false );
457        }
458
459       
460        /**
461        * Método que pega o script do usuário.
462        *
463        * @license    http://www.gnu.org/copyleft/gpl.html GPL
464        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
465        * @sponsor    Caixa EconÃŽmica Federal
466        * @author     Airton Bordin Junior
467        * @author         Gustavo Pereira dos Santos   
468        * @param      <$uri>
469        * @param      <$result>
470        * @param      <$criteria>
471        * @param      <$original>
472        * @return     <Script do usuário>
473        * @access     <public>
474        */
475        public function getSieveRule( &$uri , &$params , &$criteria , $original )
476        {         
477                $script = $this->parseSieveScript( $params['content'] );
478
479                foreach( $script as $i => $rule )
480                        if( $rule['name'] === $original['id'] )
481                                return( $params = $rule );
482        }
483
484       
485        /**
486        * Método que lista as regras do usuário.
487        *
488        * @license    http://www.gnu.org/copyleft/gpl.html GPL
489        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
490        * @sponsor    Caixa EconÃŽmica Federal
491        * @author     Airton Bordin Junior
492        * @author         Gustavo Pereira dos Santos   
493        * @param      <$uri>
494        * @param      <$result>
495        * @param      <$criteria>
496        * @param      <$original>
497        * @return     <Regras do usuário>
498        * @access     <public>
499        */
500        public function listSieveRules( &$uri , &$params , &$criteria , $original  )
501        {
502                $return = $params = $this->parseSieveScript( $params[0]['content'] );
503                return( $return );
504        }
505}
Note: See TracBrowser for help on using the repository browser.