Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Managesieve: sieve string implement #5248

Merged
merged 2 commits into from
Jul 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 27 additions & 9 deletions plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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)) {
Expand All @@ -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)) {
Expand All @@ -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'])) {
Expand Down Expand Up @@ -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');
Expand All @@ -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'))) {
Expand All @@ -1492,16 +1500,26 @@ 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])])) {
unset($custom);
}
}

// 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'),
Expand Down Expand Up @@ -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'))) {
Expand Down Expand Up @@ -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 = '<div id="rule_mod' .$id. '" class="adv"' . (!$need_mod ? ' style="display:none"' : '') . '>';
$mout .= ' <span class="label">' . rcube::Q($this->plugin->gettext('modifier')) . ' </span>';
$mout .= $select_mod->show($rule['test']);
Expand Down Expand Up @@ -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']) {
Expand Down
10 changes: 8 additions & 2 deletions plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down
1 change: 1 addition & 0 deletions plugins/managesieve/localization/en_CA.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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:';
Expand Down
1 change: 1 addition & 0 deletions plugins/managesieve/localization/en_GB.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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:';
Expand Down
1 change: 1 addition & 0 deletions plugins/managesieve/localization/en_US.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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:';
Expand Down
1 change: 1 addition & 0 deletions plugins/managesieve/localization/fr_FR.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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 :';
Expand Down
15 changes: 10 additions & 5 deletions plugins/managesieve/managesieve.js
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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';
}
Expand All @@ -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)
Expand Down Expand Up @@ -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';
Expand Down Expand Up @@ -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
Expand Down