diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
index 3bb5eacc50d..8269ed4f62b 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
@@ -595,6 +595,7 @@ function save()
// and arrays
$headers = rcube_utils::get_input_value('_header', rcube_utils::INPUT_POST);
$cust_headers = rcube_utils::get_input_value('_custom_header', rcube_utils::INPUT_POST);
+ $cust_vars = rcube_utils::get_input_value('_custom_var', rcube_utils::INPUT_POST);
$ops = rcube_utils::get_input_value('_rule_op', rcube_utils::INPUT_POST);
$sizeops = rcube_utils::get_input_value('_rule_size_op', rcube_utils::INPUT_POST);
$sizeitems = rcube_utils::get_input_value('_rule_size_item', rcube_utils::INPUT_POST);
@@ -859,6 +860,10 @@ function save()
$index = $this->strip_value($indexes[$idx]);
$indexlast = $this->strip_value($lastindexes[$idx]);
+ if ($header == 'string') {
+ $cust_var = $headers = $this->strip_value(array_shift($cust_vars));
+ }
+
if (preg_match('/^not/', $operator))
$this->form['tests'][$i]['not'] = true;
$type = preg_replace('/^not/', '', $operator);
@@ -868,10 +873,10 @@ function save()
$this->form['tests'][$i]['last'] = !empty($indexlast);
}
- if ($header == '...') {
+ if ($header == '...' || $header == 'string') {
if (!count($headers))
$this->errors['tests'][$i]['header'] = $this->plugin->gettext('cannotbeempty');
- else {
+ else if ($header == '...') {
foreach ($headers as $hr) {
// RFC2822: printable ASCII except colon
if (!preg_match('/^[\x21-\x39\x41-\x7E]+$/i', $hr)) {
@@ -881,9 +886,11 @@ function save()
}
if (empty($this->errors['tests'][$i]['header']))
- $cust_header = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers;
+ $cust_header = $cust_var = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers;
}
+ $test = $header == 'string' ? 'string' : 'header';
+ $header = $header == 'string' ? $cust_var : $header;
$header = $header == '...' ? $cust_header : $header;
if (is_array($header)) {
@@ -899,8 +906,6 @@ function save()
$this->form['tests'][$i]['arg'] = $header;
}
else {
- $test = 'header';
-
if ($mod == 'address' || $mod == 'envelope') {
$found = false;
if (empty($this->errors['tests'][$i]['header'])) {
@@ -1446,6 +1451,9 @@ function rule_div($fid, $id, $div=true)
if (in_array('body', $this->exts)) {
$select_header->add($this->plugin->gettext('body'), 'body');
}
+ if (in_array('variables', $this->exts)) {
+ $select_header->add($this->plugin->gettext('string'), 'string');
+ }
$select_header->add($this->plugin->gettext('size'), 'size');
if (in_array('date', $this->exts)) {
$select_header->add($this->plugin->gettext('datetest'), 'date');
@@ -1472,7 +1480,7 @@ function rule_div($fid, $id, $div=true)
$matches = ($header = strtolower($rule['arg'])) && isset($this->headers[$header]);
$test = $matches ? $header : '...';
}
- else if (in_array($rule['test'], array('size', 'body', 'date', 'currentdate'))) {
+ else if (in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'string'))) {
$test = $rule['test'];
}
else if (in_array($rule['test'], array('duplicate'))) {
@@ -1492,6 +1500,12 @@ function rule_div($fid, $id, $div=true)
unset($custom);
}
}
+ else if (isset($rule['test']) && $rule['test'] == 'string') {
+ $customv = (array) $rule['arg1'];
+ if (count($customv) == 1 && isset($this->headers[strtolower($customv[0])])) {
+ unset($customv);
+ }
+ }
else if (isset($rule['test']) && $rule['test'] == 'exists') {
$custom = (array) $rule['arg'];
if (count($custom) == 1 && isset($this->headers[strtolower($custom[0])])) {
@@ -1499,9 +1513,13 @@ function rule_div($fid, $id, $div=true)
}
}
+ // custom variable input
$tout = $this->list_input($id, 'custom_header', $custom, isset($custom),
$this->error_class($id, 'test', 'header', 'custom_header'), 15) . "\n";
+ $tout .= $this->list_input($id, 'custom_var', $customv, isset($customv),
+ $this->error_class($id, 'test', 'header', 'custom_var'), 15) . "\n";
+
// matching type select (operator)
$select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id,
'style' => 'display:' .(!in_array($rule['test'], array('size', 'duplicate')) ? 'inline' : 'none'),
@@ -1538,7 +1556,7 @@ function rule_div($fid, $id, $div=true)
$target = '';
// target(s) input
- if (in_array($rule['test'], array('header', 'address', 'envelope'))) {
+ if (in_array($rule['test'], array('header', 'address', 'envelope','string'))) {
$target = $rule['arg2'];
}
else if (in_array($rule['test'], array('body', 'date', 'currentdate'))) {
@@ -1625,7 +1643,7 @@ function rule_div($fid, $id, $div=true)
$select_type->add(rcube::Q($this->plugin->gettext('detail')), 'detail');
}
- $need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'duplicate'));
+ $need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'duplicate', 'string'));
$mout = '
';
$mout .= ' ' . rcube::Q($this->plugin->gettext('modifier')) . ' ';
$mout .= $select_mod->show($rule['test']);
@@ -1765,7 +1783,7 @@ private static function rule_test(&$rule)
$rule['type'] = $rule['type'] == 'over' ? 'under' : 'over';
}
- $set = array('header', 'address', 'envelope', 'body', 'date', 'currentdate');
+ $set = array('header', 'address', 'envelope', 'body', 'date', 'currentdate', 'string');
// build test string supported by select element
if ($rule['size']) {
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
index b6a121b7b0b..66d687e2e1a 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
@@ -238,8 +238,13 @@ public function as_text()
break;
case 'header':
+ case 'string':
+ if ($test['test'] == 'string') {
+ array_push($exts, 'variables');
+ }
+
$tests[$i] .= ($test['not'] ? 'not ' : '');
- $tests[$i] .= 'header';
+ $tests[$i] .= $test['test'];
$this->add_index($test, $tests[$i], $exts);
$this->add_operator($test, $tests[$i], $exts);
@@ -707,6 +712,7 @@ private function _tokenize_rule($content, &$position)
break;
case 'header':
+ case 'string':
case 'address':
case 'envelope':
$test = array('test' => $token, 'not' => $not);
@@ -716,7 +722,7 @@ private function _tokenize_rule($content, &$position)
$test += $this->test_tokens($tokens);
- if ($token != 'header' && !empty($tokens)) {
+ if ($token != 'header' && $token != 'string' && !empty($tokens)) {
for ($i=0, $len=count($tokens); $i<$len; $i++) {
if (!is_array($tokens[$i]) && preg_match('/^:(localpart|domain|all|user|detail)$/i', $tokens[$i])) {
$test['part'] = strtolower(substr($tokens[$i], 1));
diff --git a/plugins/managesieve/localization/en_CA.inc b/plugins/managesieve/localization/en_CA.inc
index 1850bbb019b..6b66d13a8d3 100644
--- a/plugins/managesieve/localization/en_CA.inc
+++ b/plugins/managesieve/localization/en_CA.inc
@@ -122,6 +122,7 @@ $labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
$labels['...'] = '...';
+$labels['string'] = 'String';
$labels['currdate'] = 'Current date';
$labels['datetest'] = 'Date';
$labels['dateheader'] = 'header:';
diff --git a/plugins/managesieve/localization/en_GB.inc b/plugins/managesieve/localization/en_GB.inc
index e9433491c45..b513853105c 100644
--- a/plugins/managesieve/localization/en_GB.inc
+++ b/plugins/managesieve/localization/en_GB.inc
@@ -122,6 +122,7 @@ $labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
$labels['...'] = '...';
+$labels['string'] = 'String';
$labels['currdate'] = 'Current date';
$labels['datetest'] = 'Date';
$labels['dateheader'] = 'header:';
diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc
index c15193d66a2..8cd8c231d9c 100644
--- a/plugins/managesieve/localization/en_US.inc
+++ b/plugins/managesieve/localization/en_US.inc
@@ -126,6 +126,7 @@ $labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
$labels['...'] = '...';
+$labels['string'] = 'String';
$labels['currdate'] = 'Current date';
$labels['datetest'] = 'Date';
$labels['dateheader'] = 'header:';
diff --git a/plugins/managesieve/localization/fr_FR.inc b/plugins/managesieve/localization/fr_FR.inc
index ef02e7fd2b0..95a435020a0 100644
--- a/plugins/managesieve/localization/fr_FR.inc
+++ b/plugins/managesieve/localization/fr_FR.inc
@@ -124,6 +124,7 @@ $labels['filtercreate'] = 'Créer un filtre';
$labels['usedata'] = 'Utiliser les données suivantes dans le filtre :';
$labels['nextstep'] = 'Étape suivante';
$labels['...'] = '...';
+$labels['string'] = 'Chaîne';
$labels['currdate'] = 'Date actuelle';
$labels['datetest'] = 'Date';
$labels['dateheader'] = 'en-tête :';
diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js
index 1316a5aa5cf..cfc60db7f5b 100644
--- a/plugins/managesieve/managesieve.js
+++ b/plugins/managesieve/managesieve.js
@@ -602,6 +602,7 @@ function rule_header_select(id)
msg = document.getElementById('rule_message' + id),
op = document.getElementById('rule_op' + id),
header = document.getElementById('custom_header' + id + '_list'),
+ custstr = document.getElementById('custom_var' + id + '_list'),
mod = document.getElementById('rule_mod' + id),
trans = document.getElementById('rule_trans' + id),
comp = document.getElementById('rule_comp' + id),
@@ -611,18 +612,19 @@ function rule_header_select(id)
if (h == 'size') {
size.style.display = 'inline';
- $.each([op, header, mod, trans, comp, msg], function() { this.style.display = 'none'; });
+ $.each([op, header, custstr, mod, trans, comp, msg], function() { this.style.display = 'none'; });
}
else if (h == 'message') {
msg.style.display = 'inline';
- $.each([op, header, mod, trans, comp, size], function() { this.style.display = 'none'; });
+ $.each([op, header, custstr, mod, trans, comp, size], function() { this.style.display = 'none'; });
}
else {
header.style.display = h != '...' ? 'none' : 'inline-block';
+ custstr.style.display = h != 'string' ? 'none' : 'inline-block';
size.style.display = 'none';
op.style.display = 'inline';
comp.style.display = '';
- mod.style.display = h == 'body' || h == 'currentdate' || h == 'date' ? 'none' : 'block';
+ mod.style.display = h == 'body' || h == 'currentdate' || h == 'date' || h == 'string' ? 'none' : 'block';
trans.style.display = h == 'body' ? 'block' : 'none';
msg.style.display = h == 'message' ? 'block' : 'none';
}
@@ -634,7 +636,9 @@ function rule_header_select(id)
rule_op_select(op, id, h);
rule_mod_select(id, h);
- obj.style.width = h == '...' ? '40px' : '';
+
+ if (h == '...') obj.style.width = '40px';
+ else if (h == 'string') obj.style.width = '90px';
};
function rule_op_select(obj, id, header)
@@ -668,7 +672,7 @@ function rule_mod_select(id, header)
target.style.display = obj.value != 'address' && obj.value != 'envelope' ? 'none' : 'inline';
if (index)
- index.style.display = !header.match(/^(body|currentdate|size|message)$/) && obj.value != 'envelope' ? '' : 'none';
+ index.style.display = !header.match(/^(body|currentdate|size|message|string)$/) && obj.value != 'envelope' ? '' : 'none';
if (duplicate)
duplicate.style.display = header == 'message' ? '' : 'none';
@@ -903,6 +907,7 @@ function sieve_form_init()
// small resize for header element
$('select[name="_header[]"]', rcmail.gui_objects.sieveform).each(function() {
if (this.value == '...') this.style.width = '40px';
+ if (this.value == 'string') this.style.width = '90px';
});
// resize dialog window