annotate src/lib-mail/message-address.c @ 22155:fe6b566d6f1c

lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL This will fix possible NULL pointer dereference when caller does not set last_comment.
author Pali Rohár <pali.rohar@gmail.com>
date Sun, 05 Jun 2016 15:48:16 +0200
parents 91278ef69de7
children b37395fd83cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "str.h"
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
5 #include "message-parser.h"
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "message-address.h"
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
7 #include "rfc822-parser.h"
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
9 struct message_address_parser_context {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
10 pool_t pool;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
11 struct rfc822_parser_context parser;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
12
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
13 struct message_address *first_addr, *last_addr, addr;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
14 string_t *str;
4635
210bb1ff0e6e Added fill_missing parameter to message_address_parse() which specifies if
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
15
210bb1ff0e6e Added fill_missing parameter to message_address_parse() which specifies if
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
16 bool fill_missing;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
17 };
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
18
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
19 static void add_address(struct message_address_parser_context *ctx)
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 {
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct message_address *addr;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
23 addr = p_new(ctx->pool, struct message_address, 1);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
24
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
25 memcpy(addr, &ctx->addr, sizeof(ctx->addr));
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21211
diff changeset
26 i_zero(&ctx->addr);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
27
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
28 if (ctx->first_addr == NULL)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
29 ctx->first_addr = addr;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
30 else
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
31 ctx->last_addr->next = addr;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
32 ctx->last_addr = addr;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
33 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
34
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
35 static int parse_local_part(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
36 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
37 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
38
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
39 /*
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
40 local-part = dot-atom / quoted-string / obs-local-part
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
41 obs-local-part = word *("." word)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
42 */
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
43 i_assert(ctx->parser.data != ctx->parser.end);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
44
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
45 str_truncate(ctx->str, 0);
3275
7892e3febad6 local-part in message address can be quoted-string as well.
Timo Sirainen <tss@iki.fi>
parents: 3225
diff changeset
46 if (*ctx->parser.data == '"')
7892e3febad6 local-part in message address can be quoted-string as well.
Timo Sirainen <tss@iki.fi>
parents: 3225
diff changeset
47 ret = rfc822_parse_quoted_string(&ctx->parser, ctx->str);
7892e3febad6 local-part in message address can be quoted-string as well.
Timo Sirainen <tss@iki.fi>
parents: 3225
diff changeset
48 else
7892e3febad6 local-part in message address can be quoted-string as well.
Timo Sirainen <tss@iki.fi>
parents: 3225
diff changeset
49 ret = rfc822_parse_dot_atom(&ctx->parser, ctx->str);
7892e3febad6 local-part in message address can be quoted-string as well.
Timo Sirainen <tss@iki.fi>
parents: 3225
diff changeset
50 if (ret < 0)
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
51 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
52
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
53 ctx->addr.mailbox = p_strdup(ctx->pool, str_c(ctx->str));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
54 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
55 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
56
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
57 static int parse_domain(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
58 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
59 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
60
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
61 str_truncate(ctx->str, 0);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
62 if ((ret = rfc822_parse_domain(&ctx->parser, ctx->str)) < 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
63 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
64
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
65 ctx->addr.domain = p_strdup(ctx->pool, str_c(ctx->str));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
66 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
67 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
68
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
69 static int parse_domain_list(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
70 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
71 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
72
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
73 /* obs-domain-list = "@" domain *(*(CFWS / "," ) [CFWS] "@" domain) */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
74 str_truncate(ctx->str, 0);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
75 for (;;) {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
76 if (ctx->parser.data == ctx->parser.end)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
77 return 0;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
78
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
79 if (*ctx->parser.data != '@')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
80 break;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
81
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
82 if (str_len(ctx->str) > 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
83 str_append_c(ctx->str, ',');
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
84
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
85 str_append_c(ctx->str, '@');
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
86 if ((ret = rfc822_parse_domain(&ctx->parser, ctx->str)) <= 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
87 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
88
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
89 while (rfc822_skip_lwsp(&ctx->parser) > 0 &&
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
90 *ctx->parser.data == ',')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
91 ctx->parser.data++;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
92 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
93 ctx->addr.route = p_strdup(ctx->pool, str_c(ctx->str));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
94 return 1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
95 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
96
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
97 static int parse_angle_addr(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
98 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
99 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
100
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
101 /* "<" [ "@" route ":" ] local-part "@" domain ">" */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
102 i_assert(*ctx->parser.data == '<');
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
103 ctx->parser.data++;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
104
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
105 if ((ret = rfc822_skip_lwsp(&ctx->parser)) <= 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
106 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
107
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
108 if (*ctx->parser.data == '@') {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
109 if (parse_domain_list(ctx) <= 0 || *ctx->parser.data != ':') {
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
110 ctx->addr.route = "INVALID_ROUTE";
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
111 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
112 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
113 ctx->parser.data++;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
114 if ((ret = rfc822_skip_lwsp(&ctx->parser)) <= 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
115 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
116 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
117
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
118 if ((ret = parse_local_part(ctx)) <= 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
119 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
120 if (*ctx->parser.data == '@') {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
121 if ((ret = parse_domain(ctx)) <= 0)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
122 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
123 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
124
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
125 if (*ctx->parser.data != '>')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
126 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
127 ctx->parser.data++;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
128
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
129 return rfc822_skip_lwsp(&ctx->parser);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
130 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
131
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
132 static int parse_name_addr(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
133 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
134 /*
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
135 name-addr = [display-name] angle-addr
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
136 display-name = phrase
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
137 */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
138 str_truncate(ctx->str, 0);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
139 if (rfc822_parse_phrase(&ctx->parser, ctx->str) <= 0 ||
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
140 *ctx->parser.data != '<')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
141 return -1;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
143 ctx->addr.name = p_strdup(ctx->pool, str_c(ctx->str));
3496
51bf11f92c07 If address doesn't have a name, return it as NULL instead of "". This fixes
Timo Sirainen <tss@iki.fi>
parents: 3275
diff changeset
144 if (*ctx->addr.name == '\0') {
51bf11f92c07 If address doesn't have a name, return it as NULL instead of "". This fixes
Timo Sirainen <tss@iki.fi>
parents: 3275
diff changeset
145 /* Cope with "<address>" without display name */
51bf11f92c07 If address doesn't have a name, return it as NULL instead of "". This fixes
Timo Sirainen <tss@iki.fi>
parents: 3275
diff changeset
146 ctx->addr.name = NULL;
51bf11f92c07 If address doesn't have a name, return it as NULL instead of "". This fixes
Timo Sirainen <tss@iki.fi>
parents: 3275
diff changeset
147 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
148 if (parse_angle_addr(ctx) < 0) {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
149 /* broken */
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
150 ctx->addr.domain = "SYNTAX_ERROR";
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
151 ctx->addr.invalid_syntax = TRUE;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
152 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
153 return ctx->parser.data != ctx->parser.end;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
154 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
155
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
156 static int parse_addr_spec(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
157 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
158 /* addr-spec = local-part "@" domain */
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
159 int ret, ret2;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
160
22155
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
161 if (ctx->parser.last_comment != NULL)
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
162 str_truncate(ctx->parser.last_comment, 0);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
163
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
164 ret = parse_local_part(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
165 if (ret != 0 && *ctx->parser.data == '@') {
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
166 ret2 = parse_domain(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
167 if (ret2 <= 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
168 ret = ret2;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
169 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
170
22155
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
171 if (ctx->parser.last_comment != NULL) {
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
172 if (str_len(ctx->parser.last_comment) > 0) {
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
173 ctx->addr.name =
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
174 p_strdup(ctx->pool, str_c(ctx->parser.last_comment));
fe6b566d6f1c lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
Pali Rohár <pali.rohar@gmail.com>
parents: 22154
diff changeset
175 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
176 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
177 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
178 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
179
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
180 static void add_fixed_address(struct message_address_parser_context *ctx)
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
181 {
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
182 if (ctx->addr.mailbox == NULL) {
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
183 ctx->addr.mailbox = !ctx->fill_missing ? "" : "MISSING_MAILBOX";
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
184 ctx->addr.invalid_syntax = TRUE;
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
185 }
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
186 if (ctx->addr.domain == NULL) {
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
187 ctx->addr.domain = !ctx->fill_missing ? "" : "MISSING_DOMAIN";
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
188 ctx->addr.invalid_syntax = TRUE;
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
189 }
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
190 add_address(ctx);
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
191 }
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
192
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
193 static int parse_mailbox(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
194 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
195 const unsigned char *start;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
196 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
197
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
198 /* mailbox = name-addr / addr-spec */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
199 start = ctx->parser.data;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
200 if ((ret = parse_name_addr(ctx)) < 0) {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
201 /* nope, should be addr-spec */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
202 ctx->parser.data = start;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
203 ret = parse_addr_spec(ctx);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
204 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
205
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
206 if (ret < 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
207 ctx->addr.invalid_syntax = TRUE;
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
208 add_fixed_address(ctx);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
209 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
210 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
211
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
212 static int parse_group(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
213 {
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
214 int ret;
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
215
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
216 /*
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
217 group = display-name ":" [mailbox-list / CFWS] ";" [CFWS]
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
218 display-name = phrase
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
219 */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
220 str_truncate(ctx->str, 0);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
221 if (rfc822_parse_phrase(&ctx->parser, ctx->str) <= 0 ||
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
222 *ctx->parser.data != ':')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
223 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
224
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
225 /* from now on don't return -1 even if there are problems, so that
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
226 the caller knows this is a group */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
227 ctx->parser.data++;
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
228 if ((ret = rfc822_skip_lwsp(&ctx->parser)) <= 0)
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
229 ctx->addr.invalid_syntax = TRUE;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
230
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
231 ctx->addr.mailbox = p_strdup(ctx->pool, str_c(ctx->str));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
232 add_address(ctx);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
233
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
234 if (ret > 0 && *ctx->parser.data != ';') {
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
235 for (;;) {
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
236 /* mailbox-list =
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
237 (mailbox *("," mailbox)) / obs-mbox-list */
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
238 if (parse_mailbox(ctx) <= 0) {
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
239 ret = -1;
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
240 break;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
241 }
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
242 if (*ctx->parser.data != ',')
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
243 break;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
244 ctx->parser.data++;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
245 if (rfc822_skip_lwsp(&ctx->parser) <= 0) {
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
246 ret = -1;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
247 break;
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
248 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
249 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
250 }
11036
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
251 if (ret >= 0) {
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
252 if (*ctx->parser.data != ';')
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
253 ret = -1;
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
254 else {
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
255 ctx->parser.data++;
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
256 ret = rfc822_skip_lwsp(&ctx->parser);
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
257 }
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
258 }
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
259 if (ret < 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
260 ctx->addr.invalid_syntax = TRUE;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
261
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
262 add_address(ctx);
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
263 return ret == 0 ? 0 : 1;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
264 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
265
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
266 static int parse_address(struct message_address_parser_context *ctx)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
267 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
268 const unsigned char *start;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
269 int ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
270
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
271 /* address = mailbox / group */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
272 start = ctx->parser.data;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
273 if ((ret = parse_group(ctx)) < 0) {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
274 /* not a group, try mailbox */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
275 ctx->parser.data = start;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
276 ret = parse_mailbox(ctx);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
277 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
278 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
279 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
280
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
281 static int parse_address_list(struct message_address_parser_context *ctx,
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
282 unsigned int max_addresses)
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
283 {
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
284 int ret = 0;
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
285
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
286 /* address-list = (address *("," address)) / obs-addr-list */
21211
2d5f8e678f7c global: Avoid loops unnecessarily decreasing below zero.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
287 while (max_addresses > 0) {
2d5f8e678f7c global: Avoid loops unnecessarily decreasing below zero.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
288 max_addresses--;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
289 if ((ret = parse_address(ctx)) == 0)
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
290 break;
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
291 if (*ctx->parser.data != ',') {
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
292 ret = -1;
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
293 break;
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
294 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
295 ctx->parser.data++;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
296 if ((ret = rfc822_skip_lwsp(&ctx->parser)) <= 0) {
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
297 if (ret < 0) {
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
298 /* ends with some garbage */
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
299 add_fixed_address(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
300 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
301 break;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
302 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
303 }
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
304 return ret;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 }
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
307 static struct message_address *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
308 message_address_parse_real(pool_t pool, const unsigned char *data, size_t size,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
309 unsigned int max_addresses, bool fill_missing)
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 {
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
311 struct message_address_parser_context ctx;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21211
diff changeset
313 i_zero(&ctx);
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
315 rfc822_parser_init(&ctx.parser, data, size, t_str_new(128));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
316 ctx.pool = pool;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
317 ctx.str = t_str_new(128);
4635
210bb1ff0e6e Added fill_missing parameter to message_address_parse() which specifies if
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
318 ctx.fill_missing = fill_missing;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
8321
b62e350500c9 Fixed message address assert-crashing if the entire input was invalid.
Timo Sirainen <tss@iki.fi>
parents: 8202
diff changeset
320 if (rfc822_skip_lwsp(&ctx.parser) <= 0) {
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
321 /* no addresses */
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
322 return NULL;
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
323 }
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
324 (void)parse_address_list(&ctx, max_addresses);
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
325 return ctx.first_addr;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 }
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
328 struct message_address *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
329 message_address_parse(pool_t pool, const unsigned char *data, size_t size,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
330 unsigned int max_addresses, bool fill_missing)
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
331 {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
332 struct message_address *addr;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
333
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
334 if (pool->datastack_pool) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
335 return message_address_parse_real(pool, data, size,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
336 max_addresses, fill_missing);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
337 }
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
338 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
339 addr = message_address_parse_real(pool, data, size,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
340 max_addresses, fill_missing);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
341 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
342 return addr;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
343 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
344
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
345 void message_address_write(string_t *str, const struct message_address *addr)
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
346 {
22153
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
347 const char *tmp;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3496
diff changeset
348 bool first = TRUE, in_group = FALSE;
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
349
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
350 /* a) mailbox@domain
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
351 b) name <@route:mailbox@domain>
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
352 c) group: .. ; */
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
353
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
354 while (addr != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
355 if (first)
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
356 first = FALSE;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
357 else
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
358 str_append(str, ", ");
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
359
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
360 if (addr->domain == NULL) {
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
361 if (!in_group) {
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
362 /* beginning of group. mailbox is the group
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
363 name, others are NULL. */
22154
91278ef69de7 lib-mail: message_address_write: Fix generating group list with empty name
Pali Rohár <pali.rohar@gmail.com>
parents: 22153
diff changeset
364 if (addr->mailbox != NULL && *addr->mailbox != '\0') {
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
365 str_append(str, addr->mailbox);
22154
91278ef69de7 lib-mail: message_address_write: Fix generating group list with empty name
Pali Rohár <pali.rohar@gmail.com>
parents: 22153
diff changeset
366 } else {
91278ef69de7 lib-mail: message_address_write: Fix generating group list with empty name
Pali Rohár <pali.rohar@gmail.com>
parents: 22153
diff changeset
367 /* empty group name needs to be quoted */
91278ef69de7 lib-mail: message_address_write: Fix generating group list with empty name
Pali Rohár <pali.rohar@gmail.com>
parents: 22153
diff changeset
368 str_append(str, "\"\"");
91278ef69de7 lib-mail: message_address_write: Fix generating group list with empty name
Pali Rohár <pali.rohar@gmail.com>
parents: 22153
diff changeset
369 }
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
370 str_append(str, ": ");
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
371 first = TRUE;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
372 } else {
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
373 /* end of group. all fields should be NULL. */
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
374 i_assert(addr->mailbox == NULL);
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
375
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
376 /* cut out the ", " */
22153
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
377 tmp = str_c(str)+str_len(str)-2;
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
378 i_assert((tmp[0] == ',' || tmp[0] == ':') && tmp[1] == ' ');
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
379 if (tmp[0] == ',' && tmp[1] == ' ')
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
380 str_truncate(str, str_len(str)-2);
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
381 else if (tmp[0] == ':' && tmp[1] == ' ')
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
382 str_truncate(str, str_len(str)-1);
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
383 str_append_c(str, ';');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
384 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
385
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
386 in_group = !in_group;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
387 } else if ((addr->name == NULL || *addr->name == '\0') &&
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
388 addr->route == NULL) {
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
389 /* no name and no route. use only mailbox@domain */
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
390 i_assert(addr->mailbox != NULL);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
391
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
392 str_append(str, addr->mailbox);
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
393 str_append_c(str, '@');
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
394 str_append(str, addr->domain);
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
395 } else {
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
396 /* name and/or route. use full <mailbox@domain> Name */
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
397 i_assert(addr->mailbox != NULL);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
398
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
399 if (addr->name != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
400 str_append(str, addr->name);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
401 str_append_c(str, ' ');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
402 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
403 str_append_c(str, '<');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
404 if (addr->route != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
405 str_append(str, addr->route);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
406 str_append_c(str, ':');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
407 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
408 str_append(str, addr->mailbox);
3201
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
409 str_append_c(str, '@');
2bf86099376e If mailbox name was missing from message address, we didn't set it to
Timo Sirainen <tss@iki.fi>
parents: 3044
diff changeset
410 str_append(str, addr->domain);
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
411 str_append_c(str, '>');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
412 }
1279
b14d1f375039 message_address_write() didn't work.
Timo Sirainen <tss@iki.fi>
parents: 1278
diff changeset
413
b14d1f375039 message_address_write() didn't work.
Timo Sirainen <tss@iki.fi>
parents: 1278
diff changeset
414 addr = addr->next;
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
415 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
416 }
13097
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
417
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
418 static const char *address_headers[] = {
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
419 "From", "Sender", "Reply-To",
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
420 "To", "Cc", "Bcc",
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
421 "Resent-From", "Resent-Sender", "Resent-To", "Resent-Cc", "Resent-Bcc"
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
422 };
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
423
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
424 bool message_header_is_address(const char *hdr_name)
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
425 {
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
426 unsigned int i;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
427
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
428 for (i = 0; i < N_ELEMENTS(address_headers); i++) {
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
429 if (strcasecmp(hdr_name, address_headers[i]) == 0)
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
430 return TRUE;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
431 }
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
432 return FALSE;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
433 }