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

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Dovecot mailing list
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);

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 = [hidden email]
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@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
}


Reply | Threaded
Open this post in threaded view
|

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

Dovecot mailing list


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 = [hidden email]
> 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@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
> }
>
>