Changeset 5539


Ignore:
Timestamp:
02/23/12 17:14:32 (12 years ago)
Author:
airton
Message:

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

Location:
trunk
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/expressoMail1_2/inc/class.imap_functions.inc.php

    r5533 r5539  
    53265326                return $return; 
    53275327        } 
     5328                 
     5329                 
     5330        function searchSieveRule( $params ) 
     5331        { 
     5332                 
     5333                $imap = $this->open_mbox( 'INBOX' ); 
     5334                $msgs = imap_sort( $imap , SORTDATE , 0 , SE_UID); 
     5335                 
     5336                $rr = array(); 
     5337         
     5338         
     5339                foreach ($msgs as $i => $v) 
     5340                { 
     5341                         
     5342                        $msg = imap_headerinfo ( $imap,   imap_msgno($imap, $v)  );      
     5343                         
     5344                        if(isset($params['from'])) 
     5345                        { 
     5346                                $from['from'] = array(); 
     5347                                $from['from']['name'] = $this->decode_string($msg->from[0]->personal); 
     5348                                $from['from']['email'] = $this->decode_string($msg->from[0]->mailbox . "@" . $msg->from[0]->host); 
     5349                                if ($from['from']['name']) 
     5350                                { 
     5351                                        if (substr($from['from']['name'], 0, 1) == '"') 
     5352                                                $from['from']['full'] = $from['from']['name'] . ' ' . '<' . $from['from']['email'] . '>'; 
     5353                                        else 
     5354                                                $from['from']['full'] = '"' . $from['from']['name'] . '" ' . '<' . $from['from']['email'] . '>'; 
     5355                                } 
     5356                                else 
     5357                                        $from['from']['full'] = $from['from']['email']; 
     5358 
     5359                                if($this->filterCheck( $from['from']['full'] , $params['from']['criteria'] , $params['from']['filter'] )) 
     5360                                        $rr['from'][] = $v; 
     5361                        } 
     5362                         
     5363                        if(isset($params['to'])) 
     5364                        {        
     5365                                $tos = $msg->to; 
     5366                                $val = ''; 
     5367                                foreach( $tos as $to) 
     5368                                { 
     5369                                        $tmp = imap_mime_header_decode($to->personal); 
     5370                                        $val .= '"' . $tmp[0]->text . '" ' . '<' .  $to->mailbox . "@" . $to->host . '>'; 
     5371                                         
     5372                                }                                
     5373                                if($this->filterCheck( $val , $params['to']['criteria'] , $params['to']['filter'] )) 
     5374                                        $rr['to'][] = $v; 
     5375                                 
     5376                                $tos = $msg->cc; 
     5377                                $val = ''; 
     5378                                foreach( $tos as $to) 
     5379                                { 
     5380                                        $tmp = imap_mime_header_decode($to->personal); 
     5381                                        $val .= '"' . $tmp[0]->text . '" ' . '<' .  $to->mailbox . "@" . $to->host . '>'; 
     5382                                         
     5383                                } 
     5384                                 
     5385                                if($this->filterCheck( $val , $params['to']['criteria'] , $params['to']['filter'] )) 
     5386                                        $rr['to'][] = $v; 
     5387                        } 
     5388                         
     5389                        if(isset($params['subject'])) 
     5390                        {                
     5391                                $ss = ''; 
     5392                                $subject = imap_mime_header_decode($msg->subject); 
     5393                                foreach ($subject as $tmp) 
     5394                                        $ss .= $tmp->text; 
     5395                                 
     5396                                if($this->filterCheck($ss , $params['subject']['criteria'] , $params['subject']['filter'] )) 
     5397                                $rr['subject'][] = $v; 
     5398                        } 
     5399                         
     5400                        if(isset($params['body'])) 
     5401                        {                        
     5402                                $this->mbox = $this->open_mbox( 'INBOX' ); 
     5403                                $b = $this->get_body_msg( $v , 'INBOX' ); 
     5404                                 
     5405                                if( $this->filterCheck( $b['body'] , $params['body']['criteria'] , $params['body']['filter'] )) 
     5406                                        $rr['body'][] = $v; 
     5407                                 
     5408                                unset($b); 
     5409                        } 
     5410                         
     5411                        if(isset($params['size'])) 
     5412                        { 
     5413                                if( $this->filterCheck( $msg->Size , $params['size']['criteria'] , $params['size']['filter'] )) 
     5414                                        $rr['size'][] = $v; 
     5415                        } 
     5416                } 
     5417                 
     5418                $rrr = array(); 
     5419                $init = true; 
     5420                 
     5421                 
     5422                foreach ($rr as $i => $v) 
     5423                {                        
     5424                        if(count($rrr) == 0 && $init === true) 
     5425                                $rrr = $v; 
     5426                        else if($params['isExact'] === true) 
     5427                                $rrr = array_diff($rrr , $v); 
     5428                        else 
     5429                                $rrr =  array_unique(array_merge($rrr , $v)); 
     5430                         
     5431                } 
     5432                 
     5433 
     5434//              if($params['page'] && $params['rows']) 
     5435//              { 
     5436//               
     5437//                      $end = ( $params['rows'] * $params['page'] );    
     5438//                      $ini = $end -  $params['rows'] ; 
     5439//               
     5440//                      //Pegando os do range da paginação                       
     5441//                      $k = -1; 
     5442//                      $r = array(); 
     5443//                      foreach ($rrr as $v) 
     5444//                      {                
     5445//                              $k++; 
     5446//                              if( $k < $ini || $k >= $end ) continue;                  
     5447//                              $r[] = $v; 
     5448//                      } 
     5449//                      ////////////////////////////////////// 
     5450//              } 
     5451//              else 
     5452                        $r = $rrr;               
     5453                                         
     5454                return $r ; 
     5455        } 
     5456         
     5457        function filterCheck( $val , $crit ,$fil ) 
     5458        {                
     5459                switch ( $fil ) { 
     5460                        case '=' : //Igual 
     5461                                if( $val == $crit ) return true; else return false;     break; 
     5462                        case '*' : //Existe 
     5463                                if( strpos( $val , $crit ) !== false ) return true; else return false; break; 
     5464                        case '!*' : //Não existe 
     5465                                if( strpos( $val , $crit ) === false ) return true; else return false; break; 
     5466                        case '^' : //Começa com 
     5467                                if( substr ($val , 0 , strlen($crit) ) == $crit ) return true; else return false; break;         
     5468                        case '$' : //Termina com 
     5469                                if( substr ($val , 0 , -(strlen($crit)) ) == $crit ) return true; else return false; break;      
     5470                        case '>' : //Maior que 
     5471                                if( $val  > (int)($crit * 1024) ) return true; else return false; break;         
     5472                        case '<' : //Menor que 
     5473                                if( $val  < (int)($crit * 1024) ) return true; else return false; break;         
     5474                } 
     5475        } 
     5476         
     5477        function apliSieveFilter($msgs , $proc ) 
     5478        { 
     5479                $ret = array(); 
     5480                 
     5481                switch($proc['action']){ 
     5482                        case 'fileintro': 
     5483                                $imap = $this->open_mbox( 'INBOX' ); 
     5484                                foreach( $msgs as $msg ) 
     5485                                        if($proc['keep'] === true) 
     5486                                                $ret[$msg][] =  imap_mail_copy($imap,$msg,$proc['value']); 
     5487                                        else 
     5488                                                $ret[$msg][] = imap_mail_move($imap,$msg,$proc['value']); 
     5489                                break; 
     5490                        case 'redirect': 
     5491                                        foreach($msgs as $msg) 
     5492                                        {                                
     5493                                                $info = $this->get_info_msg(array('msg_folder' => 'INBOX','msg_number' => $msg)); 
     5494                                 
     5495                                                require_once $_SESSION['rootPath'] . '/API/class.servicelocator.php'; 
     5496                                                $mailService = ServiceLocator::getService('mail'); 
     5497                                                 
     5498                                                $ret[$msg][] = $mailService->sendMail( $proc['value'] , $info['from']['full'] , $info['subject'] ,$info['body'] ); 
     5499                                                 
     5500                                                if($proc['keep'] !== true) 
     5501                                                    $this->delete_msgs(array('msgs_number' => $msg , 'folder' => 'INBOX')); 
     5502                                        }        
     5503                                break; 
     5504                         
     5505                        case 'setflag': 
     5506                                foreach($msgs as $msg) 
     5507                                        $ret[$msg][] = $this->set_messages_flag( array( 'folder' => 'INBOX' , 'msgs_to_set' => $msg , 'flag' => $proc['value']) ); 
     5508                 
     5509                                break; 
     5510                } 
     5511                 
     5512                return $ret; 
     5513        } 
    53285514} 
    53295515?> 
  • trunk/expressoMail1_2/index.php

    r5533 r5539  
    386386<title>ExpressoMail</title> 
    387387</head> 
    388 <body scroll="no" style="overflow:hidden"> 
     388<body scroll="no" style="overflow:hidden" class="expressomail-module-container"> 
    389389<link rel="stylesheet" href="../prototype/modules/attach_message/attach_message.css" type="text/css" /> 
    390390<link rel="stylesheet" href="../prototype/modules/mail/css/label.css" type="text/css" />         
     
    394394</body> 
    395395</html> 
     396<script type="text/javascript" src="../prototype/modules/filters/filters.js"></script> 
    396397<script type="text/javascript">connector.updateVersion = "<?=$update_version?>";</script> 
    397398<!-----Expresso Mail - Version Updated:<?=$update_version?>--------> 
  • trunk/expressoMail1_2/js/common_functions.js

    r5533 r5539  
    641641        filters.Forms(); 
    642642} 
     643 
     644 
     645function filterbox2(){ 
     646        jQuery('.expresso-window-container').dialog('open'); 
     647} 
     648 
    643649 
    644650function sharebox(){ 
  • trunk/expressoMail1_2/js/doiMenuData.js

    r5533 r5539  
    9797                "i01": {"name": get_lang("Preferences"), "icon": "preferences-mail", callback: preferences_mail }, 
    9898                "i02": {"name": get_lang("Search"), "icon": "search-mail", callback: function(key, opt){ search_emails(""); }}, 
    99                 "103": {"name": get_lang("Edit filters"), "icon": "filter", callback: filterbox }, 
     99                "103": {"name": get_lang("Edit filters"), "icon": "filter", callback: filterbox2 }, 
    100100                "i04": {"name": get_lang("Edit folders"), "icon": "edit-folder", callback: folderbox }, 
    101101                "i05": {"name": get_lang("Share mailbox"), "icon": "share-mailbox", callback: sharebox }, 
  • trunk/prototype/api/controller.php

    r5514 r5539  
    422422                foreach( $interceptors[ $eventType ] as $intercept => $interceptor ) 
    423423                { 
    424                     $return = $interceptor->$intercept( $params['URI'], $params['properties'], $params['criteria'], $original/*, $params['service']*/ ); 
     424                    $return = $interceptor->$intercept( $params['URI'], $params['properties'], $params['criteria'], $original /*, $params['service'] */); 
    425425 
    426426                    if( $return === false ) 
     
    560560                    $TX['rollback'] = !!!$params['properties']; 
    561561 
    562                     if( $params['properties'] && isset($params['properties']['id']) ) 
     562                    if( $params['properties'] && is_array($params['properties']) && isset($params['properties']['id']) ) 
    563563                        $TX['id'] = $params['properties']['id']; 
    564564 
     
    639639                $result = Controller::call( $method, $URI, $data, false, false, true ); 
    640640 
    641                 if( !is_bool( $result ) && !is_string( $result ) && isset( $result['id'] ) ) 
     641                if( is_array( $result ) && isset( $result['id'] ) ) 
    642642                      $URI['id'] = $result['id']; 
    643643 
  • trunk/prototype/api/datalayer.js

    r5531 r5539  
    8989    var $this = $(this), action = $this.attr('action'), res = false, 
    9090     
    91     method = $this.attr( 'method' ), 
     91    method = $this.attr( 'method' ) || 'POST', 
    9292     
    9393    fileInputs = $this.find('input[type="file"]'); 
  • trunk/prototype/modules/filters/filter-list.ejs

    r5341 r5539  
    11<ul class="rule-list"> 
    22<% 
    3         data.rules = data.rules || []; 
     3        data.rules = (data.rules || []); 
     4        for (var i=0; i<data.rules.length; i++) { 
    45 
    5         for (var i=0; i<data.rules.length; i++) { 
    66%> 
    77                <li class="rule <%= (data.rules[i].name=='vacation')?'vacation':'' %>" title="<%= data.rules[i].name %>"> 
     
    2020                                        </ul> 
    2121                                </dd> 
    22  
    2322                                <dt>Ações:</dt> 
    2423                                <dd class="rule-briefing-action"> 
     
    3534                        </dl> 
    3635                        <ul class="menu-control"> 
    37                                 <li><a href="#<%= data.rules[i].name %>" class="button update" title="Alterar regra '<%= data.rules[i].name %>'">Alterar</a></li> 
     36                                <li><a href="#<%= data.rules[i].name %>" class="button update" title="Alterar regra '<%= data.rules[i].name %>'"></a></li> 
    3837                                <li><a href="#<%= data.rules[i].name %>" class="button enable<%= (data.rules[i].enabled)? '': ' hidden' %>" title="Habilitar regra"></a></li> 
    3938                                <li><a href="#<%= data.rules[i].name %>" class="button disable<%= (data.rules[i].enabled)? ' hidden': '' %>" title="Desabilitar regra"></a></li> 
     
    4645%> 
    4746</ul> 
    48 <ul class="message-tip-container no-saved hidden"> 
    49         <li class="message-tip">Você possui ações não salvas. Para efetivá-las clique no botão "Concluir" abaixo.</li> 
    50 </ul> 
    51 <fieldset class="fields-add ui-corner-all"> 
    52         <legend>Adicionar</legend> 
    53         <a href="#" class="button add" title="Adicionar nova regra">Nova regra</a> 
    54         <a href="#" class="button add vacation" title="Adicionar regra 'Fora do escritório'">Fora do escritório</a> 
    55 </fieldset> 
     47<!-- 
    5648<fieldset class="fields-selected-itens ui-corner-all"> 
    5749        <legend>Selecionadas</legend> 
     
    6052        <a href="#" class="button delete"  title="Excluir regras selecionadas">Excluir</a> 
    6153</fieldset> 
     54--> 
  • trunk/prototype/modules/filters/filters.css

    r5341 r5539  
    3131.rule-list .rule { 
    3232        display: block; 
    33         margin: 0; 
     33        margin: 1px; 
    3434        padding: 5px; 
     35        border : 1px solid #CCCCCC; 
     36        border-radius : 5px; 
    3537/*      height: 18px;*/ 
    3638} 
     
    4143 
    4244.rule-list .rule .menu-control { 
    43         max-width:  125px; 
     45        max-width:  100px; 
    4446    float: right; 
    4547        margin-top: -50px; 
     
    5254        padding: 0; 
    5355} 
    54 .rule.vacation { background-color: #FBFAF3; } 
     56.rule.vacation { background-color: #F5F3BC; } 
    5557.rule.vacation .title { font-style: italic; } 
    5658 
     
    7274    margin: 5px; 
    7375    padding: 5px; 
    74     text-align: center; 
    7576    width: 250px; 
    7677        border: 1px solid #AAA; 
    7778} 
     79 
     80.expresso-window-container .filter-llist{     
     81        border: 1px solid #AAA; 
     82} 
     83 
    7884.expresso-window-container .fields-add { margin-right: 0;} 
    7985 
     
    8591} 
    8692 
    87  
    88  
    89  
    90  
    9193.filter-manager-window fieldset, .vacarion-details-container fieldset{ border: none; } 
    9294.rule-details-container fieldset label.small { width: 100px; display: inline-block;} 
     
    9597.rule-details-container fieldset.fields-isexact fieldset { border: none; } 
    9698 
    97 .rule-details-container fieldset.fields-replyto textarea { display: block; width: 350px; height: 50px; border: 1px solid #AAA; margin: 5px; } 
    98 .vacation-details-container textarea { display: block; width: 350px; height: 100px; border: 1px solid #AAA; margin: 5px; } 
     99.rule-details-container fieldset.fields-replyto textarea { display: block; width : 100%; height: 50px; border: 1px solid #AAA; padding: 5px; margin: 5px; } 
     100.vacation-details-container textarea { display: block; width : 98.5%; height: 100px; border: 1px solid #AAA; padding: 5px; margin: 5px; } 
    99101 
    100102.filter-manager-window .message-tip-container { list-style: none; border:1px solid #E17009; background-color: #FBFAF3; padding: 5px; margin: 5px;} 
     
    116118        font-size: 0.8em; 
    117119} 
    118 .rule .menu-control .ui-button.disable,.rule .menu-control .ui-button.enable, .rule .menu-control .ui-button.close  { top:5px; } 
     120.rule .menu-control .ui-button.disable,.rule .menu-control .ui-button.enable, .rule .menu-control .ui-button.update, .rule .menu-control .ui-button.close  { top:5px; } 
    119121.filter-manager-window .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 
  • trunk/prototype/modules/filters/filters.js

    r5399 r5539  
    6060 
    6161    nameObj.val( filter.name ); 
    62  
     62        nameObj.attr("disabled", "disabled"); 
    6363    for( var i = 0; i < filter.criteria.length; i++ ){ 
    6464 
     
    6969    } 
    7070 
     71         
    7172    for( var i = 0; i < filter.actions.length; i++ ){ 
    72  
    73         actions.filter( '[value="' + filter.actions[i].type + '"]' ).val( filter.actions[i].type ) 
    74         .siblings( '[name="actionParameter[]"]' ).val( filter.actions[i].parameter ); 
    75  
     73                actions.filter( '[value="' + filter.actions[i].type + '"]' ).attr("checked", "True"); 
     74                actions.filter( '[value="' + filter.actions[i].type + '"]' ).val( filter.actions[i].type ) 
     75                .siblings( '[name="actionParameter[]"]' ).val( filter.actions[i].parameter ); 
     76                if(filter.actions[i].type == "redirect") 
     77                        actions.siblings('[name="addressRedirect"]').val(filter.actions[i].parameter); 
     78                if(filter.actions[i].type == "reject")   
     79                        actions.siblings('[name="messageReject"]').val(filter.actions[i].parameter); 
    7680    } 
    7781   
    78     isExact.val( filter.isExact ? "and" : "or" ); 
     82    //isExact.val( filter.isExact != "false"? "and" : "or" ); 
     83        isExact.filter('[value="'+(filter.isExact != "false"? "and" : "or")+'"]').attr("checked", "True"); 
    7984} 
    8085 
     
    8489   
    8590  decoder: function( form ){ 
    86      
    8791      if( form.vacation ) 
    8892          return { 
    8993 
    90                 criteria: [{ value: "", operator: "*", field: "from" }], 
    91                 actions: [{ parameter: form.vacation, type: "replyto" }], 
     94                criteria: [{ value: "vacation", operator: "", field: "vacation" }], 
     95                actions: [{ parameter: form.vacation, type: "vacation" }], 
    9296                id: "vacation", 
    9397                name: "vacation", 
     
    96100      } 
    97101 
    98       return { 
    99                 id: form.name, 
    100                 name: form.name, 
     102      var haha = { 
     103                //id: form.name, 
     104                name: form.name ? form.name : nameObj.val(), 
    101105                isExact: ( form.isExact === "and" ), 
    102                 criteria: $.map( form.criteriaOperator || [], function( criteriaOperator, i ){ 
    103  
     106                criteria: $.map( form.criteriaOperator || [], function( criteriaOperator, i ){   
    104107                        return (!form.criteriaValue[i]) ? null: 
    105  
    106108                                {value:  form.criteriaValue[i], 
    107109                                  operator: criteriaOperator, 
     
    110112                }), 
    111113                actions: $.map( form.actionType || [], function( type, i ){ 
    112  
     114                        var the_parameter = form.actionParameter[i]; 
     115                         
     116                        !the_parameter ? the_parameter = form.actionParameter[i+1] : ""; 
     117                        if (type == 'fileinto') {  
     118                                the_parameter = form.valueFileInto; 
     119                        } 
     120                        if (type == 'reject') { 
     121                                the_parameter = form.messageReject; 
     122                        } 
     123                        if (type == 'fileintoInbox') {  
     124                                type = 'fileinto'; 
     125                                the_parameter = 'INBOX'; 
     126                        } 
     127                        if (type == 'fileintoTrash') { 
     128                                type = 'fileinto'; 
     129                                the_parameter = 'INBOX/Trash'; 
     130                        } 
     131                        if (type == 'redirect') { 
     132                                the_parameter = form.addressRedirect; 
     133                        } 
     134                        if (type == 'setflag') {  
     135                                the_parameter = form.valueSetFlag; 
     136                        } 
     137                         
    113138                        return (!type) ? null: 
    114                               {parameter: form.actionParameter[i], type: type }; 
     139                              {parameter: the_parameter, type: type }; 
    115140 
    116141                }), 
     142                enabled : "enabled", 
    117143                applyMessages: allMessages? !$.isEmptyObject( selectedMessages ) ? 
    118  
    119                                keys( selectedMessages ) : allMessages : "" 
     144                keys( selectedMessages ) : allMessages : "" 
     145                 
    120146      }; 
    121  
     147          return haha; 
    122148      //        'vacation' => "" 
    123149  }, 
    124150   
    125151  encoder: function( filters ){ 
    126      
     152         
    127153        var rules = []; 
    128154 
     
    174200 
    175201}); 
    176  
     202/* 
    177203DataLayer.listen( "filter", function( status ){ 
    178204  
     
    180206 
    181207}); 
    182  
     208*/ 
    183209 
    184210 
     
    190216var selectedMessages = {}; 
    191217var allMessages = false; 
    192  
     218//list_container = container.find(".rule-list-container"); 
     219/* 
    193220var raster = function( html ){ 
    194    
    195221    container = $('body.expressomail-module-container').append( html ).find(".expresso-window-container"); 
    196     list_container = container.find(".rule-list-container"); 
    197     details_container = container.find(".rule-details-container"); 
    198     vacation_container = container.find(".vacation-details-container"); 
    199     form = container.find("form"); 
     222        list_container = container.find(".rule-list-container"); 
     223        details_container = container.find(".rule-details-container"); 
     224        vacation_container = container.find(".vacation-details-container"); 
     225        form = container.find("form"); 
    200226     
    201227    criterias = details_container.find( 'fieldset input[name="criteriaType[]"]' ); 
    202     actions = details_container.find( 'fieldset input[name="actionType[]"]' ); 
    203     nameObj = details_container.find( 'input[name="name"]' ); 
    204     isExact = details_container.find( 'input[name="isExact"]' ); 
    205    
     228        actions = details_container.find( 'fieldset input[name="actionType[]"]' ); 
     229        nameObj = details_container.find( 'input[name="name"]' ); 
     230        isExact = details_container.find( 'input[name="isExact"]' ); 
    206231    formatter(); 
    207      
    208232    container = container.dialog({ 
    209233            width:700, 
     
    226250            autoOpen: false 
    227251    }); 
    228      
    229252    details_container.accordion({autoHeight: false}); 
    230253     
     
    260283 
    261284    }); 
    262      
    263285    details_container.find( ".menu-container" ) 
    264286 
     
    399421                   
    400422    }); 
    401      
    402423    vacation_container.find( ".menu-container" ) 
    403424        .find(".button.back").click(function(event){ 
     
    416437                vacation_container.addClass('hidden'); 
    417438                return( false ); 
    418         });     
     439        });  
    419440} 
    420441 
    421442var reraster = function( html ){ 
    422443 
    423   list_container.find( '.ui-widget' ).remove(); 
    424  
    425   list_container.html( html ).find(".button").button(); 
    426    
    427   formatter(); 
     444        //$(".rule-list-container").next().addClass("hidden"); 
     445         
     446        list_container.find( '.ui-widget' ).remove(); 
     447 
     448        list_container.html( html ).find(".button").button(); 
     449   
     450        formatter(); 
    428451} 
    429452 
     
    431454 
    432455    checkBoxes = container.find(".rule-list").selectable({ 
    433  
    434         selecting: function(event, ui) { 
    435             $(ui.selecting).find(':checkbox').attr('checked', true); 
    436         }, 
    437         unselecting: function(event, ui) { 
    438             $(ui.unselecting).find(':checkbox').attr('checked', false); 
    439         } 
     456                selecting: function(event, ui) { 
     457                        $(ui.selecting).find(':checkbox').attr('checked', true); 
     458                }, 
     459                unselecting: function(event, ui) { 
     460                        $(ui.unselecting).find(':checkbox').attr('checked', false); 
     461                } 
    440462    }) 
    441463    .find(':checkbox').change(function () { 
     
    511533     
    512534 
    513     .end().find( ".menu-control .button" ) 
     535    .end().find( ".menu-control .button" ).filter(".update").button({ 
     536                icons: { 
     537                        primary: "ui-icon-pencil" 
     538                }, 
     539                text: false 
     540        }).end() 
    514541 
    515542        .filter(".enable, .disable").click( function(event) { 
     
    573600}; 
    574601 
    575 DataLayer.render( BASE_PATH + 'modules/filters/filters.ejs', 'filter:detail', raster, true ); 
     602//DataLayer.render(BASE_PATH + 'modules/filters/filters.ejs', {}, 'filter:detail', reraster, true); 
     603//var vamo_ver = DataLayer.render(BASE_PATH + 'modules/filters/filters.ejs', {}); 
     604//raster(vamo_ver); 
     605var v = DataLayer.render( BASE_PATH + 'modules/filters/filters.ejs', {}); 
     606raster(v); 
     607                details_container.accordion('activate',0); 
     608 
     609                showGridButton.removeClass('hidden'); 
     610                grid.addClass('hidden').jqGrid('GridDestroy'); 
     611           
     612                list_container.removeClass('hidden'); 
     613                details_container.addClass('hidden'); 
     614                 
     615DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', 'filter:detail', reraster ); 
     616//var v = DataLayer.get("filter:detail"); 
    576617// ------------------------------------------------------------ 
    577 // ------------------------------------------------------------      
     618// ------------------------------------------------------------     
     619*/  
     620function list_filters(html){ 
     621        if(html){ 
     622                if( ! $(".filters-windows").length ) 
     623                        container = $('body.expressomail-module-container').append("<div class='filters-windows'></div>").find(".filters-windows").html( html ).find(".expresso-window-container"); 
     624                list_container = $('body.expressomail-module-container').find(".rule-list-container"); 
     625        } 
     626        list_container = $(".expresso-window-filters").dialog({ 
     627            width:700, 
     628            modal: true, 
     629                resizable: false, 
     630            closeOnEscape:true, 
     631            close:function(event, ui) { 
     632                    event.stopPropagation(); 
     633                        if($(".cancel").length) 
     634                                $(".cancel").trigger('click'); 
     635                    //DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     636            }, 
     637                open: function () { 
     638                        $(".ui-dialog .ui-dialog-titlebar") 
     639                        .append('<a href="#" class="ui-dialog-titlebar-minimize ui-corner-all" role="button"><span class="ui-icon ui-icon-minusthick">minimize</span></a>') 
     640                        .find('.ui-dialog-titlebar-minimize').click(function() { 
     641                                $(".ui-dialog-buttonpane, .ui-dialog-content").toggle(); 
     642                                $(".ui-icon-minusthick, .ui-icon-newwin").toggleClass('ui-icon-minusthick').toggleClass('ui-icon-newwin'); 
     643                        }); 
     644                }, 
     645            autoOpen: false, 
     646                buttons: [{ 
     647                        text : "Fechar", 
     648                        click : function() { 
     649                                $( this ).dialog( "close" ); 
     650                        } 
     651                }] 
     652    }); 
     653        $(".ui-dialog-titlebar").after("<div class='dialog-head-buttonpane ui-dialog-buttonpane ui-widget-content ui-helper-clearfix' style='background-color: rgb(224, 238, 238); '><div class='ui-dialog-buttonset header-buttonpane'></div></div>"); 
     654        $(".dialog-head-buttonpane").css("padding", "5px"). 
     655        find(".header-buttonpane").html("<a href='#' class='button add' title='Adicionar nova regra'>Nova regra</a><a href='#' class='button add vacation' title='Adicionar regra 'Fora do escritorio''>Fora do escritorio</a>").find(".button").button(); 
     656         
     657        $(".ui-dialog-buttonpane.ui-widget-content").css("background-color", "#E0EEEE"); 
     658        var zu = DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', DataLayer.get("filter:detail", true)); 
     659//      DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', 'filter:detail',function(html){ 
     660                list_container.html(zu).find(".button").button(); 
     661                 
     662                list_container.find(".rule-list").selectable({ 
     663                        selecting: function(event, ui) { 
     664                                $(ui.selecting).find(':checkbox').attr('checked', true); 
     665                        }, 
     666                        unselecting: function(event, ui) { 
     667                                $(ui.unselecting).find(':checkbox').attr('checked', false); 
     668                        } 
     669                }); 
     670                 
     671                $( ".menu-control .button" ).filter(".update").button({ 
     672                        icons: { 
     673                                primary: "ui-icon-pencil" 
     674                        }, 
     675                        text: false 
     676                }).click(function(){ 
     677                        var id = $(this).parents("li.rule").find('.title').html(); 
     678                        var filters = DataLayer.get( 'filter', true); 
     679                        for(var i =0; i < filters.length; i++){ 
     680                                if(filters[i].id == id){ 
     681                                        filters = filters[i]; 
     682                                        break; 
     683                                }        
     684                        } 
     685                         
     686                        DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {},function(html){ 
     687                                var details_container = $(".expresso-window-filters").html(html); 
     688                                form = container.find("form"); 
     689                                criterias = details_container.find( 'fieldset input[name="criteriaType[]"]' ); 
     690                                actions = details_container.find( 'fieldset input[name="actionType[]"]' ); 
     691                                nameObj = details_container.find( 'input[name="name"]' ); 
     692                                isExact = details_container.find( 'input[name="isExact"]' ); 
     693                                showDetails(filters); 
     694                                var accord = $(".rule-details-container").accordion({autoHeight: false}); 
     695                                $(".button").button().filter(".forth").click(function(){ 
     696                                        accord.accordion('activate',1); 
     697                                }).end().filter(".back").click(function(){ 
     698                                        accord.accordion('activate',0); 
     699                                }).end().filter(".cancel").click(function(){ 
     700                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     701                                }).end().filter(".submit").click(function(){ 
     702                                        if(nameObj) 
     703                                                nameObj.attr("disabled", "false"); 
     704                                        $(this).submit(); 
     705                                        DataLayer.commit( 'filter' ); 
     706                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     707                                }); 
     708                        }); 
     709                }).end() 
     710                .filter(".enable").button({ 
     711                        icons: { 
     712                                primary: "ui-icon-circle-check" 
     713                        }, 
     714                        text: false 
     715                }).click(function(){ 
     716                        var id = $(this).parents("li.rule").find('.title').html(); 
     717                        DataLayer.put( 'filter', id, { enabled: "disable"  }); 
     718                        DataLayer.commit("filter"); 
     719                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     720                }).end() 
     721 
     722                .filter(".disable").button({ 
     723                        icons: { 
     724                                primary: "ui-icon-circle-close" 
     725                        }, 
     726                        text: false 
     727                }).click(function(){ 
     728                        var id = $(this).parents("li.rule").find('.title').html(); 
     729                        DataLayer.put( 'filter', id, { enabled: "enabled" }); 
     730                        DataLayer.commit("filter"); 
     731                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     732                }).end() 
     733                 
     734                .filter(".close").button({ 
     735                        icons: { 
     736                                primary: "ui-icon-close" 
     737                        }, 
     738                        text: false 
     739                }).click(function(){ 
     740                        $(event.target) 
     741                        .parents("li.rule").find('.title') 
     742                        .each( function(){ 
     743                                DataLayer.remove( 'filter', $(this).html() ); 
     744                        }); 
     745                        DataLayer.commit("filter"); 
     746                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     747                }).end().removeClass("ui-button-icon-only"); 
     748                 
     749                $(".button.add:first").click(function(){ 
     750                        $(".dialog-head-buttonpane").addClass("hidden"); 
     751                        DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {},function(html){ 
     752                                $(".expresso-window-filters").html(html); 
     753                                var accord = $(".rule-details-container").accordion({autoHeight: false}); 
     754                                $(".button").button().filter(".forth").click(function(){ 
     755                                        accord.accordion('activate',1); 
     756                                }).end().filter(".back").click(function(){ 
     757                                        accord.accordion('activate',0); 
     758                                }).end().filter(".cancel").click(function(){ 
     759                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     760                                }).end().filter(".submit").click(function(){ 
     761                                        $(this).submit(); 
     762                                        DataLayer.commit( 'filter' ); 
     763                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     764                                }); 
     765                                //$(".rule-edit-container").html(html); 
     766                        });      
     767                }); 
     768                $(".button.add.vacation").click(function(){ 
     769                        $(".dialog-head-buttonpane").addClass("hidden"); 
     770                        DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {},function(html){ 
     771                                $(".expresso-window-filters").html(html); 
     772                                $(".vacation-details-container").removeClass("hidden"); 
     773                                $(".rule-details-container").addClass("hidden"); 
     774                                $(".button").button().filter(".back").click(function(){ 
     775                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     776                                }).end().filter(".submit").click(function(){ 
     777                                        $(this).submit(); 
     778                                        DataLayer.commit( 'filter' ); 
     779                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
     780                                }); 
     781                                //$('[name="vacation"]').elastic().unbind('blur'); 
     782                                //$(".back").click(function(){ 
     783                                //$(".rule-edit-container").html(html); 
     784                        });      
     785                }); 
     786//      }); 
     787} 
     788 
     789DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 
  • trunk/prototype/modules/filters/interceptors/FilterMapping.php

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

    r5341 r5539  
    1010         
    1111    public function open( $config ) 
    12     { 
    13         $this->config = $config; 
    14  
    15         if( PEAR::isError( $error = $this->connect( $config['host'] , $config['port'] , $config['options'] , $config['useTLS'] ) ) ) 
    16             return $error->toString(); 
    17  
    18         if( PEAR::isError( $error = $this->login( $config['user'] , $config['password'] , $config['loginType'] ) ) ) 
    19             return $error->toString(); 
    20  
    21         if( PEAR::isError( $error = $this->getError() ) ) 
    22             return $error->toString(); 
     12    {    
     13                $this->config = $config; 
     14                         
     15                if( PEAR::isError( $error = $this->connect( $config['host'] , $config['port'] , $config['options'] , $config['useTLS'] ) ) ) { 
     16                        return $error->toString(); 
     17                } 
     18                 
     19                if( PEAR::isError( $error = $this->login( $config['user'] , $config['password'] , $config['loginType'] ) ) ) { 
     20                        return $error->toString(); 
     21                } 
     22                 
     23                if( PEAR::isError( $error = $this->getError() ) ) { 
     24                        return $error->toString(); 
     25                }        
    2326    } 
    2427 
    25     public function find( $URI, $context, $justthese = false, $criteria = false ) 
     28    public function find( $URI, $justthese = false, $criteria = false ) 
    2629    { 
    2730        $return = $this->listScripts(); 
     
    3437        foreach( $return as $i => $id ) 
    3538                $array_return[] = $this->read( array( 'id' => $id ) ); 
    36  
    37 //      ob_start(); 
    38 //         print_r( $array_return ); 
    39 //         $output = ob_get_clean(); 
    40 //         file_put_contents( "/tmp/2.log",  $output , FILE_APPEND); 
    41  
    4239        return $array_return; 
    4340    } 
     
    4744    public function read( $URI, $justthese = false ) 
    4845    { 
    49         return array( 'name' => $URI['id'],  
     46                return array( 'name' => $URI['id'],  
    5047                      'content' => $this->getScript( $URI['id'] ), 
    5148                      'active' => ($this->getActive() === $URI['id']) ); 
     
    5350         
    5451    public function create( $URI, $data ) 
    55     { 
    56         if( $this->installScript( $data['name'], $data['content'], $data['active'] ) ) 
    57             return array('id' => $data['name']); 
     52    {    
     53                if( $this->installScript( $data['name'], $data['content'], $data['active'] ) ) 
     54                        return array('id' => $data['name']); 
    5855 
    59         return false; 
     56                return false; 
    6057    } 
    6158 
Note: See TracChangeset for help on using the changeset viewer.