diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c index 25f881471f3b39328786bb29b31c82c327d13e8e..d22ec97789a85927e61c8de62a8d9477444b9a91 100644 --- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c +++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c @@ -1,5 +1,16 @@ -#include <stdio.h> - +/* Extension subaddress + * -------------------- + * + * Author: Stephan Bosch + * Specification: RFC 3598 + * Implementation: full, but not configurable + * Status: experimental, largely untested + * + * FIXME: This extension is not configurable in any way. The separation + * character is currently only configurable for compilation and not at runtime. + * + */ + #include "sieve-common.h" #include "sieve-code.h" @@ -10,7 +21,14 @@ #include "sieve-generator.h" #include "sieve-interpreter.h" +#include <string.h> + +/* Config */ + +#define SUBADDRESS_DEFAULT_SEP_CHAR '+' + /* Forward declarations */ + static bool ext_subaddress_load(int ext_id); static bool ext_subaddress_validator_load(struct sieve_validator *validator); static bool ext_subaddress_interpreter_load @@ -18,7 +36,7 @@ static bool ext_subaddress_interpreter_load /* Extension definitions */ -int ext_my_id; +static int ext_my_id; const struct sieve_extension subaddress_extension = { "subaddress", @@ -37,22 +55,30 @@ static bool ext_subaddress_load(int ext_id) return TRUE; } -/* */ +/* Actual extension implementation */ static const char *subaddress_user_extract_from (const struct message_address *address) { - i_info("subaddress: user: %s.", address->mailbox); - return address->mailbox; + const char *sep = strchr(address->mailbox, SUBADDRESS_DEFAULT_SEP_CHAR); + + if ( sep == NULL ) return address->mailbox; + + return t_strdup_until(address->mailbox, sep); } static const char *subaddress_detail_extract_from (const struct message_address *address) { - i_info("subaddress: detail: %s.", address->mailbox); - return address->mailbox; + const char *sep = strchr(address->mailbox, SUBADDRESS_DEFAULT_SEP_CHAR); + + if ( sep == NULL ) return NULL; + + return sep+1; } +/* Extension access structures */ + enum ext_subaddress_address_part { SUBADDRESS_USER, SUBADDRESS_DETAIL @@ -91,7 +117,6 @@ static const struct sieve_address_part *ext_subaddress_get_part const struct sieve_address_part_extension subaddress_addrp_extension = { NULL, - ext_subaddress_get_part }; diff --git a/src/lib-sieve/plugins/subaddress/subaddress.sieve b/src/lib-sieve/plugins/subaddress/subaddress.sieve index 76031f7e3eeffb335ec3f6229f64eb0f53570959..1b4a0c71581833d53e6e494403ca020d36d83968 100644 --- a/src/lib-sieve/plugins/subaddress/subaddress.sieve +++ b/src/lib-sieve/plugins/subaddress/subaddress.sieve @@ -4,10 +4,11 @@ require "fileinto"; if address :comparator "i;ascii-casemap" :user "from" "STEPHAN" { discard; - if address :domain :comparator "i;octet" "from" "drunksnipers.com" { + if address :detail :comparator "i;octet" "from" "sieve" { keep; + stop; } - stop; + fileinto "INBOX.frop"; } keep; diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c index e553ed9fafd16da26fa10746b1ddddfe238ed54b..40b2f3d759c37a1ced6b8724bc5ce5ba2c6fd023 100644 --- a/src/lib-sieve/sieve-address-parts.c +++ b/src/lib-sieve/sieve-address-parts.c @@ -105,6 +105,8 @@ const struct sieve_address_part *sieve_address_part_find struct addrp_validator_registration *reg = (struct addrp_validator_registration *) hash_lookup(ctx->registrations, identifier); + + if ( reg == NULL ) return NULL; if ( ext_id != NULL ) *ext_id = reg->ext_id; @@ -159,7 +161,7 @@ static inline struct addrp_interpreter_context * sieve_interpreter_extension_get_context(interpreter, ext_my_id); } -const struct sieve_address_part_extension *sieve_address_part_extension_get +static const struct sieve_address_part_extension *sieve_address_part_extension_get (struct sieve_interpreter *interpreter, int ext_id) { struct addrp_interpreter_context *ctx = get_interpreter_context(interpreter); @@ -382,7 +384,7 @@ bool sieve_address_stringlist_match part = addrp->extract_from(addr); - if ( sieve_stringlist_match(key_list, part, cmp) ) + if ( part != NULL && sieve_stringlist_match(key_list, part, cmp) ) matched = TRUE; } diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h index e6ed4eb58e03d91d17b6f965e3857eda3c5c8688..e3abdb544ba79f5b2a3e51523819e500cac561ac 100644 --- a/src/lib-sieve/sieve-common.h +++ b/src/lib-sieve/sieve-common.h @@ -1,6 +1,8 @@ #ifndef __SIEVE_COMMON_H #define __SIEVE_COMMON_H +#include <sys/types.h> + /* * Predeclarations */