imapsieve administrator scripts are not executed in the order they are defined

Stephan Bosch stephan at rename-it.nl
Sun Oct 6 20:02:52 EEST 2019



On 05/10/2019 00:43, frankagainstthemachine--- via dovecot wrote:
> Dear dovecot developers,
>
> I have an issue with the Pigeonhole IMAPSieve Plugin and the order in which
> administrator scripts are executed.  Although I cannot find anything about the
> order in which the scripts are executed, I would expect they are executed in
> the order they are defined: the one defined by imapsieve_mailbox1_* before the
> one defined by imapsieve_mailbox2_* in case both match.
>
> I defined several administrator scripts; among them one that should be executed
> when copying a mail to mailbox "Inbox", and one that should be executed when
> copying a mail from a mailbox "*.Spam" to any other mailbox.  No matter in
> which order I define the two scripts, the one related to "Inbox" is always
> executed first when I move a mail from "blah.Spam" to "Inbox", see the snipped
> from my logs below.
>
> I guess there might be a bug in file imap-sieve-storage.c, function
> imap_sieve_mailbox_rules_match(...): The comment in this function states
> "Insert sorted by rule index", but in case the index of the rule to be
> inserted is higher than any index already in the "rules" array, the rule is
> inserted in position 0 instead of being appended to the end, because
> "insert_idx" is initialized with 0.
>
> Since the rule for "*.Spam" is a pattern rule, it is the first rule to be
> inserted into "rules" (in imap_sieve_mailbox_rules_match_patterns(...)).
> Afterwards the rule for "Inbox" is always inserted at position 0 (in
> imap_sieve_mailbox_rules_match(...)), no matter if its rule index is higher or
> lower than the index of the other rule.
>
> The following change could fix this:
>   - unsigned int insert_idx = 0;
>   + unsigned int insert_idx = array_count(rules);

Confirmed. Tracking internally as DOP-1465.

Regards,

Stephan.

> Best regards,
>    Frank
>
>
> ----- log -----
> [...]
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: mailbox INBOX: MOVE event
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: Pigeonhole version 0.5.7.2 (7372921a) initializing
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: Sieve Extprograms plugin for Pigeonhole version 0.5.7.2
> (7372921a) loaded
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: Static mailbox rule [1]: mailbox=`*.Spam' from=`*'
> causes=(COPY) => before=`file:/usr/lib/dovecot/sieve/spamassassin-learn-
> spam.sieve' after=(none)
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: Static mailbox rule [2]: mailbox=`*' from=`*.Spam'
> causes=(COPY) => before=`file:/usr/lib/dovecot/sieve/spamassassin-learn-
> ham.sieve' after=(none)
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: Static mailbox rule [3]: mailbox=`INBOX' from=`*'
> causes=(COPY APPEND) => before=`file:~/.dovecot.sieve' after=(none)
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: Matched static mailbox rule [2]
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: imapsieve: Matched static mailbox rule [3]
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: file storage: Using Sieve script path: /var/spool/mail/
> user/.dovecot.sieve
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: file script: Opened script `.dovecot' from `/var/spool/mail/
> user/.dovecot.sieve'
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: file storage: Using Sieve script path: /usr/lib/dovecot/sieve/
> spamassassin-learn-ham.sieve
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: file script: Opened script `spamassassin-learn-ham' from `/usr/
> lib/dovecot/sieve/spamassassin-learn-ham.sieve'
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: Opening script 1 of 2 from `/var/spool/mail/user/.dovecot.sieve'
> Oct  4 23:51:12 somehost dovecot[22918]: imap(user)<22927><oLq3sRyU0t/AqLwV>:
> Debug: sieve: Loading script /var/spool/mail/user/.dovecot.sieve
> [...]
>
> ----- dovecot -n -----
> # 2.3.7.2 (3c910f64b): /etc/dovecot/dovecot.conf
> # Pigeonhole version 0.5.7.2 (7372921a)
> # OS: Linux 5.1.18-gentoo x86_64 Gentoo Base System release 2.6 ext4
> # Hostname: somehost.de
> auth_username_format = %Ln
> mail_debug = yes
> mail_home = /var/spool/mail/%u
> mail_location = maildir:/var/spool/mail/%u/mail
> managesieve_notify_capability = mailto
> managesieve_sieve_capability = fileinto reject envelope encoded-character
> vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy
> include variables body enotify environment mailbox date index ihave duplicate
> mime foreverypart extracttext vnd.dovec
> ot.debug
> namespace inbox {
>   inbox = yes
>   location =
>   mailbox Drafts {
>     special_use = \Drafts
>   }
>   mailbox Junk {
>     special_use = \Junk
>   }
>   mailbox Sent {
>     special_use = \Sent
>   }
>   mailbox "Sent Messages" {
>     special_use = \Sent
>   }
>   mailbox Trash {
>     special_use = \Trash
>   }
>   prefix =
> }
> passdb {
>   args = scheme=CRYPT username_format=%u /etc/dovecot/users
>   driver = passwd-file
> }
> plugin {
>   imapsieve_mailbox1_before = file:/usr/lib/dovecot/sieve/spamassassin-learn-
> spam.sieve
>   imapsieve_mailbox1_causes = COPY
>   imapsieve_mailbox1_name = *.Spam
>   imapsieve_mailbox2_before = file:/usr/lib/dovecot/sieve/spamassassin-learn-
> ham.sieve
>   imapsieve_mailbox2_causes = COPY
>   imapsieve_mailbox2_from = *.Spam
>   imapsieve_mailbox2_name = *
>   imapsieve_mailbox3_before = file:~/.dovecot.sieve
>   imapsieve_mailbox3_causes = COPY APPEND
>   imapsieve_mailbox3_name = Inbox
>   mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
> append
>   sieve = file:~/sieve;active=~/.dovecot.sieve
>   sieve_execute_bin_dir = /usr/lib/dovecot/sieve
>   sieve_extensions = +vnd.dovecot.debug
>   sieve_filter_bin_dir = /usr/lib/dovecot/sieve
>   sieve_filter_exec_timeout = 300s
>   sieve_filter_input_eol = lf
>   sieve_global = /usr/lib/dovecot/sieve
>   sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.execute
> +vnd.dovecot.filter
>   sieve_pipe_bin_dir = /usr/lib/dovecot/sieve
>   sieve_pipe_exec_timeout = 300s
>   sieve_pipe_input_eol = lf
>   sieve_plugins = sieve_extprograms
> }
> postmaster_address = postmaster at frankagainstthemachine.de
> protocols = imap lmtp sieve sieve
> service imap-login {
>   inet_listener imap {
>     port = 0
>   }
> }
> service lmtp {
>   unix_listener /var/spool/postfix/private/dovecot-lmtp {
>     group = postfix
>     mode = 0666
>     user = postfix
>   }
> }
> ssl = required
> ssl_cert = </etc/ssl/dovecot/somehost.cert.pem
> ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!
> 3DES:!MD5:!PSK:!RC4:!ADH:!LOW at STRENGTH
> ssl_dh = # hidden, use -P to show it
> ssl_key = # hidden, use -P to show it
> ssl_prefer_server_ciphers = yes
> userdb {
>   args = username_format=%u /etc/dovecot/users
>   driver = passwd-file
> }
> verbose_ssl = yes
> protocol lmtp {
>   mail_plugins = " sieve"
> }
> protocol lda {
>   mail_plugins = sieve
> }
> protocol imap {
>   mail_plugins = " imap_sieve"
> }
> protocol sieve {
>   mail_debug = yes
> }
>
>



More information about the dovecot mailing list