Skip to content

Commit

Permalink
subaddress: Support multiple recipient_delimiters
Browse files Browse the repository at this point in the history
The recipient_delimiter is treated as multiple one-character delimiters
rather than one multi-character delimiter if more than one character is
supplied.

Based on a patch by: Lennart Weller <lhw@ring0.de>
  • Loading branch information
aclindsa authored and stephanbosch committed May 15, 2016
1 parent daf1c25 commit dd0f8d1
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 21 deletions.
14 changes: 8 additions & 6 deletions src/lib-sieve/plugins/subaddress/ext-subaddress.c
Expand Up @@ -143,8 +143,10 @@ static const char *subaddress_user_extract_from
struct ext_subaddress_config *config =
(struct ext_subaddress_config *) addrp->object.ext->context;
const char *delim;
size_t idx;

delim = strstr(address->local_part, config->delimiter);
idx = strcspn(address->local_part, config->delimiter);
delim = address->local_part[idx] != '\0' ? address->local_part + idx : NULL;

if ( delim == NULL ) return address->local_part;

Expand All @@ -157,14 +159,14 @@ static const char *subaddress_detail_extract_from
struct ext_subaddress_config *config =
(struct ext_subaddress_config *) addrp->object.ext->context;
const char *delim;
size_t idx;

if ( (delim=strstr(address->local_part, config->delimiter)) == NULL )
return NULL;

delim += strlen(config->delimiter);
idx = strcspn(address->local_part, config->delimiter);
delim = address->local_part[idx] != '\0' ? address->local_part + idx + 1: NULL;

/* Just to be sure */
if ( delim > (address->local_part + strlen(address->local_part)) )
if ( delim == NULL ||
delim > (address->local_part + strlen(address->local_part)) )
return NULL;

return delim;
Expand Down
38 changes: 23 additions & 15 deletions tests/extensions/subaddress/config.svtest
Expand Up @@ -11,8 +11,8 @@ Test!
.
;

test_set "envelope.to" "friep++frop@dovecot.example.net";
test_set "envelope.from" "list--request@lists.dovecot.example.net";
test_set "envelope.to" "friep+-frop@dovecot.example.net";
test_set "envelope.from" "list_request@lists.dovecot.example.net";

test "Delimiter default" {
if not address :is :user "from" "stephan" {
Expand All @@ -37,41 +37,49 @@ test "Delimiter \"-\"" {
}
}

test "Delimiter \"++\"" {
test_config_set "recipient_delimiter" "++";
test "Delimiter \"+-\"" {
test_config_set "recipient_delimiter" "+-";
test_config_reload :extension "subaddress";

if not envelope :is :user "to" "friep" {
test_fail "wrong user part extracted";
}

if not envelope :is :detail "to" "frop" {
if not envelope :is :detail "to" "-frop" {
test_fail "wrong detail part extracted";
}
}

test "Delimiter \"--\"" {
test_config_set "recipient_delimiter" "--";
test "Delimiter \"-+\"" {
test_config_set "recipient_delimiter" "-+";
test_config_reload :extension "subaddress";

if not envelope :is :user "from" "list" {
if not envelope :is :user "to" "friep" {
test_fail "wrong user part extracted";
}

if not envelope :is :detail "from" "request" {
if not envelope :is :detail "to" "-frop" {
test_fail "wrong detail part extracted";
}
}

test "Delimiter \"+-\"" {
test_config_set "recipient_delimiter" "+-";
test "Delimiter \"+-_\"" {
test_config_set "recipient_delimiter" "+-_";
test_config_reload :extension "subaddress";

if envelope :is :user "from" "list" {
test_fail "user part extracted";
if not envelope :is :user "to" "friep" {
test_fail "wrong user part extracted";
}

if not envelope :is :detail "to" "-frop" {
test_fail "wrong detail part extracted";
}

if envelope :is :detail "from" "request" {
test_fail "detail part extracted";
if not envelope :is :user "from" "list" {
test_fail "wrong user part extracted";
}

if not envelope :is :detail "from" "request" {
test_fail "wrong detail part extracted";
}
}

0 comments on commit dd0f8d1

Please sign in to comment.