alecpl
2009-09-08 d168b9909acc66510bd24b3e74f6828f47939f75
plugins/managesieve/managesieve.php
@@ -7,36 +7,10 @@
 * It's clickable interface which operates on text scripts and communicates
 * with server using managesieve protocol. Adds Filters tab in Settings.
 *
 * @version 1.0
 * @version 1.6
 * @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl>
 *
 * Configuration (main.inc.php):
// managesieve server port
$rcmail_config['managesieve_port'] = 2000;
// managesieve server address
$rcmail_config['managesieve_host'] = 'localhost';
// use or not TLS for managesieve server connection
// it's because I've problems with TLS and dovecot's managesieve plugin
// and it's not needed on localhost
$rcmail_config['managesieve_usetls'] = false;
// default contents of filters script (eg. default spam filter)
$rcmail_config['managesieve_default'] = '/etc/dovecot/sieve/global';
// I need this because my dovecot (with listescape plugin) uses
// ':' delimiter, but creates folders with dot delimiter
$rcmail_config['managesieve_replace_delimiter'] = '';
// disabled sieve extensions (body, copy, date, editheader, encoded-character,
// envelope, environment, ereject, fileinto, ihave, imap4flags, index,
// mailbox, mboxmetadata, regex, reject, relational, servermetadata,
// spamtest, spamtestplus, subaddress, vacation, variables, virustest, etc.
// Note: not all extensions are implemented
$rcmail_config['managesieve_disabled_extensions'] = array();
 * Configuration (see config.inc.php.dist):
 */
class managesieve extends rcube_plugin
@@ -72,6 +46,8 @@
  {
    $rcmail = rcmail::get_instance();
    $this->rc = &$rcmail;
    $this->load_config();
    // register UI objects
    $this->rc->output->add_handlers(array(
@@ -308,7 +284,7 @@
      $this->errors['tests'][$i]['sizetarget'] = $this->gettext('wrongformat');
         break;
       case '...':
              $cust_header = $this->strip_value($cust_headers[$idx]);
              $cust_header = $headers = $this->strip_value($cust_headers[$idx]);
              if(preg_match('/^not/', $op))
      $this->form['tests'][$i]['not'] = true;
@@ -316,10 +292,22 @@
              if ($cust_header == '')
          $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
              elseif (!preg_match('/^[a-z0-9-]+$/i', $cust_header))
          $this->errors['tests'][$i]['header'] = $this->gettext('forbiddenchars');
              if ($type == 'exists')
              else {
           $headers = preg_split('/[\s,]+/', $cust_header, -1, PREG_SPLIT_NO_EMPTY);
      if (!count($headers))
            $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
      else {
        foreach ($headers as $hr)
          if (!preg_match('/^[a-z0-9-]+$/i', $hr))
                $this->errors['tests'][$i]['header'] = $this->gettext('forbiddenchars');
      }
         }
         if (empty($this->errors['tests'][$i]['header']))
      $cust_header = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers;
         if ($type == 'exists')
             {
      $this->form['tests'][$i]['test'] = 'exists';
          $this->form['tests'][$i]['arg'] = $cust_header;
@@ -599,9 +587,11 @@
    // TODO: list arguments
    if ((isset($rule['test']) && $rule['test'] == 'header') && in_array($rule['arg1'], $this->headers))
    if ((isset($rule['test']) && $rule['test'] == 'header')
   && !is_array($rule['arg1']) && in_array($rule['arg1'], $this->headers))
      $out .= $select_header->show($rule['arg1']);
    elseif ((isset($rule['test']) && $rule['test'] == 'exists') && in_array($rule['arg'], $this->headers))
    elseif ((isset($rule['test']) && $rule['test'] == 'exists')
   && !is_array($rule['arg']) && in_array($rule['arg'], $this->headers))
      $out .= $select_header->show($rule['arg']);
    elseif (isset($rule['test']) && $rule['test'] == 'size')
      $out .= $select_header->show('size');
@@ -612,10 +602,12 @@
    $out .= '</td><td class="rowtargets">';
    if ((isset($rule['test']) && $rule['test'] == 'header') && !in_array($rule['arg1'], $this->headers))
      $custom = $rule['arg1'];
    elseif ((isset($rule['test']) && $rule['test'] == 'exists') && !in_array($rule['arg'], $this->headers))
      $custom = $rule['arg'];
    if ((isset($rule['test']) && $rule['test'] == 'header')
   && (is_array($rule['arg1']) || !in_array($rule['arg1'], $this->headers)))
      $custom = is_array($rule['arg1']) ? implode(', ', $rule['arg1']) : $rule['arg1'];
    elseif ((isset($rule['test']) && $rule['test'] == 'exists')
   && (is_array($rule['arg']) || !in_array($rule['arg'], $this->headers)))
      $custom = is_array($rule['arg']) ? implode(', ', $rule['arg']) : $rule['arg'];
    
    $out .= '<div id="custom_header' .$id. '" style="display:' .(isset($custom) ? 'inline' : 'none'). '">
   <input type="text" name="_custom_header[]" '. $this->error_class($id, 'test', 'header')
@@ -752,6 +744,9 @@
    $a_folders = $this->rc->imap->list_mailboxes();
    $delimiter = $this->rc->imap->get_hierarchy_delimiter();
    // set mbox encoding
    $mbox_encoding = $this->rc->config->get('managesieve_mbox_encoding', 'UTF7-IMAP');
    if ($action['type'] == 'fileinto')
      $mailbox = $action['target'];
    else
@@ -759,12 +754,15 @@
    foreach ($a_folders as $folder)
    {
      $utf7folder = $folder;
      $utf7folder = $this->rc->imap->mod_mailbox($folder);
      $names = explode($delimiter, rcube_charset_convert($folder, 'UTF7-IMAP'));
      $name = $names[sizeof($names)-1];
    
      if ($replace_delimiter = $this->rc->config->get('managesieve_replace_delimiter'))
        $utf7folder = str_replace($delimiter, $replace_delimiter, $utf7folder);
      // convert to Sieve implementation encoding
      $utf7folder = $this->mbox_encode($utf7folder, $mbox_encoding);
    
      if ($folder_class = rcmail_folder_classname($name))
        $foldername = $this->gettext($folder_class);
@@ -857,6 +855,10 @@
    return false;
  }
 
  private function mbox_encode($text, $encoding)
  {
    return rcube_charset_convert($text, 'UTF7-IMAP', $encoding);
  }
}
?>