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

Revision 5341, 7.8 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2434 - Commit inicial do novo módulo de agenda do Expresso - expressoCalendar

Line 
1<?php
2
3class FilterMapping
4{
5    public function formatSieveScript( $rules )
6    {
7        $require_fileinto = $require_flag = $require_reject = $require_vacation = $require_body = $startswith = $endswith = false;
8
9        $script_rules = $script_header = "";
10
11        foreach( $rules as $name => $data )
12        {
13            if( $data['enabled'] )
14                continue;
15
16            $criteria = $data['criteria'];
17            $action   = $data['actions'];
18            $data['isExact'] ? $script_match = 'if allof (' : $script_match = 'if anyof (';
19
20            for ($j=0; $j<count($criteria); $j++)
21            {                                   
22                switch($criteria[$j]['field']) {
23                    case 'To':    /* Adicionar o TO e Cc também?! */
24                    case 'CC':
25                            $criteria[$j]['field'] = "[\"To\", \"TO\", \"Cc\", \"CC\"]";
26                            $script_criteria .= "address :";
27                            break;
28                    case 'size':       
29                            $criteria[$j]['field'] = '';
30                            $script_criteria .= "size :";
31                            break;
32                    case 'subject':
33                            $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
34                            $criteria[$j]['value'] = "[\"" . imap_8bit($criteria[$j]['value']) . "\", \"" . base64_encode($criteria[$j]['value']) . "\"]";
35                            $script_criteria .= "header :";
36                            break;
37                    case 'body':
38                            $criteria[$j]['field'] = '';
39                            $criteria[$j]['value'] = "\"" . $criteria[$j]['value'] . "\"";
40                            $script_criteria .= "body :";
41                            $require_body = true;
42                            break;
43                    default:
44                            $criteria[$j]['field'] = "\"" . $criteria[$j]['field'] . "\"";
45                            $script_criteria .= "header :";
46                            break;
47                }
48               
49                switch ($criteria[$j]['operator']) {
50                    case '>':
51                            $criteria[$j]['operator'] = "over";
52                            break;
53                    case '<':
54                            $criteria[$j]['operator'] = "under";
55                            break;
56                    case '=':
57                            $criteria[$j]['operator'] = "is";
58                            break;
59                    case '*':
60                            $criteria[$j]['operator'] = "contains";
61                            break;                                             
62                    case '^':
63                            $criteria[$j]['operator'] = "matches";
64                            $criteria[$j]['value'] = "[\"" . $criteria[$j]['value'] . "*\"]";
65                            $startswith = true;
66                            break;
67                    case '$':
68                            $criteria[$j]['operator'] = "matches";
69                            $criteria[$j]['value'] = "[\"*" . $criteria[$j]['value'] . "*\"]";
70                            $endswith = true;
71                            break;
72                }
73                // if temporário, por favor! :D       
74                if ($criteria[$j]['field'] == "" || $criteria[$j]['field'] == "\"subject\"" || $startswith || $endswith)
75                {
76                    $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " " . $criteria[$j]['value'] . ", ";
77                    $startswith = $endswith = false;
78                }
79                else
80                    $script_criteria .= $criteria[$j]['operator'] . " " . $criteria[$j]['field'] . " \"" . $criteria[$j]['value'] . "\", ";
81            }
82            $script_criteria = substr($script_criteria,0,-2);
83            $script_criteria .= ")";
84            $script_action = " {\r\n ";
85            for ($k=0; $k<count($action); $k++)
86            {
87                    switch ($action[$k]['type']) {
88                            case 'redirect':
89                                    break;
90                            case 'reject':
91                                    $require_reject = true;
92                                    break;
93                            case 'fileinto':
94                                    $require_fileinto = true;
95                                    break;
96                            case 'vacation':
97                                    $require_vacation = true;
98                                    break;
99                            case 'setflag':
100                                    $require_flag = true;
101                                    break;
102                            case 'discard':
103                                    break;
104                    }
105                    $script_action .= $action[$k]['type'] . " \"" . $action[$k]['parameter'] . "\";\r\n ";
106            }
107
108            $script_action .= "}";
109
110            $script_rules .= $script_match . $script_criteria . $script_action . "\r\n";
111        }
112
113        // if temporário meu caro amigo
114        if($require_reject || $require_fileinto || $require_vacation || $require_body || $require_flag)
115        {
116                $script_header .= "require [";
117                $require_reject ? $script_header .= "\"reject\", " : "";
118                $require_fileinto ? $script_header .= "\"fileinto\", " : "";
119                $require_vacation? $script_header .= "\"vacation\", " : ""; 
120                $require_flag ? $script_header .= "\"imapflags\", " : ""; 
121                $require_body ? $script_header .= "\"body\", " : "";  /* tem que instalar o plugin no SIEVE */
122                $script_header = substr($script_header,0,-2);
123                $script_header .= "];\r\n";
124        }
125
126        $json_data = json_encode($rules);
127       
128        $script_begin = "#Filtro gerado por Expresso Livre versão 2.4 power\r\n\r\n";
129
130        $content = $script_begin . $script_header . $script_rules . "\r\n\r\n#PseudoScript#" . "\r\n#" . $json_data;
131
132        return( $content );
133    }
134   
135    public function parseSieveScript( $script )
136    {
137        $pos = strripos($script, "#PseudoScript#");
138        // Esse 17 hardcodificado é temporário rapá! É o tamanho da palavra #PseudoScript## que vem antes do pseudoscript em si.
139        $pseudo_script = substr( $script, $pos+17 );
140
141        $return = json_decode( $pseudo_script, true );
142
143        return $return;
144
145//              if( !$array_rules )
146//              {
147//                  require_once ROOTPATH.'/../expressoMail1_2/inc/class.ScriptS.inc.php';
148//
149//                  $rules = ScriptS::readScript( $script );
150//
151//                  foreach( $rules['rule'] as $i => $rule )
152//                  {
153//                      $rule = ScriptS::parsePseudoScript( $rule );
154//
155//                      ob_start();
156//                      print_r( var_export($rule) );
157//                      $output = ob_get_clean();
158//                      file_put_contents( '/tmp/2.log', file_get_contents( '/tmp/2.log' ) . $output );
159//                  }
160//     
161  }
162
163  var $rules = false;
164
165  public function __construct()
166  {
167     
168  }
169
170  public function getRules()
171  {
172      $this->rules = Controller::find( array( 'concept' => 'filter' ) );
173
174      if( !$this->rules )
175          $this->rules = array();
176
177      return( $this->rules );
178  }
179
180  public function applySieveFilter( &$uri , &$result , &$criteria , $original , &$service ){
181     
182      if( $original['properties']['applyMessages'] )
183      {
184          $filter = Controller::read($uri);
185         
186          $proc = array();
187          $proc['keep'] = false;
188         
189          foreach ($filter['actions'] as $v){
190              if($v['type'] == 'keep')
191                  $proc['keep'] = true;
192              else{
193                  $proc['type'] = $v['type'];
194                  $proc['parameter'] = $v['parameter'];
195              }
196          }
197
198          $imap = Controller::service( 'Imap' );
199         
200          $imap->apliSieveFilter($original['properties']['applyMessages'] , $proc );
201
202          return $result;
203      }
204  }
205
206  public function readUserScript( &$uri , &$params , &$criteria , $original, &$service )
207  {
208      $uri['id'] = $service->config['user'];
209  }
210
211  public function setRule( &$uri , &$params , &$criteria , $original , &$service )
212  {
213      if( !$this->rules )
214          $this->rules = $this->getRules();
215
216      $params['id'] = $uri['id'];
217
218      $update = false;
219
220      foreach( $this->rules as $i => $rule )
221          if( $update = ($rule['id'] === $params['id']) )
222          {
223              $this->rules[$i] = $params;
224              break;
225          }
226
227      if( !$update )
228          $this->rules[] = $params;
229
230      $content = $this->formatSieveScript( $this->rules );
231
232      $params = array( 'name' => $service->config['user'],
233                       'content' => $content,
234                       'active' => true );
235  }
236
237  public function deleteRule( &$uri, &$params, &$criteria, $original, &$service )
238  {
239      if( !$this->rules )
240          $this->rules = $this->getRules();
241
242      $params['id'] = $uri['id'];
243
244      $update = false;
245
246      foreach( $this->rules as $i => $rule )
247          if( $rule['id'] === $uri['id'] )
248              unset( $this->rules[$i] );
249
250      $uri['id'] = '';
251
252      $params = array( 'name' => $service->config['user'],
253                       'content' => $this->formatSieveScript( $this->rules ),
254                       'active' => true );
255
256      $URI = Controller::URI( $uri['concept'], $service->config['user'] );
257
258      $service->update( $URI, $params );
259  }
260
261  public function getSieveRule( &$uri , &$params , &$criteria , $original, &$service )
262  {
263      $script = $this->parseSieveScript( $params['content'] );
264
265      foreach( $script as $i => $rule )
266          if( $rule['name'] === $original['id'] )
267              return( $params = $rule );
268  }
269
270  public function listSieveRules( &$uri , &$params , &$criteria , $original , &$service )
271  {
272      return( $params = $this->parseSieveScript( $params[0]['content'] ) );
273  }
274}
Note: See TracBrowser for help on using the repository browser.