diff --git a/CHANGELOG b/CHANGELOG index baa9d68e7..9635bcd9d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,9 @@ CHANGELOG Roundcube Webmail - Implemented message/rfc822 attachment preview - Update to jsTimezoneDetect 1.0.6 +- Managesieve: Support 'duplicate' extension [RFC 7352] +- Managesieve: Unhide advanced rule controls if there are inputs with errors +- Managesieve: Display warning message when filter form contains errors - Enigma: Added enigma_debug option - Fix message list multi-select/deselect issue (#5219) - Fix bug where getting HTML editor content could steal focus from other form controls (#5223) diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index be396113d..3b42e271c 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,3 +1,9 @@ +* version 8.7 [2016-] +----------------------------------------------------------- +- Support 'duplicate' extension [RFC 7352] +- Unhide advanced rule controls if there are inputs with errors +- Display warning message when filter form contains errors + * version 8.6 [2016-04-06] ----------------------------------------------------------- - Refactored script parser to be 100x faster diff --git a/plugins/managesieve/composer.json b/plugins/managesieve/composer.json index b1fd1b5c1..afdda5175 100644 --- a/plugins/managesieve/composer.json +++ b/plugins/managesieve/composer.json @@ -3,7 +3,7 @@ "type": "roundcube-plugin", "description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.", "license": "GPLv3+", - "version": "8.6", + "version": "8.7", "authors": [ { "name": "Aleksander Machniak", diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php index b013351af..3bb5eacc5 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php @@ -63,7 +63,7 @@ class rcube_sieve_engine 1 => 'notifyimportancehigh' ); - const VERSION = '8.6'; + const VERSION = '8.7'; const PROGNAME = 'Roundcube (Managesieve)'; const PORT = 4190; @@ -609,6 +609,12 @@ class rcube_sieve_engine $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); + $message = rcube_utils::get_input_value('_rule_message', rcube_utils::INPUT_POST); + $dup_handles = rcube_utils::get_input_value('_rule_duplicate_handle', rcube_utils::INPUT_POST, true); + $dup_headers = rcube_utils::get_input_value('_rule_duplicate_header', rcube_utils::INPUT_POST, true); + $dup_uniqueids = rcube_utils::get_input_value('_rule_duplicate_uniqueid', rcube_utils::INPUT_POST, true); + $dup_seconds = rcube_utils::get_input_value('_rule_duplicate_seconds', rcube_utils::INPUT_POST); + $dup_lasts = rcube_utils::get_input_value('_rule_duplicate_last', 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); @@ -818,6 +824,34 @@ class rcube_sieve_engine $this->form['tests'][$i]['content'] = $trans_type; } } + else if ($header == 'message') { + $test = $this->strip_value($message[$idx]); + + if (preg_match('/^not/', $test)) { + $this->form['tests'][$i]['not'] = true; + $test = substr($test, 3); + } + + $this->form['tests'][$i]['test'] = $test; + + if ($test == 'duplicate') { + $this->form['tests'][$i]['last'] = !empty($dup_lasts[$idx]); + $this->form['tests'][$i]['handle'] = trim($dup_handles[$idx]); + $this->form['tests'][$i]['header'] = trim($dup_headers[$idx]); + $this->form['tests'][$i]['uniqueid'] = trim($dup_uniqueids[$idx]); + $this->form['tests'][$i]['seconds'] = trim($dup_seconds[$idx]); + + if ($this->form['tests'][$i]['seconds'] + && preg_match('/[^0-9]/', $this->form['tests'][$i]['seconds']) + ) { + $this->errors['tests'][$i]['duplicate_seconds'] = $this->plugin->gettext('forbiddenchars'); + } + + if ($this->form['tests'][$i]['header'] && $this->form['tests'][$i]['uniqueid']) { + $this->errors['tests'][$i]['duplicate_uniqueid'] = $this->plugin->gettext('duplicate.conflict.err'); + } + } + } else { $cust_header = $headers = $this->strip_value(array_shift($cust_headers)); $mod = $this->strip_value($mods[$idx]); @@ -1095,6 +1129,9 @@ class rcube_sieve_engine // $this->rc->output->send(); } } + else { + $this->rc->output->show_message('managesieve.filterformerror', 'warning'); + } } $this->send(); @@ -1406,13 +1443,17 @@ class rcube_sieve_engine $select_header->add($header, $index); } $select_header->add($this->plugin->gettext('...'), '...'); - if (in_array('body', $this->exts)) + if (in_array('body', $this->exts)) { $select_header->add($this->plugin->gettext('body'), 'body'); + } $select_header->add($this->plugin->gettext('size'), 'size'); if (in_array('date', $this->exts)) { $select_header->add($this->plugin->gettext('datetest'), 'date'); $select_header->add($this->plugin->gettext('currdate'), 'currentdate'); } + if (in_array('duplicate', $this->exts)) { + $select_header->add($this->plugin->gettext('message'), 'message'); + } if (isset($rule['test'])) { if (in_array($rule['test'], array('header', 'address', 'envelope'))) { @@ -1434,6 +1475,9 @@ class rcube_sieve_engine else if (in_array($rule['test'], array('size', 'body', 'date', 'currentdate'))) { $test = $rule['test']; } + else if (in_array($rule['test'], array('duplicate'))) { + $test = 'message'; + } else if ($rule['test'] != 'true') { $test = '...'; } @@ -1460,7 +1504,7 @@ class rcube_sieve_engine // matching type select (operator) $select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id, - 'style' => 'display:' .($rule['test']!='size' ? 'inline' : 'none'), + 'style' => 'display:' .(!in_array($rule['test'], array('size', 'duplicate')) ? 'inline' : 'none'), 'class' => 'operator_selector', 'onchange' => 'rule_op_select(this, '.$id.')')); $select_op->add(rcube::Q($this->plugin->gettext('filtercontains')), 'contains'); @@ -1527,9 +1571,22 @@ class rcube_sieve_engine $tout .= $select_dp->show($rule['test'] == 'currentdate' || $rule['test'] == 'date' ? $rule['part'] : ''); } + // message test select (e.g. duplicate) + if (in_array('duplicate', $this->exts)) { + $select_msg = new html_select(array('name' => "_rule_message[]", 'id' => 'rule_message'.$id, + 'style' => in_array($rule['test'], array('duplicate')) ? '' : 'display:none', + 'class' => 'message_selector', + )); + + $select_msg->add(rcube::Q($this->plugin->gettext('duplicate')), 'duplicate'); + $select_msg->add(rcube::Q($this->plugin->gettext('notduplicate')), 'notduplicate'); + + $tout .= $select_msg->show($test); + } + $tout .= $select_op->show($test); $tout .= $this->list_input($id, 'rule_target', $target, - $rule['test'] != 'size' && $rule['test'] != 'exists', + $rule['test'] != 'size' && $rule['test'] != 'exists' && $rule['test'] != 'duplicate', $this->error_class($id, 'test', 'target', 'rule_target')) . "\n"; $select_size_op = new html_select(array('name' => "_rule_size_op[]", 'id' => 'rule_size_op'.$id)); @@ -1555,8 +1612,9 @@ class rcube_sieve_engine 'onchange' => 'rule_mod_select(' .$id .')')); $select_mod->add(rcube::Q($this->plugin->gettext('none')), ''); $select_mod->add(rcube::Q($this->plugin->gettext('address')), 'address'); - if (in_array('envelope', $this->exts)) + if (in_array('envelope', $this->exts)) { $select_mod->add(rcube::Q($this->plugin->gettext('envelope')), 'envelope'); + } $select_type = new html_select(array('name' => "_rule_mod_type[]", 'id' => 'rule_mod_type'.$id)); $select_type->add(rcube::Q($this->plugin->gettext('allparts')), 'all'); @@ -1567,7 +1625,7 @@ class rcube_sieve_engine $select_type->add(rcube::Q($this->plugin->gettext('detail')), 'detail'); } - $need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate')); + $need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'duplicate')); $mout = '