diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c index 1d85469f7873ab9fd40931ac890853aeb50d18ec..01f1c892f86b7b4cf7a35b80c99f8e53e768f8f3 100644 --- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c +++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c @@ -119,8 +119,6 @@ static const char *subaddress_user_extract_from { const char *sep; - if ( address->local_part == NULL ) return NULL; - sep = strstr(address->local_part, sieve_subaddress_sep); if ( sep == NULL ) return address->local_part; @@ -133,8 +131,6 @@ static const char *subaddress_detail_extract_from { const char *sep; - if ( address->local_part == NULL ) return NULL; - if ( (sep=strstr(address->local_part, sieve_subaddress_sep)) == NULL ) return NULL; diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c index 208b0f81457658cd55192bcb0dbef0a2e2541510..064c358de139dde112d0b7942a0b9b3793e817c6 100644 --- a/src/lib-sieve/sieve-address-parts.c +++ b/src/lib-sieve/sieve-address-parts.c @@ -242,14 +242,15 @@ int sieve_address_match struct sieve_address address; const char *part; - address.local_part = addr->mailbox; - address.domain = addr->domain; - - part = addrp->extract_from(&address); - - if ( part != NULL ) - result = sieve_match_value(mctx, part, strlen(part)); + if ( addr->domain != NULL ) { + address.local_part = addr->mailbox; + address.domain = addr->domain; + + part = addrp->extract_from(&address); + if ( part != NULL ) + result = sieve_match_value(mctx, part, strlen(part)); + } addr = addr->next; } } @@ -340,8 +341,8 @@ bool sieve_addrmatch_default_get_optionals static const char *addrp_all_extract_from (const struct sieve_address *address) { - const char *local_part = address->local_part == NULL ? "" : address->local_part; - const char *domain = address->domain == NULL ? "" : address->domain; + const char *local_part = address->local_part; + const char *domain = address->domain; return t_strconcat(local_part, "@", domain, NULL); } diff --git a/tests/address.svtest b/tests/address.svtest index 8842c058c99141051f02faae1d8f4d57f531b253..2b54bb06ec6bb24ddb7d12b324bc626191a6fa12 100644 --- a/tests/address.svtest +++ b/tests/address.svtest @@ -58,6 +58,29 @@ test "Invalid address list" { } } +/* + * Undisclosed recipients + */ + +test_set "message" text: +From: stephan@ +To: undisclosed-recipients:; +Subject: Invalid addresses + +Test. +. +; + +test "Undisclosed recipients" { + if address :is :domain "to" "undisclosed-recipients:;" { + test_fail ":domain matched group name"; + } + + if address :is :localpart "to" "undisclosed-recipients:;" { + test_fail ":localpart matched group name"; + } +} + /* * Strange */ @@ -84,3 +107,5 @@ test "Questionable address" { test_fail "message domain not recognized"; } } + + diff --git a/tests/extensions/subaddress/basic.svtest b/tests/extensions/subaddress/basic.svtest index 1292ed0bd9aaa5e38102aa9bd5e6aaef44e001e7..695d2999771b79f7b7e1e83558bc28ee0e0950ed 100644 --- a/tests/extensions/subaddress/basic.svtest +++ b/tests/extensions/subaddress/basic.svtest @@ -14,7 +14,7 @@ Test! test_set "envelope.to" "friep+frop@dovecot.org"; test_set "envelope.from" "list+request@lists.dovecot.org"; -test "USER-message-from" { +test "Address from :user" { if not address :is :user "from" "stephan" { test_fail "wrong user part extracted"; } @@ -24,7 +24,7 @@ test "USER-message-from" { } } -test "DETAIL-message-from" { +test "Address from :detail" { if not address :is :detail "from" "sieve" { test_fail "wrong user part extracted"; } @@ -34,7 +34,7 @@ test "DETAIL-message-from" { } } -test "USER-message-to" { +test "Address to :user" { if not address :contains :user "to" "est" { test_fail "wrong user part extracted"; } @@ -44,7 +44,7 @@ test "USER-message-to" { } } -test "DETAIL-message-to" { +test "Address to :detail" { if not address :contains :detail "to" "fai" { test_fail "wrong user part extracted"; } @@ -55,7 +55,7 @@ test "DETAIL-message-to" { } -test "ENVELOPE-to" { +test "Envelope :user" { if not envelope :is :user "to" "friep" { test_fail "wrong user part extracted 1"; } @@ -69,7 +69,7 @@ test "ENVELOPE-to" { } } -test "ENVELOPE-from" { +test "Envelope :detail" { if not envelope :comparator "i;ascii-casemap" :contains :detail "from" "QUES" { test_fail "wrong user part extracted"; } @@ -78,3 +78,22 @@ test "ENVELOPE-from" { test_fail "address test failed"; } } + +test_set "message" text: +From: frop@examples.com +To: undisclosed-recipients:; +Subject: subaddress test + +Test! +. +; + +test "Undisclosed-recipients" { + if address :detail :contains "to" "undisclosed-recipients" { + test_fail ":detail matched group name"; + } + + if address :user :contains "to" "undisclosed-recipients" { + test_fail ":user matched group name"; + } +}