Skip to content

Commit

Permalink
Managesieve: sieve string implement
Browse files Browse the repository at this point in the history
  • Loading branch information
pulcov committed May 12, 2016
1 parent 5b3a86d commit b312dc6
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 16 deletions.
33 changes: 24 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 @@ -854,6 +855,7 @@ function save()
}
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]);
Expand All @@ -868,10 +870,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 +883,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 +903,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 +1448,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 +1477,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 +1497,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 +1553,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 +1640,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 +1780,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

0 comments on commit b312dc6

Please sign in to comment.