From 0185a2790767caab93f2c504ad38d7edca70d043 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 15 Jun 2013 15:35:55 +0200 Subject: Implemented date, currentdate and index - RFC5260 (#1488120) --- plugins/managesieve/managesieve.php | 247 ++++++++++++++++++++++++++++++------ 1 file changed, 206 insertions(+), 41 deletions(-) (limited to 'plugins/managesieve/managesieve.php') diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php index 0dfe05a6f..d514c28d5 100644 --- a/plugins/managesieve/managesieve.php +++ b/plugins/managesieve/managesieve.php @@ -12,8 +12,8 @@ * * Configuration (see config.inc.php.dist) * - * Copyright (C) 2008-2012, The Roundcube Dev Team - * Copyright (C) 2011-2012, Kolab Systems AG + * Copyright (C) 2008-2013, The Roundcube Dev Team + * Copyright (C) 2011-2013, Kolab Systems AG * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -662,6 +662,10 @@ class managesieve extends rcube_plugin $body_trans = rcube_utils::get_input_value('_rule_trans', rcube_utils::INPUT_POST); $body_types = rcube_utils::get_input_value('_rule_trans_type', rcube_utils::INPUT_POST, true); $comparators = rcube_utils::get_input_value('_rule_comp', rcube_utils::INPUT_POST); + $indexes = rcube_utils::get_input_value('_rule_index', rcube_utils::INPUT_POST); + $lastindexes = rcube_utils::get_input_value('_rule_index_last', rcube_utils::INPUT_POST); + $dateheaders = rcube_utils::get_input_value('_rule_date_header', rcube_utils::INPUT_POST); + $dateparts = rcube_utils::get_input_value('_rule_date_part', rcube_utils::INPUT_POST); $act_types = rcube_utils::get_input_value('_action_type', rcube_utils::INPUT_POST, true); $mailboxes = rcube_utils::get_input_value('_action_mailbox', rcube_utils::INPUT_POST, true); $act_targets = rcube_utils::get_input_value('_action_target', rcube_utils::INPUT_POST, true); @@ -732,6 +736,82 @@ class managesieve extends rcube_plugin else $this->form['tests'][$i]['arg'] .= $m[1]; } + else if ($header == 'currentdate') { + $datepart = $this->strip_value($dateparts[$idx]); + + if (preg_match('/^not/', $operator)) + $this->form['tests'][$i]['not'] = true; + $type = preg_replace('/^not/', '', $operator); + + if ($type == 'exists') { + $this->errors['tests'][$i]['op'] = true; + } + + $this->form['tests'][$i]['test'] = 'currentdate'; + $this->form['tests'][$i]['type'] = $type; + $this->form['tests'][$i]['part'] = $datepart; + $this->form['tests'][$i]['arg'] = $target; + + if ($type != 'exists') { + if (!count($target)) { + $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty'); + } + else if ($type != 'regex' && $type != 'matches') { + foreach ($target as $arg) { + if (!$this->validate_date_part($datepart, $arg)) { + $this->errors['tests'][$i]['target'] = $this->gettext('invaliddateformat'); + break; + } + } + } + } + } + else if ($header == 'date') { + $datepart = $this->strip_value($dateparts[$idx]); + $dateheader = $this->strip_value($dateheaders[$idx]); + $index = $this->strip_value($indexes[$idx]); + $indexlast = $this->strip_value($lastindexes[$idx]); + + if (preg_match('/^not/', $operator)) + $this->form['tests'][$i]['not'] = true; + $type = preg_replace('/^not/', '', $operator); + + if ($type == 'exists') { + $this->errors['tests'][$i]['op'] = true; + } + + if (!empty($index) && $mod != 'envelope') { + $this->form['tests'][$i]['index'] = intval($index); + $this->form['tests'][$i]['last'] = !empty($indexlast); + } + + if (empty($dateheader)) { + $dateheader = 'Date'; + } + else if (!preg_match('/^[\x21-\x39\x41-\x7E]+$/i', $dateheader)) { + $this->errors['tests'][$i]['dateheader'] = $this->gettext('forbiddenchars'); + } + + $this->form['tests'][$i]['test'] = 'date'; + $this->form['tests'][$i]['type'] = $type; + $this->form['tests'][$i]['part'] = $datepart; + $this->form['tests'][$i]['arg'] = $target; + $this->form['tests'][$i]['header'] = $dateheader; + + if ($type != 'exists') { + if (!count($target)) { + $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty'); + } + else if ($type != 'regex' && $type != 'matches') { + foreach ($target as $arg) { + if (!$this->validate_date_part($datepart, $arg)) { + $this->errors['tests'][$i]['target'] = $this->gettext('invaliddateformat'); + break; + } + } + } + } + } else if ($header == 'body') { $trans = $this->strip_value($body_trans[$idx]); $trans_type = $this->strip_value($body_types[$idx], true); @@ -766,13 +846,20 @@ class managesieve extends rcube_plugin } else { $cust_header = $headers = $this->strip_value(array_shift($cust_headers)); - $mod = $this->strip_value($mods[$idx]); - $mod_type = $this->strip_value($mod_types[$idx]); + $mod = $this->strip_value($mods[$idx]); + $mod_type = $this->strip_value($mod_types[$idx]); + $index = $this->strip_value($indexes[$idx]); + $indexlast = $this->strip_value($lastindexes[$idx]); if (preg_match('/^not/', $operator)) $this->form['tests'][$i]['not'] = true; $type = preg_replace('/^not/', '', $operator); + if (!empty($index) && $mod != 'envelope') { + $this->form['tests'][$i]['index'] = intval($index); + $this->form['tests'][$i]['last'] = !empty($indexlast); + } + if ($header == '...') { if (!count($headers)) $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty'); @@ -1304,35 +1391,40 @@ class managesieve extends rcube_plugin // headers select $select_header = new html_select(array('name' => "_header[]", 'id' => 'header'.$id, 'onchange' => 'rule_header_select(' .$id .')')); - foreach($this->headers as $name => $val) + + foreach ($this->headers as $name => $val) $select_header->add(rcube::Q($this->gettext($name)), Q($val)); + $select_header->add(rcube::Q($this->gettext('...')), '...'); if (in_array('body', $this->exts)) $select_header->add(rcube::Q($this->gettext('body')), 'body'); $select_header->add(rcube::Q($this->gettext('size')), 'size'); - $select_header->add(rcube::Q($this->gettext('...')), '...'); - - // TODO: list arguments - $aout = ''; + if (in_array('date', $this->exts)) { + $select_header->add(rcube::Q($this->gettext('datetest')), 'date'); + $select_header->add(rcube::Q($this->gettext('currdate')), 'currentdate'); + } - if ((isset($rule['test']) && in_array($rule['test'], array('header', 'address', 'envelope'))) - && !is_array($rule['arg1']) && in_array($rule['arg1'], $this->headers) - ) { - $aout .= $select_header->show($rule['arg1']); + if (isset($rule['test'])) { + if (in_array($rule['test'], array('header', 'address', 'envelope')) + && !is_array($rule['arg1']) && in_array($rule['arg1'], $this->headers) + ) { + $test = $rule['arg1']; + } + else if ($rule['test'] == 'exists' + && !is_array($rule['arg']) && in_array($rule['arg'], $this->headers) + ) { + $test = $rule['arg']; + } + else if (in_array($rule['test'], array('size', 'body', 'date', 'currentdate'))) { + $test = $rule['test']; + } + else if ($rule['test'] != 'true') { + $test = '...'; + } } - else if ((isset($rule['test']) && $rule['test'] == 'exists') - && !is_array($rule['arg']) && in_array($rule['arg'], $this->headers) - ) { - $aout .= $select_header->show($rule['arg']); - } - else if (isset($rule['test']) && $rule['test'] == 'size') - $aout .= $select_header->show('size'); - else if (isset($rule['test']) && $rule['test'] == 'body') - $aout .= $select_header->show('body'); - else if (isset($rule['test']) && $rule['test'] != 'true') - $aout .= $select_header->show('...'); - else - $aout .= $select_header->show(); + $aout = $select_header->show($test); + + // custom headers input if (isset($rule['test']) && in_array($rule['test'], array('header', 'address', 'envelope'))) { $custom = (array) $rule['arg1']; if (count($custom) == 1 && isset($this->headers[strtolower($custom[0])])) { @@ -1381,13 +1473,28 @@ class managesieve extends rcube_plugin $select_op->add(rcube::Q($this->gettext('valuenotequals')), 'value-ne'); } - // target input (TODO: lists) + // (current)date part select + if (in_array('date', $this->exts) || in_array('currentdate', $this->exts)) { + $date_parts = array('date', 'iso8601', 'std11', 'julian', 'time', + 'year', 'month', 'day', 'hour', 'minute', 'second', 'weekday', 'zone'); + $select_dp = new html_select(array('name' => "_rule_date_part[]", 'id' => 'rule_date_part'.$id, + 'style' => $rule['test'] == 'currentdate' || $rule['test'] == 'date' ? '' : 'display:none', + 'class' => 'datepart_selector', + )); + + foreach ($date_parts as $part) { + $select_dp->add(rcube::Q($this->gettext($part)), $part); + } + + $tout .= $select_dp->show($rule['test'] == 'currentdate' || $rule['test'] == 'date' ? $rule['part'] : ''); + } + // target(s) input if (in_array($rule['test'], array('header', 'address', 'envelope'))) { $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is'); $target = $rule['arg2']; } - else if ($rule['test'] == 'body') { + else if (in_array($rule['test'], array('body', 'date', 'currentdate'))) { $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is'); $target = $rule['arg']; } @@ -1449,11 +1556,9 @@ class managesieve extends rcube_plugin } $need_mod = $rule['test'] != 'size' && $rule['test'] != 'body'; - $mout = '
'; - $mout .= ' '; - $mout .= rcube::Q($this->gettext('modifier')) . ' '; + $mout = '