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

Revision 7712, 26.8 KB checked in by douglasz, 11 years ago (diff)

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