diff --git a/README b/README index 1b826c53485003b49ab92ecea9631329912e94d2..17dc5d75a4b7bcb8a93cf8e692d645a7d6e9e456 100644 --- a/README +++ b/README @@ -110,6 +110,7 @@ following list outlines the implementation status of each supported extension: subaddress (RFC 5233): fully supported, but with limited configurability. spamtest and virustest (RFC 5235): fully supported (v0.1.16+). date (RFC 5260; Section 4): fully supported (v0.1.12+). + index (RFC 5260; Section 6): fully supported (v0.4.7+). editheader (RFC 5293): fully supported (v0.3.0+). reject (RFC 5429; Section 2.2): fully supported. enotify (RFC 5435): fully supported (v0.1.3+). @@ -120,7 +121,7 @@ following list outlines the implementation status of each supported extension: mailbox (RFC 5490; Section 3): fully supported (v0.1.10+), but ACL permissions are not verified for mailboxexists. include (RFC 6609): fully supported (v0.4.0+) - duplicate (draft v03): fully supported (v0.4.3+). + duplicate (RFC 7352): fully supported (v0.4.3+). regex (draft v08; not latest version): almost fully supported, but UTF-8 is not supported. @@ -135,30 +136,39 @@ following list outlines the implementation status of each supported extension: The following Dovecot-specific Sieve extensions are available: vnd.dovecot.debug (v0.3.0+): - Allows logging debug messages + Allows logging debug messages. vnd.dovecot.pipe (v0.4.0+; sieve_extprograms plugin): - Implements piping messages to a pre-defined set of external programs + Implements piping messages to a pre-defined set of external programs. vnd.dovecot.filter (v0.4.0+; sieve_extprograms plugin): Implements filtering messages through a pre-defined set of external - programs + programs. vnd.dovecot.execute (v0.4.0+; sieve_extprograms plugin): Implements executing a pre-defined set of external programs with the - option to process string data through the external program + option to process string data through the external program. The following extensions are under development: + mboxmetadata and servermetadata (RFC 5490): partially implemented; + Dovecot adjustments needed. ereject (RFC 5429; page 4): implemented, but currently equal to reject Many more extensions to the language exist. Not all of these extensions are useful for Dovecot in particular, but many of them are. Currently, the author has taken notice of the following extensions: - index (RFC 5260; page 7): planned. foreverypart, mime, replace, enclose, and extracttext (RFC 5703): planned. + imapsieve (RFC 6785): planned. + envelope-dsn, envelope-deliverby, redirect-dsn and + redirect-deliverby (RFC 6009): planned; depends on lib-smtp changes in + Dovecot. + extlists (RFC 6134): under consideration. These extensions will be added as soon as the necessary infrastructure is available. +Check the TODO file for an up-to-date list of open issues and current +development. + Compiling and Configuring ========================= diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c index e1fed35c29e8ba181d98874189fd065edca57710..0f4f65875b26502061cdb9e0bb1d934c378dfc16 100644 --- a/src/lib-sieve/sieve-actions.c +++ b/src/lib-sieve/sieve-actions.c @@ -37,29 +37,6 @@ const struct sieve_operand_class sieve_side_effect_operand_class = { "SIDE-EFFECT" }; -bool sieve_opr_side_effect_read -(const struct sieve_runtime_env *renv, sieve_size_t *address, - struct sieve_side_effect *seffect) -{ - const struct sieve_side_effect_def *sdef; - - seffect->context = NULL; - - if ( !sieve_opr_object_read - (renv, &sieve_side_effect_operand_class, address, &seffect->object) ) - return FALSE; - - sdef = seffect->def = - (const struct sieve_side_effect_def *) seffect->object.def; - - if ( sdef->read_context != NULL && - !sdef->read_context(seffect, renv, address, &seffect->context) ) { - return FALSE; - } - - return TRUE; -} - bool sieve_opr_side_effect_dump (const struct sieve_dumptime_env *denv, sieve_size_t *address) { @@ -84,6 +61,30 @@ bool sieve_opr_side_effect_dump return TRUE; } +int sieve_opr_side_effect_read +(const struct sieve_runtime_env *renv, sieve_size_t *address, + struct sieve_side_effect *seffect) +{ + const struct sieve_side_effect_def *sdef; + int ret; + + seffect->context = NULL; + + if ( !sieve_opr_object_read + (renv, &sieve_side_effect_operand_class, address, &seffect->object) ) + return SIEVE_EXEC_BIN_CORRUPT; + + sdef = seffect->def = + (const struct sieve_side_effect_def *) seffect->object.def; + + if ( sdef->read_context != NULL && (ret=sdef->read_context + (seffect, renv, address, &seffect->context)) <= 0 ) { + return ret; + } + + return SIEVE_EXEC_OK; +} + /* * Optional operands */ diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h index 37d952290c246285ee8b7d27da9e2fdfade75d60..99ae31badb849725b7d62bf18944ecaee2076a88 100644 --- a/src/lib-sieve/sieve-actions.h +++ b/src/lib-sieve/sieve-actions.h @@ -187,12 +187,11 @@ static inline void sieve_opr_side_effect_emit sieve_opr_object_emit(sblock, ext, &seff->obj_def); } -bool sieve_opr_side_effect_read - (const struct sieve_runtime_env *renv, sieve_size_t *address, - struct sieve_side_effect *seffect); - bool sieve_opr_side_effect_dump (const struct sieve_dumptime_env *denv, sieve_size_t *address); +int sieve_opr_side_effect_read + (const struct sieve_runtime_env *renv, sieve_size_t *address, + struct sieve_side_effect *seffect); /* * Optional operands diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h index dce5e49e96a99b4c554eb36a84c788854a878081..d8241bfa02dd7d286dd031fcc2a45babaf477d16 100644 --- a/src/lib-sieve/sieve-binary.h +++ b/src/lib-sieve/sieve-binary.h @@ -13,7 +13,7 @@ */ #define SIEVE_BINARY_VERSION_MAJOR 1 -#define SIEVE_BINARY_VERSION_MINOR 2 +#define SIEVE_BINARY_VERSION_MINOR 3 /* * Binary object diff --git a/src/lib-sieve/sieve-message.c b/src/lib-sieve/sieve-message.c index 5a0e485b048f1a5f9dd900d25a1b85feb6fe24cc..20bd783e2b84447458dafd3a92e8d12d01349403 100644 --- a/src/lib-sieve/sieve-message.c +++ b/src/lib-sieve/sieve-message.c @@ -604,27 +604,27 @@ bool sieve_opr_message_override_dump return TRUE; } -bool sieve_opr_message_override_read +int sieve_opr_message_override_read (const struct sieve_runtime_env *renv, sieve_size_t *address, struct sieve_message_override *svmo) { const struct sieve_message_override_def *hodef; + int ret; svmo->context = NULL; if ( !sieve_opr_object_read (renv, &sieve_message_override_operand_class, address, &svmo->object) ) - return FALSE; + return SIEVE_EXEC_BIN_CORRUPT; hodef = svmo->def = (const struct sieve_message_override_def *) svmo->object.def; if ( hodef->read_context != NULL && - !hodef->read_context(svmo, renv, address, &svmo->context) ) { - return FALSE; - } + (ret=hodef->read_context(svmo, renv, address, &svmo->context)) <= 0 ) + return ret; - return TRUE; + return SIEVE_EXEC_OK; } /* diff --git a/src/lib-sieve/sieve-message.h b/src/lib-sieve/sieve-message.h index f6d16428fce140f7365cacc37dae88909c2140b3..4b23a2761dd870828968027b2bc7b8209576d7cc 100644 --- a/src/lib-sieve/sieve-message.h +++ b/src/lib-sieve/sieve-message.h @@ -135,12 +135,11 @@ static inline void sieve_opr_message_override_emit sieve_opr_object_emit(sblock, ext, &seff->obj_def); } -bool sieve_opr_message_override_read - (const struct sieve_runtime_env *renv, sieve_size_t *address, - struct sieve_message_override *svmo); - bool sieve_opr_message_override_dump (const struct sieve_dumptime_env *denv, sieve_size_t *address); +int sieve_opr_message_override_read + (const struct sieve_runtime_env *renv, sieve_size_t *address, + struct sieve_message_override *svmo); /* * Optional operands