[Dovecot] MANAGESIEVE patch v2
Hello Timo,
Dispite the heat out here, I managed to come up with a new version of the managesieve patch for dovecot-1.0rc2:
- Fixed the bug (missing CRLF) in the authenticate command
- Modified the sieve storage library making the interface much less crude.
- The scripts put on the server using the putscript command are now checked before they are accepted.
- The reported SIEVE capability is now directly read from the sieve implementation (in this case cmu), listing much more than "FILEINTO VACATION".
- Fixed some minor bugs in the putscript command
Considering the dovecot-sieve plugin, I noticed that you obviously do not want to include the cmu sieve code in the main dovecot source tree. Unfortunately I did not see any other way but to include this library in my patch to make it support checking the uploaded scripts (for now).
There are a few alternatives to solve this issue. We could combine de dovecot-sieve plugin with the managesieve patch yielding a single large sieve plugin. However, this would require some means to let the master know about the new managesieve process type. This could be achieved with some more plugin magic.
Another way to solve this problem is by truly only excluding the cmu source from the main dovecot tree. If the interface of the sieve implementation is abstracted somehow, one could build a plugin interface for sieve implementations. This sieve interface would be common to dovecot-deliver and the managesieve daemon. This way, it does not matter how the sieve language is implemented (dovecot could even implement its own and still support cmu and others). I saw a hint to this solution in your original dovecot-lda plugin (i.e. sieve-mailutils.c etc), so you must have been playing with this idea as well.
I took the liberty to define an example interface for the sieve implementations in the src/lib-sieve directory. It was concieved very quickly and it is far from complete, but it should support the current features of the delivery process. It is only tested for the managesieve putscript verification (no script was ever run though this interface). I am also not quite happy with the error reporting scheme of this interface. This needs more work and if you don't like it you can of course discard it entirely and define your own.
Currently, I am also testing other sieve implementations. I am experimenting with libsieve2 (libsieve.sourceforge.net) and with building a wrapper around 'exim -bf'. This last solution is of course not useful for dovecot-lda, but I think the managesieve daemon is not only useful for dovecot itself. Support for these implementations is not yet included in this patch.
The patch can be downloaded at:
http://sinas.rename-it.nl/~sirius/dovecot-1.0.rc2-MANAGESIEVE-v2.diff.gz
(Simply apply it (-p0) to a clean 1.0rc2 source tree and run autogen.sh etc.)
For testing, I have tried other client implementations than horde-ingo, but somehow everyone is very focused on the timsieve daemon and they tend to require its protocol specifics. The only other implementation I got working is smartsieve. The others either crashed or produced protocol errors (i.e. sieveshell). I hope I can get more client implementations to work to ensure the incompatibilies are not my fault.
I am very eager to know what you think about the sieve implementation ideas and what you think of the new managesieve patch.
Regards,
-- Stephan Bosch stephan@rename-it.nl
Stephan Bosch wrote:
Dispite the heat out here, I managed to come up with a new version of the managesieve patch for dovecot-1.0rc2:
To get this patch to compile (and apparently work) with RC7, the following patch must be applied: Index: src/managesieve-login/client.c =================================================================== --- src/managesieve-login/client.c (revision 2) +++ src/managesieve-login/client.c (working copy) @@ -350,7 +350,7 @@ client_unref(client); } -static void client_destroy_oldest(void) +void client_destroy_oldest(void) { struct hash_iterate_context *iter; void *key, *value; @@ -403,8 +403,8 @@ struct managesieve_client *client; const char *addr; - if (max_logging_users > CLIENT_DESTROY_OLDEST_COUNT && - hash_size(clients) >= max_logging_users) { + if (max_connections > CLIENT_DESTROY_OLDEST_COUNT && + hash_size(clients) >= max_connections) { /* reached max. users count, kill few of the oldest connections */ client_destroy_oldest(); I'm having problems with lda-sieve and RC7, but I hope to get that worked out by next week (because I want to install and run RC7). John -- John Peacock Director of Information Research and Technology Rowman & Littlefield Publishing Group 4501 Forbes Blvd Suite H Lanham, MD 20706 301-459-3366 x.5010 fax 301-429-5747
participants (2)
-
John Peacock
-
Stephan Bosch