Skip to content

Commit

Permalink
lib-sieve: Fixed handling of quoted string localparts in email addres…
Browse files Browse the repository at this point in the history
…ses.
  • Loading branch information
stephanbosch committed Jul 6, 2016
1 parent ccc4e75 commit b3cfdd4
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 26 deletions.
7 changes: 6 additions & 1 deletion src/lib-sieve/plugins/vacation/cmd-vacation.c
Expand Up @@ -850,11 +850,16 @@ static inline bool _contains_my_address

while ( addr != NULL && !result ) {
if (addr->domain != NULL) {
struct sieve_address svaddr;
const char *hdr_address;

i_assert(addr->mailbox != NULL);

hdr_address = t_strconcat(addr->mailbox, "@", addr->domain, NULL);
memset(&svaddr, 0, sizeof(svaddr));
svaddr.local_part = addr->mailbox;
svaddr.domain = addr->domain;

hdr_address = sieve_address_to_string(&svaddr);
if ( sieve_address_compare(hdr_address, my_address, TRUE) == 0 ) {
result = TRUE;
break;
Expand Down
12 changes: 4 additions & 8 deletions src/lib-sieve/sieve-address-parts.c
Expand Up @@ -456,18 +456,14 @@ static const char *addrp_all_extract_from
(const struct sieve_address_part *addrp ATTR_UNUSED,
const struct sieve_address *address)
{
const char *local_part = address->local_part;
const char *domain = address->domain;

if ( domain == NULL ) {
return local_part;
if ( address->domain == NULL ) {
return address->local_part;
}

if ( local_part == NULL ) {
if ( address->local_part == NULL )
return NULL;
}

return t_strconcat(local_part, "@", domain, NULL);
return sieve_address_to_string(address);
}

static const char *addrp_domain_extract_from
Expand Down
3 changes: 0 additions & 3 deletions src/lib-sieve/sieve-address.c
Expand Up @@ -811,12 +811,10 @@ static int path_parse_local_part(struct sieve_envelope_address_parser *parser)
str_truncate(parser->str, 0);
if ( *parser->data == '"' ) {
/* Quoted-string = DQUOTE *qcontent DQUOTE */
str_append_c(parser->str, *parser->data);
parser->data++;

while ( parser->data < parser->end ) {
if ( *parser->data == '\\' ) {
str_append_c(parser->str, *parser->data);
parser->data++;

if ( parser->data < parser->end ) {
Expand All @@ -838,7 +836,6 @@ static int path_parse_local_part(struct sieve_envelope_address_parser *parser)
if ( *parser->data != '"' )
return -1;

str_append_c(parser->str, *parser->data);
parser->data++;

if ( (ret=path_skip_white_space(parser)) < 0 )
Expand Down
10 changes: 8 additions & 2 deletions src/lib-sieve/sieve.c
Expand Up @@ -1012,7 +1012,13 @@ const char *sieve_get_user_email

if ( strchr(username, '@') != 0 )
return username;
if ( svinst->domainname != NULL )
return t_strconcat(username, "@", svinst->domainname, NULL);
if ( svinst->domainname != NULL ) {
struct sieve_address svaddr;

memset(&svaddr, 0, sizeof(svaddr));
svaddr.local_part = username;
svaddr.domain = svinst->domainname;
return sieve_address_to_string(&svaddr);
}
return NULL;
}
34 changes: 30 additions & 4 deletions src/testsuite/testsuite-message.c
Expand Up @@ -9,6 +9,7 @@
#include "master-service.h"

#include "sieve-common.h"
#include "sieve-address.h"
#include "sieve-message.h"
#include "sieve-interpreter.h"

Expand Down Expand Up @@ -44,16 +45,23 @@ testsuite_message_get_address(struct mail *mail, const char *header)
{
struct message_address *addr;
const char *str;
struct sieve_address svaddr;

if (mail_get_first_header(mail, header, &str) <= 0)
return NULL;
addr = message_address_parse(pool_datastack_create(),
(const unsigned char *)str,
strlen(str), 1, FALSE);
return (addr == NULL ||
addr->mailbox == NULL || *addr->mailbox == '\0' ? NULL :
( addr->domain == NULL || *addr->domain == '\0' ? addr->mailbox :
t_strconcat(addr->mailbox, "@", addr->domain, NULL)));
if ( addr == NULL ||
addr->mailbox == NULL || *addr->mailbox == '\0' )
return NULL;
if ( addr->domain == NULL || *addr->domain == '\0' )
return addr->mailbox;

memset(&svaddr, 0, sizeof(svaddr));
svaddr.local_part = addr->mailbox;
svaddr.domain = addr->domain;
return sieve_address_to_string(&svaddr);
}

static void testsuite_message_set_data(struct mail *mail)
Expand Down Expand Up @@ -147,9 +155,23 @@ void testsuite_message_deinit(void)
pool_unref(&message_pool);
}

static void
normalize_address(const char **address)
{
const struct sieve_address *svaddr;

svaddr = sieve_address_parse_envelope_path
(pool_datastack_create(), *address);
if (svaddr == NULL)
return;
*address = sieve_address_to_string(svaddr);
}

void testsuite_envelope_set_sender
(const struct sieve_runtime_env *renv, const char *value)
{
normalize_address(&value);

sieve_message_context_reset(renv->msgctx);

str_truncate(envelope_from, 0);
Expand All @@ -163,6 +185,8 @@ void testsuite_envelope_set_sender
void testsuite_envelope_set_recipient
(const struct sieve_runtime_env *renv, const char *value)
{
normalize_address(&value);

sieve_message_context_reset(renv->msgctx);

str_truncate(envelope_to, 0);
Expand All @@ -177,6 +201,8 @@ void testsuite_envelope_set_recipient
void testsuite_envelope_set_orig_recipient
(const struct sieve_runtime_env *renv, const char *value)
{
normalize_address(&value);

sieve_message_context_reset(renv->msgctx);

str_truncate(envelope_orig_to, 0);
Expand Down
8 changes: 0 additions & 8 deletions tests/extensions/envelope.svtest
Expand Up @@ -54,14 +54,6 @@ test "Envelope - from empty" {
if envelope :all :is "from" "nico@frop.example.org" {
test_fail "envelope test matches nonsense";
}

/* Forward path: <> */

test_set "envelope.to" "<>";

if envelope :all :is "to" "" {
test_fail "successfully matched a <> forward path, which is wrong";
}
}

/*
Expand Down

0 comments on commit b3cfdd4

Please sign in to comment.