diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c index 6c4af73de9d5e54072c58c67e241e402d322dea6..297b23bd2f05c3e3dfd949f02f380b9b28b9eff1 100644 --- a/src/lib-sieve/sieve-address-parts.c +++ b/src/lib-sieve/sieve-address-parts.c @@ -371,6 +371,14 @@ static const char *addrp_all_extract_from const char *local_part = address->local_part; const char *domain = address->domain; + if ( domain == NULL ) { + return local_part; + } + + if ( local_part == NULL ) { + return NULL; + } + return t_strconcat(local_part, "@", domain, NULL); } diff --git a/src/lib-sieve/sieve-address.c b/src/lib-sieve/sieve-address.c index fd02b3a095772466a2c3a4afdb665c8ba7235a13..4121ac3b713cb76ed11bf197b362ffb47bada4cf 100644 --- a/src/lib-sieve/sieve-address.c +++ b/src/lib-sieve/sieve-address.c @@ -692,14 +692,14 @@ static int path_parse_mailbox(struct sieve_envelope_address_parser *parser) /* Mailbox = Local-part "@" Domain */ - if ( (ret=path_parse_local_part(parser)) <= 0 ) + if ( (ret=path_parse_local_part(parser)) < 0 + || (ret=path_skip_white_space(parser)) < 0 ) return -1; - if ( (ret=path_skip_white_space(parser)) <= 0 ) - return -1; + if ( ret == 0 || *parser->data != '@' ) { + return ret; + } - if ( *parser->data != '@' ) - return -1; parser->data++; if ( (ret=path_skip_white_space(parser)) <= 0 ) diff --git a/tests/extensions/envelope.svtest b/tests/extensions/envelope.svtest index 30c4e60bf2b46bee6ce656fa53a2facf3b992633..356ac8e7709bd6719b78bf204e7cee81bef886ac 100644 --- a/tests/extensions/envelope.svtest +++ b/tests/extensions/envelope.svtest @@ -67,10 +67,10 @@ test "Envelope - from empty" { test "Envelope - invalid paths" { /* Return_path: "hutsefluts" */ - test_set "envelope.from" "hutsefluts"; - test_set "envelope.to" "knurft"; + test_set "envelope.from" "hutsefluts@"; + test_set "envelope.to" "knurft@"; - if not envelope :all :is "from" "hutsefluts" { + if not envelope :all :is "from" "hutsefluts@" { test_fail ":all address part mangled syntactically incorrect reverse path"; } @@ -82,7 +82,7 @@ test "Envelope - invalid paths" { test_fail ":domain address part matched syntactically incorrect reverse path"; } - if not envelope :all :is "to" "knurft" { + if not envelope :all :is "to" "knurft@" { test_fail ":all address part mangled syntactically incorrect forward path"; } @@ -216,3 +216,30 @@ test "Envelope - source route errors" { test_fail ":all address part mangled syntactically incorrect path"; } } + +test "Envelope - local part only" { + test_set "envelope.to" "<MAILER-DAEMON>"; + if not envelope :is "to" "MAILER-DAEMON" { + test_fail "failed to parse local_part only path"; + } + + test_set "envelope.to" "MAILER-DAEMON@"; + if envelope :is "to" "MAILER-DAEMON" { + test_fail "parsing syntactically incorrect path with missing domain"; + } + + test_set "envelope.to" "<MAILER-DAEMON>"; + if not envelope :is "to" "MAILER-DAEMON" { + test_fail "failed to parse local_part only path with angle brackets"; + } + + test_set "envelope.to" "<MAILER-DAEMON >"; + if not envelope :is "to" "MAILER-DAEMON" { + test_fail "failed to parse local_part only path with angle brackets and whitespace"; + } + + test_set "envelope.to" " MAILER-DAEMON "; + if not envelope :is "to" "MAILER-DAEMON" { + test_fail "failed to parse local_part only path with whitespace"; + } +}