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

Revision 6756, 26.5 KB checked in by airton, 12 years ago (diff)

Ticket #2956 - Inconsistencia em filtros com criterio por assunto/contem frase

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
43use prototype\api\Config as Config;
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 <airton@prognus.com.br>
53* @author     Gustavo Pereira dos Santos <gustavo@prognus.com.br>
54* @version    1.0
55* @since      Classe disponibilizada na versão 2.4
56*/
57class FilterMapping
58{
59        var $service;
60        var $msgs_apply = array();
61        /**
62        * Método que cria o ID da regra que está sendo criada.
63        *
64        * @license    http://www.gnu.org/copyleft/gpl.html GPL
65        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
66        * @sponsor    Caixa Econômica Federal
67        * @author     Airton Bordin Junior <airton@prognus.com.br>
68        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
69        * @author         Natan Fonseca <natan@prognus.com.br> 
70        * @param      <$uri>
71        * @param      <$result>
72        * @param      <$criteria>
73        * @param      <$original>
74        * @access     <public>
75        */
76        public function makeId(&$uri , &$result , &$criteria , $original) {
77                $result['id'] = $uri['id'];
78        }
79       
80       
81        /**
82        * Método que formata o Script de acordo com a sintaxe do Sieve.
83        *
84        * @license    http://www.gnu.org/copyleft/gpl.html GPL
85        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
86        * @sponsor    Caixa Econômica Federal
87        * @author     Airton Bordin Junior <airton@prognus.com.br>
88        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
89        * @param      <Array> <$rules> <Array com as regras do usuário>
90        * @return     <Regra de acordo com a sintaxe do Sieve>
91        * @access     <public>
92        */
93        public function formatSieveScript( $rules )
94    {
95                $require_fileinto = $require_flag = $require_reject = $require_vacation = $require_body = $require_imapflag = $vacation = $startswith = $endswith = false;
96                $script_rules = $script_header = $script_criteria = $vacation_action = "";
97                $i = 0;
98               
99                foreach( $rules as $name => $data )
100                {       
101                        if( $data['enabled'] == 'false' )
102                                continue;
103                               
104                        if(array_key_exists("block", $data))
105                        {
106                                /* Usado na opção Bloquear usuário do ExpressoMail */
107                                if($data['block']) {
108                                        ($i >0) ? $script_match = 'elsif anyof' : $script_match = 'if anyof';
109                                        $script_match = $script_match . "(address :is \"from\" [\"" .$data['name'] . "\"]) {\r\n"; 
110                                        $script_match .= "fileinto \"INBOX/Spam\"; \r\n}\r\n";
111                                        $script_rules .= $script_match;
112                                        $script_match = "";
113                                        $script_criteria = "";
114                                        $require_fileinto = true;
115                                        $i++;
116                                        continue;
117                                }
118                        }
119                               
120                        $vacation = false;
121                        $criteria = $data['criteria'];
122                        $action   = $data['actions'];
123                       
124                        ($i >0) ? $script_match = 'els' : $script_match = '';
125                        $data['isExact'] == 'false' ?  $script_match .= 'if anyof (' : $script_match .= 'if allof (';
126
127                        if( is_array($criteria) )
128                        foreach ($criteria as $j => $value)
129                        {                                       
130                               
131                                switch(strtoupper($criteria[$j]['field'])) {
132                                        case 'TO':   
133                                        case 'CC':
134                                                $criteria[$j]['field'] = "[\"To\", \"TO\", \"Cc\", \"CC\"]";
135                                                $script_criteria .= "address :";
136                                                break;
137                                        case 'FROM':
138                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
139                                                $script_criteria .= "address :";
140                                                break;
141                                        case 'SIZE':   
142                                                $criteria[$j]['field'] = '';
143                                                $script_criteria .= "size :";
144                                                break;
145                                        case 'SUBJECT':
146                                                $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
147                                                $script_criteria .= "header :";
148                                                if($criteria[$j]['operator'] == "$") {
149                                                        $criteria[$j]['value'] = "" . imap_8bit($criteria[$j]['value']) . "\", \"*" . base64_encode($criteria[$j]['value']) . "";
150                                                        break;
151                                                }
152                                                if($criteria[$j]['operator'] == "^") {
153                                                        $criteria[$j]['value'] = "" . imap_8bit($criteria[$j]['value']) . "*\", \"" . base64_encode($criteria[$j]['value']) . "";
154                                                        break;
155                                                }
156                                                $criteria[$j]['value'] = "" . imap_8bit($criteria[$j]['value']) . "\", \"" . base64_encode($criteria[$j]['value']) . "";
157                                                break;
158                                        case 'BODY':
159                                                $criteria[$j]['field'] = '';
160                                                $script_criteria .= "body :";
161                                                $require_body = true;
162                                                break;
163                                        case 'VACATION':
164                                                continue;
165                                        case 'HASATTACHMENT':
166                                                $criteria[$j]['field'] = '';
167                                                $script_criteria .= "body :";
168                                                $criteria[$j]['operator'] = "^^";
169                                                $require_body = true;
170                                                break;
171                                        default:
172                                                $script_criteria .= "header :";
173                                                break;
174                                }
175                               
176                                switch ($criteria[$j]['operator']) {
177                                        case '>':
178                                                $criteria[$j]['operator'] = "over";
179                                                $criteria[$j]['value'] = $criteria[$j]['value'] . "K";
180                                                break;
181                                        case '<':
182                                                $criteria[$j]['operator'] = "under";
183                                                $criteria[$j]['value'] = $criteria[$j]['value'] . "K";
184                                                break;
185                                        case '=':
186                                                $criteria[$j]['operator'] = "is";
187                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
188                                                break;
189                                        case '*':
190                                                $criteria[$j]['operator'] = "contains";
191                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
192                                                break;                                         
193                                        case '^':
194                                                $criteria[$j]['operator'] = "matches";
195                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "*\"]";
196                                                $startswith = true;
197                                                break;
198                                        case '^^':
199                                                $criteria[$j]['operator'] = "raw :matches";
200                                                $criteria[$j]['value'] = "[\"*filename=*\"]";
201                                                $startswith = true;
202                                                break;
203                                        case '$':
204                                                $criteria[$j]['operator'] = "matches";
205                                                $criteria[$j]['value'] = "[\"*" . $criteria[$j]['value'] . "\"]";
206                                                $endswith = true;
207                                                break;
208                                        /*
209                                           TO-DO:
210                                           Inconsistência na regra do "não contém".
211                                        */
212                                        case '!*':
213                                                $criteria[$j]['operator'] = "contains";
214                                                $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "\"]";
215                                                break;
216                                }
217                               
218                                if ($criteria[$j]['field'] == "" || $criteria[$j]['field'] == "\"subject\"" || $startswith || $endswith)
219                                {
220                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
221                                        $startswith = $endswith = false;
222                                }
223                                else
224                                        $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
225                        }
226                        $script_criteria = substr($script_criteria,0,-2);
227                        $script_criteria .= ")";
228
229                        $action_addFlag = '';
230                       
231                        if( is_array($action) )
232                        foreach ($action as $k => $value)
233                        {
234                                switch ($action[$k]['type']) {
235                                        case 'setflag':
236                                                $require_flag = true;
237                                                $action[$k]['parameter'] = "\\\\" . $action[$k]['parameter'];
238                                                break;
239                                        case 'addflag':
240                                                $require_flag = true;
241                                                $action_addFlag = "addflag \"" . $action[$k]['parameter'] . "\";\r\n ";
242                                                break;
243                                        case 'redirect':
244                                                break;
245                                        case 'reject':
246                                                $require_reject = true;
247                                                break;
248                                        case 'fileinto':
249                                                $require_fileinto = true;
250                                                $action[$k]['parameter'] = mb_convert_encoding($action[$k]['parameter'], "UTF7-IMAP","UTF-8, ISO-8859-1, UTF7-IMAP");
251                                                break;
252                                        case 'vacation':
253                                                $require_vacation = true;
254                                                $action[$k]['parameter'] = "\"" . $action[$k]['parameter'] . "\"";
255                                                $vacation_action = ' :subject "Fora do Escrit&oacuterio" ' . $action[$k]['parameter'] . ";";
256                                                $vacation = true;
257                                                continue;
258                                        case 'discard':
259                                                break;
260                                }
261                                if ($vacation == false && $action[$k]['type'] != 'addflag') $script_action .= $action[$k]['type'] . " \"" . $action[$k]['parameter'] . "\";\r\n ";
262                        }
263                       
264                        /* ATENÇÃO: Colocar sempre o comando addflag antes de qualquer outro no caso de ações compostas no Sieve */
265                        if ($action_addFlag != '') $script_action = $action_addFlag . $script_action;
266                       
267                        $script_action = "{\r\n " . $script_action . "}";
268                        $action_addFlag = '';
269                        if($vacation == false)
270                                $script_rules .= $script_match . $script_criteria . $script_action . "\r\n";
271
272                        if($data['id'] != "vacation")
273                                $i++;
274                        $script_match = "";
275                        $script_criteria = ""; 
276                        $script_action = "";
277                        $data['applyMessages'] = "";                                                   
278                }
279
280                if($require_reject || $require_fileinto || $require_vacation || $require_body || $require_flag)
281                {
282                        /* Para habilitar as funções desejadas, edite a diretiva sieve_extensions no arquivo de configuração "/etc/imapd.conf" */
283                        $script_header .= "require [";
284                        $require_reject ? $script_header .= "\"reject\", " : "";
285                        $require_fileinto ? $script_header .= "\"fileinto\", " : "";
286                        $require_vacation? $script_header .= "\"vacation\", " : ""; 
287                        $require_flag ? $script_header .= "\"imapflags\", " : ""; 
288                        $require_body ? $script_header .= "\"body\", " : ""; 
289                        $script_header = substr($script_header,0,-2);
290                        $script_header .= "];\r\n";
291                }
292
293                if( $vacation_action )
294                  $script_rules .= "vacation" . $vacation_action . "\r\n";
295
296                foreach ($rules as &$values) {                                         
297                        if($values['applyMessages'])
298                                $this->msgs_apply[] = $values['applyMessages'];
299                        $values['applyMessages'] = array();
300                }
301               
302                $json_data = json_encode($rules);
303                $script_begin = "#Filtro gerado por Expresso Livre\r\n\r\n";
304                $content = $script_begin . $script_header . $script_rules . "\r\n\r\n#PseudoScript#" . "\r\n#" . $json_data;
305
306                return( $content );
307        }
308       
309        /**
310        * Método que lê e faz o parser dos filtros antigos
311        *
312        * @license    http://www.gnu.org/copyleft/gpl.html GPL
313        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
314        * @sponsor    Caixa Econômica Federal
315        * @author     Airton Bordin Junior <airton@prognus.com.br>
316        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
317        * @param      <$scriptName> <Regras do usuário>
318        * @return     <Regra do usuário parseada>
319        * @access     <public>
320        */
321        public function readOldScript($scriptName)
322        {
323        // Recebe o conteúdo do array;
324        $lines = array();
325        $lines = preg_split("/\n/", $scriptName);
326
327        // Pega o tamanho da regra na primeira do script;
328        $size_rule = array_shift($lines);
329
330        // Recebe o tamanho do script, pela primeira linha;
331        //$this->size = trim($size_rule);
332
333        // Verifica a composição do script; */
334        $line = array_shift($lines);
335
336        // Variaveis para a regra e o campo ferias;
337        $regexps = array('##PSEUDO', '#rule', '#vacation', '#mode');
338        $retorno['rule'] = array();
339
340        $line = array_shift($lines);
341        while (isset($line)) {
342            foreach ($regexps as $regp) {
343                if (preg_match("/$regp/i", $line)) {
344                    // Recebe todas as regras criadas no servidor;
345                    if (preg_match("/#rule&&/i", $line)) {
346                        $retorno['rule'][] = ltrim($line) . "\n";                         
347                    }
348                }
349            }
350            // Pega a proxima linha do sript;
351            $line = array_shift($lines);
352        }
353        return $retorno;
354    }
355       
356       
357       
358       
359        /**
360        * Método que faz o parsing do Script Sieve, transformando em Array.
361        *
362        * @license    http://www.gnu.org/copyleft/gpl.html GPL
363        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
364        * @sponsor    Caixa Econômica Federal
365        * @author     Airton Bordin Junior <airton@prognus.com.br>
366        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
367        * @param      <String> <$script> <Script Sieve com as regras do usuário>
368        * @return     <Regras do usuário em Array>
369        * @access     <public>
370        */
371        public function parseSieveScript( $script )
372        {
373                $old_rule = strripos($script, "##PSEUDO script start");
374                /* Tem regra antiga */
375                if($old_rule) {
376                        $parsed_rule = $this->readOldScript($script);
377                        $old_rules = array();
378                        $i_return = 0;
379                        foreach ($parsed_rule['rule'] as $i => $value) {
380                                $array_rule = explode("&&", $parsed_rule['rule'][$i]);
381                               
382                                $action_type = array();
383                                $action_parameter = array();
384                                $criteria_value = array();
385                                $criteria_operator = array();
386                                $criteria_field = array();
387                                       
388                                $i_criteria = 0;
389                                $i_action = 0;
390
391                                /* TO-DO: Ver as actions possíveis além de reject e fileinto */
392                                switch($array_rule[6]) {
393                                        case 'reject':
394                                                $action_type[$i_action] = 'reject';
395                                                $action_parameter[$i_action] = $array_rule[7];
396                                                $i_action++;
397                                                break;
398                                        case 'folder':
399                                                $action_type[$i_action] = 'fileinto';
400                                                $action_parameter[$i_action] = $array_rule[7];
401                                                $i_action++;
402                                                break;
403                                        case 'flagged':
404                                                $action_type[$i_action] = 'setflag';
405                                                $action_parameter[$i_action] = 'flagged';
406                                                $i_action++;
407                                                break;
408                                        case 'address':
409                                                $action_type[$i_action] = 'redirect';
410                                                $action_parameter[$i_action] = $array_rule[7];
411                                                $i_action++;
412                                                break;
413                                        /* Somente para tratar casos em que a ação não é suportada */
414                                        default:       
415                                                $action_type[$i_action] = 'setflag';
416                                                $action_parameter[$i_action] = 'flagged';
417                                                $i_action++;
418                                                break;
419                                        // Recuperar o cyrus_delimiter para forçar um fileinto para INBOX/trash
420                                        //case 'discard':
421                                                //$action_type[$i_action] = 'fileinto';
422                                                //$action_parameter[$i_action] =;
423                                                //$i_action++;
424                                                //break;
425                                }
426                                if($array_rule[3] != "") {
427                                        $criteria_value[$i_criteria] = $array_rule[3];
428                                        $criteria_operator[$i_criteria] = '=';
429                                        $criteria_field[$i_criteria] = 'from';
430                                        $i_criteria++;
431                                }
432                                if($array_rule[4] != "") {
433                                        $criteria_value[$i_criteria] = $array_rule[4];
434                                        $criteria_operator[$i_criteria] = '=';
435                                        $criteria_field[$i_criteria] = 'to';
436                                        $i_criteria++;
437                                }
438                                if($array_rule[5] != "") {
439                                        $criteria_value[$i_criteria] = $array_rule[5];
440                                        $criteria_operator[$i_criteria] = '=';
441                                        $criteria_field[$i_criteria] = 'subject';
442                                        $i_criteria++;
443                                }
444                                $old_retorno = array();
445                                $old_retorno['isExact']  = true;
446                                $old_retorno['name'] = 'regra_migrada_' . $array_rule[1];
447                               
448                                $old_retorno['criteria'] = array();                             
449                                foreach($criteria_value as $j => $value) {
450                                        $old_retorno['criteria'][$j] = array();
451                                        $old_retorno['criteria'][$j]['value'] = $criteria_value[$j];
452                                        $old_retorno['criteria'][$j]['operator'] = $criteria_operator[$j];
453                                        $old_retorno['criteria'][$j]['field'] = $criteria_field[$j];
454                                }
455                               
456                                $old_retorno['actions'] = array();                             
457                                foreach($action_parameter as $j => $value) {
458                                        $old_retorno['actions'][$j] = array();
459                                        $old_retorno['actions'][$j]['parameter'] = $action_parameter[$j];
460                                        $old_retorno['actions'][$j]['type'] = $action_type[$j];
461                                }
462                               
463                                $old_retorno['enabled'] = ($array_rule[2] == 'ENABLED') ? 'true' : 'false';
464                                $old_retorno['id'] = 'Regra_migrada_' . $i_return;
465                                $old_retorno['applyMessages']  = '';
466
467                                $old_rules[$i_return] = $old_retorno;
468                                $i_return++;
469                        }                       
470                        return $old_rules;
471                }
472                /* Não tem regra antiga */
473                $pos = strripos($script, "#PseudoScript#");
474                $pseudo_script = substr( $script, $pos+17 );
475
476                $return = json_decode( $pseudo_script, true );
477       
478                return $return;
479        }
480
481        var $rules = false;
482
483        /**
484        * Construtor da classe.
485        *
486        * @license    http://www.gnu.org/copyleft/gpl.html GPL
487        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
488        * @sponsor    Caixa Econômica Federal
489        * @author     Airton Bordin Junior <airton@prognus.com.br>
490        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
491        * @access     <public>
492        */
493        public function __construct()
494        {
495                $this->service = Controller::service("Sieve");
496        }
497
498       
499        /**
500        * Método que recupera as regras do usuário.
501        *
502        * @license    http://www.gnu.org/copyleft/gpl.html GPL
503        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
504        * @sponsor    Caixa Econômica Federal
505        * @author     Airton Bordin Junior <airton@prognus.com.br>
506        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
507        * @return     <Regras do usuário>
508        * @access     <public>
509        */
510        public function getRules()
511        {
512                $this->rules = Controller::find( array( 'concept' => 'filter' ) );
513
514                if( !$this->rules ) {
515                        $this->rules = array();
516                }
517                return( $this->rules );
518        }
519
520       
521        /**
522        * Método que aplica o filtro para as mensagens do usuário.
523        *
524        * @license    http://www.gnu.org/copyleft/gpl.html GPL
525        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
526        * @sponsor    Caixa Econômica Federal
527        * @author     Airton Bordin Junior <airton@prognus.com.br>
528        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
529        * @param      <$uri>
530        * @param      <$result>
531        * @param      <$criteria>
532        * @param      <$original>
533        * @access     <public>
534        */
535        public function applySieveFilter( &$uri , &$result , &$criteria , $original  )
536        {
537                $rule_apply = array();
538                       
539                $filter = Controller::read($uri);
540                $filter_ = $this->parseSieveScript($filter['content']);
541               
542                foreach ($filter_ as $f_) {
543                        if($f_['id'] == $uri['id']) {
544                                $rule_apply     = $f_;
545                        }
546                }
547                               
548                $actions = array();
549                $actions['type'] = $rule_apply['actions'][0]['type'];
550                $actions['parameter'] = $rule_apply['actions'][0]['parameter'];
551                /* Hardcoded */
552                $actions['keep'] = false;
553
554                //$messages = $rule_apply['applyMessages'];
555                $messages = $this->msgs_apply[0];
556                $this->msgs_apply = array();
557                       
558                $imap = Controller::service( 'Imap' );
559                $imap->apliSieveFilter($messages, $actions);
560                return $result;
561        }
562
563       
564        /**
565        * Método que lê o script do usuário.
566        *
567        * @license    http://www.gnu.org/copyleft/gpl.html GPL
568        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
569        * @sponsor    Caixa Econômica Federal
570        * @author     Airton Bordin Junior <airton@prognus.com.br>
571        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
572        * @param      <$uri>
573        * @param      <$result>
574        * @param      <$criteria>
575        * @param      <$original>
576        * @return     <Script do usuário>
577        * @access     <public>
578        */
579        public function readUserScript( &$uri , &$params , &$criteria , $original )
580        { 
581                $uri['id'] = $this->service->config['user'];
582        }
583 
584 
585        /**
586        * Método que seta o script do usuário.
587        *
588        * @license    http://www.gnu.org/copyleft/gpl.html GPL
589        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
590        * @sponsor    Caixa Econômica Federal
591        * @author     Airton Bordin Junior <airton@prognus.com.br>
592        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
593        * @param      <$uri>
594        * @param      <$result>
595        * @param      <$criteria>
596        * @param      <$original>
597        * @return     <Script do usuário>
598        * @access     <public>
599        */
600        public function setRule( &$uri , &$params , &$criteria , $original  )
601        {
602                if( !$this->rules )
603                        $this->rules = $this->getRules();
604
605            $uri['id'] = $params['id'] = isset($params['id']) ? $params['id'] : urlencode($params['name']);
606
607            $i = 0;
608
609            for( ; isset($this->rules[$i]) && $this->rules[$i]['id'] !== $params['id']; $i++ );
610
611            $this->rules[$i] = array_merge( ( isset($this->rules[$i]) ? $this->rules[$i] : array() ), $params );
612
613            $params = array( 'name' => $this->service->config['user'],
614                             'content' => $this->formatSieveScript( $this->rules ),
615                             'active' => true );
616        }
617
618       
619        /**
620        * Método que deleta o script do usuário.
621        *
622        * @license    http://www.gnu.org/copyleft/gpl.html GPL
623        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
624        * @sponsor    Caixa Econômica Federal
625        * @author     Airton Bordin Junior <airton@prognus.com.br>
626        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
627        * @param      <$uri>
628        * @param      <$result>
629        * @param      <$criteria>
630        * @param      <$original>
631        * @access     <public>
632        */
633        public function deleteRule( &$uri, &$params, &$criteria, $original )
634        {
635                if( !$this->rules ) {   
636                        $this->rules = $this->getRules();
637                }         
638                $params['id'] = $uri['id'];
639
640                $rules = array();
641
642                foreach( $this->rules as $i => $rule )
643                        if( $rule['id'] !== $uri['id'] )
644                                $rules[] = $this->rules[$i];
645
646                $this->rules = $rules;
647               
648                $uri['id'] = '';
649
650                $params = array( 'name' => $this->service->config['user'],
651                           'content' => $this->formatSieveScript( $this->rules ),
652                           'active' => true );
653
654                $URI = Controller::URI( $uri['concept'], $this->service->config['user'] );
655                $this->service->update( $URI, $params );
656       
657                return( false );
658        }
659
660       
661        /**
662        * Método que pega o script do usuário.
663        *
664        * @license    http://www.gnu.org/copyleft/gpl.html GPL
665        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
666        * @sponsor    Caixa Econômica Federal
667        * @author     Airton Bordin Junior <airton@prognus.com.br>
668        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
669        * @param      <$uri>
670        * @param      <$result>
671        * @param      <$criteria>
672        * @param      <$original>
673        * @return     <Script do usuário>
674        * @access     <public>
675        */
676        public function getSieveRule( &$uri , &$params , &$criteria , $original )
677        {         
678                $script = $this->parseSieveScript( $params['content'] );
679
680                foreach( $script as $i => $rule )
681                        if(is_array ($rule['name']) && is_array($original['id']))
682                        if( $rule['name'] === $original['id'] )
683                                return( $params = $rule );
684        }
685
686       
687        /**
688        * Método que lista as regras do usuário.
689        *
690        * @license    http://www.gnu.org/copyleft/gpl.html GPL
691        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
692        * @sponsor    Caixa Econômica Federal
693        * @author     Airton Bordin Junior <airton@prognus.com.br>
694        * @author         Gustavo Pereira dos Santos <gustavo@prognus.com.br>   
695        * @param      <$uri>
696        * @param      <$result>
697        * @param      <$criteria>
698        * @param      <$original>
699        * @return     <Regras do usuário>
700        * @access     <public>
701        */
702        public function listSieveRules( &$uri , &$params , &$criteria , $original  )
703        {
704                $return = $params = $this->parseSieveScript( $params[0]['content'] );
705                return( $return );
706        }
707
708        /**
709         * Método que insere no ldap as informações do vacation
710         *
711         * @license    http://www.gnu.org/copyleft/gpl.html GPL
712         * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
713         * @sponsor     Caixa Econômica Federal
714         * @author     Cristiano Corrêa Schmidt
715         * @param      <$uri>
716         * @param      <$result>
717         * @param      <$criteria>
718         * @param      <$original>
719         * @return     <void>
720         * @access     public
721         */
722        public function verifyVacationRule( &$uri , &$params , &$criteria , $original  )
723        {
724            if( $original['properties']['id'] === 'vacation' )
725            {
726
727                $user = Controller::read(array('concept' => 'user' , 'id' => config::me('uidNumber') , 'service' => 'OpenLDAP'));
728                $ldapConf = Config::service('OpenLDAP', 'config');
729                $con = ldap_connect( $ldapConf['host'] );
730                ldap_set_option( $con,LDAP_OPT_PROTOCOL_VERSION, 3 );
731                ldap_bind( $con, $ldapConf['user'], $ldapConf['password']);
732
733                $info = array();
734                if(!in_array('Vacation', $user['objectClass']))
735                        $info['objectClass'] = 'Vacation';
736
737                $info['vacationActive'] = strtoupper($original['properties']['enabled']);
738
739                if(isset($original['properties']['actions']) && isset($original['properties']['actions'][0]['parameter']))
740                        $info['vacationInfo']   = $original['properties']['actions'][0]['parameter'];
741                else if( !isset($user['vacationInfo']) )
742                {
743                    $rules = $this->getRules();
744                    if(is_array($rules))
745                        foreach ($rules as $rule)
746                        if($rule['id'] === 'vacation')
747                                $info['vacationInfo'] = $rule['actions'][0]['parameter'];
748                }
749
750                if(!in_array('Vacation', $user['objectClass']))
751                        ldap_mod_add ( $con , $user['dn'] ,  $info );
752                else
753                        ldap_modify ( $con , $user['dn'] ,  $info );
754
755
756                ldap_close($con);
757
758            }
759         
760        }
761
762        /**
763         * Método que remove do ldap as informações do vacation
764         *
765         * @license    http://www.gnu.org/copyleft/gpl.html GPL
766         * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
767         * @sponsor     Caixa Econômica Federal
768         * @author     Cristiano Corrêa Schmidt
769         * @param      <$uri>
770         * @param      <$result>
771         * @param      <$criteria>
772         * @param      <$original>
773         * @return     <void>
774         * @access     public
775         */
776        public function deleteVacationRule( &$uri , &$params , &$criteria , $original  )
777        {         
778            if( $original['URI']['id'] === 'vacation' )
779            {
780                $user = Controller::read(array('concept' => 'user' , 'id' => config::me('uidNumber') , 'service' => 'OpenLDAP'));
781                $ldapConf = Config::service('OpenLDAP', 'config');
782                $con = ldap_connect( $ldapConf['host'] );
783                ldap_set_option( $con,LDAP_OPT_PROTOCOL_VERSION, 3 );
784                ldap_bind( $con, $ldapConf['user'], $ldapConf['password']);
785                $info = array();
786                $info['vacationActive'] = 'FALSE';
787                $info['vacationInfo'] = "";
788                ldap_modify ( $con , $user['dn'] ,  $info );
789                ldap_close($con);
790            }
791        }
792}
Note: See TracBrowser for help on using the repository browser.