diff -urN ../roundcubemail-1.3.9.orig/plugins/managesieve/config.inc.php.dist ./plugins/managesieve/config.inc.php.dist --- ../roundcubemail-1.3.9.orig/plugins/managesieve/config.inc.php.dist 2019-03-31 14:27:56.000000000 +0300 +++ ./plugins/managesieve/config.inc.php.dist 2019-09-14 19:38:17.585655000 +0300 @@ -44,6 +44,9 @@ // default contents of filters script (eg. default spam filter) $config['managesieve_default'] = '/etc/dovecot/sieve/global'; +// prefix contents of root user filters script +$config['managesieve_user_root_prefix'] = "require [\"include\"];\r\ninclude :global \"global-spam\";\r\n"; + // The name of the script which will be used when there's no user script $config['managesieve_script_name'] = 'managesieve'; diff -urN ../roundcubemail-1.3.9.orig/plugins/managesieve/lib/Roundcube/rcube_sieve.php ./plugins/managesieve/lib/Roundcube/rcube_sieve.php --- ../roundcubemail-1.3.9.orig/plugins/managesieve/lib/Roundcube/rcube_sieve.php 2019-03-31 14:27:56.000000000 +0300 +++ ./plugins/managesieve/lib/Roundcube/rcube_sieve.php 2019-09-14 19:34:18.958802000 +0300 @@ -34,6 +34,8 @@ public $script; // rcube_sieve_script object public $current; // name of currently loaded script + public $managesieve_user_root_prefix; + const ERROR_CONNECTION = 1; const ERROR_LOGIN = 2; const ERROR_NOT_EXISTS = 3; // script not exists @@ -396,6 +398,20 @@ // fix/convert to Roundcube format if (!empty($script->content)) { + + if ((!empty($this->managesieve_user_root_prefix)) and (is_array($script->content))) { + $script_user_root_prefix = new rcube_sieve_script($this->managesieve_user_root_prefix, $this->exts); + if ((!empty($script_user_root_prefix->content)) and (is_array($script_user_root_prefix->content))) { + while ($prefix_rule = array_pop($script_user_root_prefix->content)) { + $found = false; + foreach ($script->content as $rule) { + if ($rule == $prefix_rule) $found = true; + } + if (!$found) array_unshift($script->content, $prefix_rule); + } + } + } + // replace all elsif with if+stop, we support only ifs foreach ($script->content as $idx => $rule) { if (empty($rule['type']) || !preg_match('/^(if|elsif|else)$/', $rule['type'])) { diff -urN ../roundcubemail-1.3.9.orig/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php ./plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php --- ../roundcubemail-1.3.9.orig/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2019-03-31 14:27:56.000000000 +0300 +++ ./plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2019-09-14 19:37:28.542744000 +0300 @@ -223,6 +223,7 @@ 'message' => "Unable to connect to managesieve on $host:$port" ), true, false); } + $this->sieve->managesieve_user_root_prefix = $this->rc->config->get('managesieve_user_root_prefix'); return $error; } @@ -2483,6 +2484,7 @@ ."#\n" ."# For more information, see http://wiki.kolab.org/KEP:14#USER\n" ."#\n"; + $content .= $this->rc->config->get('managesieve_user_root_prefix'); if ($this->sieve->save_script('USER', $content)) { $_SESSION['managesieve_user_script'] = 'USER'; if (empty($this->master_file))