return 1;
}
-static int parse_angle_addr(struct message_address_parser_context *ctx)
+static int parse_angle_addr(struct message_address_parser_context *ctx,
+ bool parsing_path)
{
/* "<" [ "@" route ":" ] local-part "@" domain ">" */
i_assert(*ctx->parser.data == '<');
return -1;
if (*ctx->parser.data == '@') {
- if (parse_domain_list(ctx) <= 0 || *ctx->parser.data != ':') {
+ if (parse_domain_list(ctx) > 0 && *ctx->parser.data == ':') {
+ ctx->parser.data++;
+ } else if (parsing_path && *ctx->parser.data != ':') {
+ return -1;
+ } else {
if (ctx->fill_missing)
ctx->addr.route = "INVALID_ROUTE";
if (ctx->parser.data >= ctx->parser.end)
return -1;
/* try to continue anyway */
- } else {
- ctx->parser.data++;
}
if (rfc822_skip_lwsp(&ctx->parser) <= 0)
return -1;
/* Cope with "<address>" without display name */
ctx->addr.name = NULL;
}
- if (parse_angle_addr(ctx) < 0) {
+ if (parse_angle_addr(ctx, FALSE) < 0) {
/* broken */
if (ctx->fill_missing)
ctx->addr.domain = "SYNTAX_ERROR";
return -1;
if (*ctx->parser.data != '<')
return -1;
- if ((ret=parse_angle_addr(ctx)) < 0 ||
+ if ((ret=parse_angle_addr(ctx, TRUE)) < 0 ||
(ctx->addr.mailbox != NULL && ctx->addr.domain == NULL)) {
ctx->addr.invalid_syntax = TRUE;
ret = -1;