autosieve compilation ignores sieve_extensions setting

James Ralston at
Mon Dec 10 21:07:44 EST 2007

Hello University of Athens NOC Development Team,

First, thanks for the Cyrus imapd autocreate patches; they've proven
to be very useful.

I noticed there is a bug in the is_script_parsable() function.
Specifically, is_script_parsable() does not obey the
"sieve_extensions" setting in imapd.conf(5); instead, it registers a
predefined list of sieve functions.  This can lead to two problems:

1.  is_script_parsable() can reject as invalid a sieve script that
    sieve_generate_bytecode() has no issues with.

2.  is_script_parsable() can accept as valid a sieve script that
    sieve_generate_bytecode() will fail.

As an example of #1, consider these imapd.conf(5) settings:

sieve_extensions: copy envelope fileinto imapflags include notify regex relational subaddress vacation
autosievefolders: Junk
autocreate_sieve_script: /usr/share/cyrus-imapd/sieve/default

Let's say that /usr/share/cyrus-imapd/sieve/default contains:

    require ["include"];
    include :global "spam-auto-file";

This script is valid, because sieve_extensions contains "include", but
is_script_parsable() rejects it, because it doesn't register the
include function:

Dec 10 20:02:02 example imap[14059]: autocreate_sieve: Error while parsing script script errors: line 1: unsupported feature .

As an example of #2, note that since we deliberately exclude "reject"
from sieve_extensions (users always seem to want to use it to reject
spam, which is very bad, because doing so generates backscatter), a
script that calls reject will fail, even though is_script_parsable()
will pass it.

It's possible to work around this bug by compiling the Sieve script in
advance with sievec, and then setting (e.g.):

autocreate_sieve_script: /usr/share/cyrus-imapd/sieve/default
autocreate_sieve_compiledscript: /usr/share/cyrus-imapd/sieve/default.bc

This does the right thing; the user gets the byte-compiled version of
the script installed and activated, but also gets the plain-text
version (so they can edit it to customize it).  And it's arguably
better to do it this way, as then one eliminates the overhead of
performing the byte-compile for all newly-created Inboxes.

But, still, is_script_parsable() really should obey the
sieve_extensions setting...

Is this a known issue?  If not, although we are in the process of
migrating from Cyrus to Exchange (alas), I think I could come up
with a patch for this without too much difficulty...

More information about the Info-cyrus mailing list