diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php index 3bb5eacc5..b6a39f08f 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php @@ -595,6 +595,7 @@ class rcube_sieve_engine // 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); @@ -854,6 +855,7 @@ class rcube_sieve_engine } else { $cust_header = $headers = $this->strip_value(array_shift($cust_headers)); + $cust_var = $headers = $this->strip_value(array_shift($cust_vars)); $mod = $this->strip_value($mods[$idx]); $mod_type = $this->strip_value($mod_types[$idx]); $index = $this->strip_value($indexes[$idx]); @@ -868,10 +870,10 @@ class rcube_sieve_engine $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 +883,11 @@ class rcube_sieve_engine } 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 +903,6 @@ class rcube_sieve_engine $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 +1448,9 @@ class rcube_sieve_engine 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 +1477,7 @@ class rcube_sieve_engine $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 +1497,12 @@ class rcube_sieve_engine 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 +1510,13 @@ class rcube_sieve_engine } } + // 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 +1553,7 @@ class rcube_sieve_engine $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 +1640,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', 'duplicate')); + $need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'duplicate', 'string')); $mout = '