Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/roundcube/roundcubemail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2017-11-27 21:12:18 +0300
committerAleksander Machniak <alec@alec.pl>2017-11-27 21:12:18 +0300
commit550e2fc6aab6d2d0e5dce8ed4d1c8e5c93d164a6 (patch)
treee18f2a57bf1be0f4274f5a4c1b621e5169db9530 /plugins
parent7c6bbd81b0aa7eb4b26fd836567c84b8c108bcb2 (diff)
Support 'mime' extension tests - RFC5703 (#5832)
Diffstat (limited to 'plugins')
-rw-r--r--plugins/managesieve/Changelog1
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php93
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_script.php2
-rw-r--r--plugins/managesieve/localization/en_US.inc8
-rw-r--r--plugins/managesieve/managesieve.js23
5 files changed, 105 insertions, 22 deletions
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog
index 398f9d167..8d00f5355 100644
--- a/plugins/managesieve/Changelog
+++ b/plugins/managesieve/Changelog
@@ -1,6 +1,7 @@
- Added option managesieve_default_headers
- Added option managesieve_forward to enable settings dialog for simple forwarding (#6021)
- Support filter action with custom IMAP flags (#6011)
+- Support 'mime' extension tests - RFC5703 (#5832)
* version 9.0 [2017-10-02]
-----------------------------------------------------------
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
index b17dba8f6..c34e7a63c 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
@@ -660,6 +660,9 @@ 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);
+ $mime_parts = rcube_utils::get_input_value('_rule_mime_part', rcube_utils::INPUT_POST);
+ $mime_types = rcube_utils::get_input_value('_rule_mime_type', rcube_utils::INPUT_POST);
+ $mime_params = rcube_utils::get_input_value('_rule_mime_param', rcube_utils::INPUT_POST, true);
$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);
@@ -789,8 +792,10 @@ class rcube_sieve_engine
$index = $this->strip_value($indexes[$idx]);
$indexlast = $this->strip_value($lastindexes[$idx]);
- if (preg_match('/^not/', $operator))
+ if (preg_match('/^not/', $operator)) {
$this->form['tests'][$i]['not'] = true;
+ }
+
$type = preg_replace('/^not/', '', $operator);
if ($type == 'exists') {
@@ -909,6 +914,9 @@ class rcube_sieve_engine
$mod_type = $this->strip_value($mod_types[$idx]);
$index = $this->strip_value($indexes[$idx]);
$indexlast = $this->strip_value($lastindexes[$idx]);
+ $mime_param = $this->strip_value($mime_params[$idx]);
+ $mime_type = $mime_types[$idx];
+ $mime_part = $mime_parts[$idx];
if ($header == 'string') {
$cust_var = $headers = $this->strip_value(array_shift($cust_vars));
@@ -988,6 +996,23 @@ class rcube_sieve_engine
$this->form['tests'][$i]['part'] = $mod_type;
}
}
+
+ if ($test == 'header') {
+ if (in_array($mime_type, array('type', 'subtype', 'contenttype', 'param'))) {
+ $this->form['tests'][$i]['mime-' . $mime_type] = true;
+ if ($mime_type == 'param') {
+ if (empty($mime_param)) {
+ $this->errors['tests'][$i]['mime-param'] = $this->plugin->gettext('cannotbeempty');
+ }
+
+ $this->form['tests'][$i]['mime-param'] = $mime_param;
+ }
+ }
+
+ if ($mime_part == 'anychild') {
+ $this->form['tests'][$i]['mime-anychild'] = true;
+ }
+ }
}
if ($header != 'size' && $comparator) {
@@ -1819,6 +1844,53 @@ class rcube_sieve_engine
$mout .= $select_type->show($rule['part']);
$mout .= '</div>';
+ // Advanced modifiers (comparators)
+ $select_comp = new html_select(array('name' => "_rule_comp[]", 'id' => 'rule_comp_op'.$id));
+ $select_comp->add(rcube::Q($this->plugin->gettext('default')), '');
+ $select_comp->add(rcube::Q($this->plugin->gettext('octet')), 'i;octet');
+ $select_comp->add(rcube::Q($this->plugin->gettext('asciicasemap')), 'i;ascii-casemap');
+ if (in_array('comparator-i;ascii-numeric', $this->exts)) {
+ $select_comp->add(rcube::Q($this->plugin->gettext('asciinumeric')), 'i;ascii-numeric');
+ }
+
+ $need_comp = $rule['test'] != 'size' && $rule['test'] != 'duplicate';
+ $mout .= '<div id="rule_comp' .$id. '" class="adv input-group"' . (!$need_comp ? ' style="display:none"' : '') . '>';
+ $mout .= '<span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('comparator')) . '</span>';
+ $mout .= $select_comp->show($rule['comparator']);
+ $mout .= '</div>';
+
+ // Advanced modifiers (mime)
+ if (in_array('mime', $this->exts)) {
+ $need_mime = !$rule || in_array($rule['test'], array('header', 'address', 'exists'));
+ $mime_type = '';
+ $select_mime = new html_select(array('name' => '_rule_mime_type[]', 'id' => 'rule_mime_type' . $id,
+ 'style' => 'min-width:8em', 'onchange' => 'rule_mime_select(' . $id . ')'));
+ $select_mime->add('', '');
+
+ foreach (array('contenttype', 'type', 'subtype', 'param') as $val) {
+ if (isset($rule['mime-' . $val])) {
+ $mime_type = $val;
+ }
+
+ $select_mime->add(rcube::Q($this->plugin->gettext('mime-' . $val)), $val);
+ }
+
+ $select_mime_part = new html_select(array('name' => '_rule_mime_part[]', 'id' => 'rule_mime_part' . $id));
+ $select_mime_part->add(rcube::Q($this->plugin->gettext('mime-message')), '');
+ $select_mime_part->add(rcube::Q($this->plugin->gettext('mime-anychild')), 'anychild');
+
+ $mout .= '<div id="rule_mime_part' .$id. '" class="adv input-group"' . (!$need_mime ? ' style="display:none"' : '') . '>';
+ $mout .= ' <span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('mimepart')) . ' </span>';
+ $mout .= $select_mime_part->show(!empty($rule['mime-anychild']) ? 'anychild' : '');
+ $mout .= '</div>';
+ $mout .= '<div id="rule_mime' .$id. '" class="adv input-group"' . (!$need_mime ? ' style="display:none"' : '') . '>';
+ $mout .= ' <span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('mime')) . ' </span>';
+ $mout .= $select_mime->show($mime_type);
+ $mout .= $this->list_input($id, 'rule_mime_param', $rule['mime-param'], true,
+ $this->error_class($id, 'test', 'mime_param', 'rule_mime_param'), 30, $mime_type != 'param');
+ $mout .= '</div>';
+ }
+
// Advanced modifiers (body transformations)
$select_mod = new html_select(array('name' => "_rule_trans[]", 'id' => 'rule_trans_op'.$id,
'onchange' => 'rule_trans_select(' .$id .')'));
@@ -1840,22 +1912,6 @@ class rcube_sieve_engine
));
$mout .= '</div>';
- // Advanced modifiers (body transformations)
- $select_comp = new html_select(array('name' => "_rule_comp[]", 'id' => 'rule_comp_op'.$id));
- $select_comp->add(rcube::Q($this->plugin->gettext('default')), '');
- $select_comp->add(rcube::Q($this->plugin->gettext('octet')), 'i;octet');
- $select_comp->add(rcube::Q($this->plugin->gettext('asciicasemap')), 'i;ascii-casemap');
- if (in_array('comparator-i;ascii-numeric', $this->exts)) {
- $select_comp->add(rcube::Q($this->plugin->gettext('asciinumeric')), 'i;ascii-numeric');
- }
-
- // Comparators
- $need_comp = $rule['test'] != 'size' && $rule['test'] != 'duplicate';
- $mout .= '<div id="rule_comp' .$id. '" class="adv input-group"' . (!$need_comp ? ' style="display:none"' : '') . '>';
- $mout .= '<span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('comparator')) . '</span>';
- $mout .= $select_comp->show($rule['comparator']);
- $mout .= '</div>';
-
// Date header
if (in_array('date', $this->exts)) {
$mout .= '<div id="rule_date_header_div' .$id. '" class="adv input-group"'. ($rule['test'] != 'date' ? ' style="display:none"' : '') .'>';
@@ -2424,7 +2480,7 @@ class rcube_sieve_engine
$this->rc->output->add_script($script, 'foot');
}
- protected function list_input($id, $name, $value, $enabled, $class, $size=null)
+ protected function list_input($id, $name, $value, $enabled, $class, $size = null, $hidden = false)
{
$value = (array) $value;
$value = array_map(array('rcube', 'Q'), $value);
@@ -2433,6 +2489,7 @@ class rcube_sieve_engine
return html::tag('textarea', array(
'data-type' => 'list',
'data-size' => $size,
+ 'data-hidden' => $hidden ?: null,
'name' => '_' . $name . '['. $id .']',
'id' => $name.$id,
'disabled' => !$enabled,
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
index e026f3e5f..366d24eb1 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
@@ -39,7 +39,7 @@ class rcube_sieve_script
'imap4flags', // RFC5232
'include', // RFC6609
'index', // RFC5260
- 'mime', // RFC5703 (except: foreverypart, break, enclose, extracttext)
+ 'mime', // RFC5703 (except: foreverypart/break, enclose, extracttext)
'notify', // RFC5435
'regex', // draft-ietf-sieve-regex-01
'reject', // RFC5429
diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc
index 3c5758dc4..1a31c44db 100644
--- a/plugins/managesieve/localization/en_US.inc
+++ b/plugins/managesieve/localization/en_US.inc
@@ -43,6 +43,14 @@ $labels['filterregex'] = 'matches regular expression';
$labels['filternotregex'] = 'not matches regular expression';
$labels['filterunder'] = 'under';
$labels['filterover'] = 'over';
+$labels['mime'] = 'MIME:';
+$labels['mimepart'] = 'MIME part:';
+$labels['mime-message'] = 'message';
+$labels['mime-anychild'] = 'any';
+$labels['mime-type'] = 'type';
+$labels['mime-subtype'] = 'subtype';
+$labels['mime-contenttype'] = 'content-type';
+$labels['mime-param'] = 'parameter';
$labels['addrule'] = 'Add rule';
$labels['delrule'] = 'Delete rule';
$labels['messagemoveto'] = 'Move message to';
diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js
index a9872a27d..45a7894ad 100644
--- a/plugins/managesieve/managesieve.js
+++ b/plugins/managesieve/managesieve.js
@@ -625,7 +625,8 @@ rcube_webmail.prototype.managesieve_vacation_addresses_update = function(id, add
function rule_header_select(id)
{
- var obj = document.getElementById('header' + id),
+ var is_header,
+ obj = document.getElementById('header' + id),
size = document.getElementById('rule_size' + id),
msg = document.getElementById('rule_message' + id),
op = document.getElementById('rule_op' + id),
@@ -634,11 +635,13 @@ function rule_header_select(id)
mod = document.getElementById('rule_mod' + id),
trans = document.getElementById('rule_trans' + id),
comp = document.getElementById('rule_comp' + id),
+ mime = document.getElementById('rule_mime' + id),
+ mime_part = document.getElementById('rule_mime_part' + id),
datepart = document.getElementById('rule_date_part' + id),
dateheader = document.getElementById('rule_date_header_div' + id),
rule = $('#rule_op' + id),
h = obj.value,
- set = [op, header, custstr, mod, trans, comp, size];
+ set = [op, header, custstr, mod, trans, comp, size, mime, mime_part];
if (h == 'size') {
if (msg) set.push(msg);
@@ -650,12 +653,15 @@ function rule_header_select(id)
msg.style.display = '';
}
else {
+ is_header = h != 'body' && h != 'currentdate' && h != 'date' && h != 'string';
header.style.display = h != '...' ? 'none' : '';
custstr.style.display = h != 'string' ? 'none' : '';
size.style.display = 'none';
op.style.display = '';
comp.style.display = '';
- mod.style.display = h == 'body' || h == 'currentdate' || h == 'date' || h == 'string' ? 'none' : '';
+ mime.style.display = is_header ? '' : 'none';
+ mime_part.style.display = is_header ? '' : 'none';
+ mod.style.display = is_header ? '' : 'none';
trans.style.display = h == 'body' ? '' : 'none';
if (msg)
msg.style.display = h == 'message' ? '' : 'none';
@@ -672,6 +678,7 @@ function rule_header_select(id)
rule_op_select(op, id, h);
rule_mod_select(id, h);
+ rule_mime_select(id);
obj.style.width = h == '...' ? '40px' : '';
};
@@ -732,6 +739,13 @@ function rule_adv_switch(id, elem)
}
};
+function rule_mime_select(id)
+{
+ var elem = $('#rule_mime_type' + id);
+
+ elem.parent().find('.listarea')[0].style.display = elem.val() == 'param' ? '' : 'none';
+};
+
function action_type_select(id)
{
var obj = document.getElementById('action_type' + id),
@@ -811,6 +825,9 @@ function smart_field_init(field)
else
field.prop('disabled', true);
+ if (field.data('hidden'))
+ area.hide();
+
field.after(area);
if (field.hasClass('error')) {