diff -urN ../roundcubemail-1.5.0.orig/plugins/managesieve/config.inc.php.dist ./plugins/managesieve/config.inc.php.dist --- ../roundcubemail-1.5.0.orig/plugins/managesieve/config.inc.php.dist 2021-10-17 23:38:04.000000000 +0300 +++ ./plugins/managesieve/config.inc.php.dist 2021-11-27 17:46:27.955930000 +0200 @@ -44,6 +44,9 @@ // A file with default script content (e.g. 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.5.0.orig/plugins/managesieve/lib/Roundcube/rcube_sieve.php ./plugins/managesieve/lib/Roundcube/rcube_sieve.php --- ../roundcubemail-1.5.0.orig/plugins/managesieve/lib/Roundcube/rcube_sieve.php 2021-10-17 23:38:04.000000000 +0300 +++ ./plugins/managesieve/lib/Roundcube/rcube_sieve.php 2021-11-27 17:47:39.860653000 +0200 @@ -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 @@ -407,6 +409,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.5.0.orig/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php ./plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php --- ../roundcubemail-1.5.0.orig/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2021-10-17 23:38:04.000000000 +0300 +++ ./plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2021-11-27 17:48:44.145145000 +0200 @@ -229,6 +229,7 @@ ], true, false ); } + $this->sieve->managesieve_user_root_prefix = $this->rc->config->get('managesieve_user_root_prefix'); return $error; } @@ -2986,6 +2987,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';