annotate src/lib-mail/message-address.c @ 22153:528bd5a67923

lib-mail: message_address_write: Fix generating empty group list Empty group list ends with ": " not with ", ". Test case: { { name = NULL, mailbox = "group", domain = NULL }, { name = NULL, mailbox = NULL, domain = NULL } } converts to: group:;
author Pali Rohár <pali.rohar@gmail.com>
date Sun, 05 Jun 2016 15:48:14 +0200
parents 2e2563132d5f
children 91278ef69de7
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
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
161 str_truncate(ctx->parser.last_comment, 0);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
162
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
163 ret = parse_local_part(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
164 if (ret != 0 && *ctx->parser.data == '@') {
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
165 ret2 = parse_domain(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
166 if (ret2 <= 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
167 ret = ret2;
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
168 }
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 if (str_len(ctx->parser.last_comment) > 0) {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
171 ctx->addr.name =
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
172 p_strdup(ctx->pool, str_c(ctx->parser.last_comment));
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
173 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
174 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
175 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
176
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
177 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
178 {
8169
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
179 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
180 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
181 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
182 }
cb01142bb9e8 message address parser: Check better if adress is invalid and set invalid_syntax.
Timo Sirainen <tss@iki.fi>
parents: 8167
diff changeset
183 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
184 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
185 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
186 }
8167
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
187 add_address(ctx);
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
188 }
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
189
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
190 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
191 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
192 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
193 int ret;
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 /* 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
196 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
197 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
198 /* 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
199 ctx->parser.data = start;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
200 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
201 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
202
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
203 if (ret < 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
204 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
205 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
206 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
207 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
208
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
209 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
210 {
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
211 int ret;
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
212
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
213 /*
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
214 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
215 display-name = phrase
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 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
218 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
219 *ctx->parser.data != ':')
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
220 return -1;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
221
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
222 /* 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
223 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
224 ctx->parser.data++;
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
225 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
226 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
227
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
228 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
229 add_address(ctx);
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
230
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
231 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
232 for (;;) {
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
233 /* mailbox-list =
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
234 (mailbox *("," mailbox)) / obs-mbox-list */
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
235 if (parse_mailbox(ctx) <= 0) {
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
236 ret = -1;
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
237 break;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
238 }
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
239 if (*ctx->parser.data != ',')
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 ctx->parser.data++;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
242 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
243 ret = -1;
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
244 break;
8202
79b29796d239 message address parser: Fixed some assert-crashes.
Timo Sirainen <tss@iki.fi>
parents: 8171
diff changeset
245 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
246 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
247 }
11036
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
248 if (ret >= 0) {
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
249 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
250 ret = -1;
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
251 else {
ae8294182346 message address parser: Fixed potential problems with parsing invalid address groups.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
252 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 = 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
254 }
8877
e5658894cd13 Message address parser didn't handle empty group:; correctly.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
255 }
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
256 if (ret < 0)
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
257 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
258
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
259 add_address(ctx);
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
260 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
261 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
262
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
263 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
264 {
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
265 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
266 int ret;
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 /* address = mailbox / group */
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
269 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
270 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
271 /* 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
272 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
273 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
274 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
275 return ret;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
276 }
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
277
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
278 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
279 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
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 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
282
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
283 /* 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
284 while (max_addresses > 0) {
2d5f8e678f7c global: Avoid loops unnecessarily decreasing below zero.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
285 max_addresses--;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
286 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
287 break;
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
288 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
289 ret = -1;
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
290 break;
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
291 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
292 ctx->parser.data++;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
293 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
294 if (ret < 0) {
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
295 /* ends with some garbage */
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
296 add_fixed_address(ctx);
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
297 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
298 break;
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
299 }
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
300 }
8166
a1f6c93afbc2 message address parser: Set invalid_syntax=TRUE if the input is invalid.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
301 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
302 }
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
304 static struct message_address *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
305 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
306 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
307 {
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
308 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
309
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
310 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
311
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
312 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
313 ctx.pool = pool;
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
314 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
315 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
316
8321
b62e350500c9 Fixed message address assert-crashing if the entire input was invalid.
Timo Sirainen <tss@iki.fi>
parents: 8202
diff changeset
317 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
318 /* no addresses */
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
319 return NULL;
99704b6b8dde message address parser: Handle errors better, fix crash in previous change.
Timo Sirainen <tss@iki.fi>
parents: 8166
diff changeset
320 }
8171
60b8c2609087 message address parser: More error handling improvements.
Timo Sirainen <tss@iki.fi>
parents: 8169
diff changeset
321 (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
322 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
323 }
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
325 struct message_address *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
326 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
327 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
328 {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
329 struct message_address *addr;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
330
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
331 if (pool->datastack_pool) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
332 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
333 max_addresses, fill_missing);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
334 }
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
335 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
336 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
337 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
338 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
339 return addr;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
340 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
341
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
342 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
343 {
22153
528bd5a67923 lib-mail: message_address_write: Fix generating empty group list
Pali Rohár <pali.rohar@gmail.com>
parents: 21390
diff changeset
344 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
345 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
346
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
347 /* a) mailbox@domain
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
348 b) name <@route:mailbox@domain>
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
349 c) group: .. ; */
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
350
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
351 while (addr != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
352 if (first)
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
353 first = FALSE;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
354 else
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
355 str_append(str, ", ");
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
356
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
357 if (addr->domain == NULL) {
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
358 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
359 /* 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
360 name, others are NULL. */
3039
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
361 if (addr->mailbox != NULL)
d6910d273852 Added rfc822 parser which will probably replace message_tokenizer at some
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
362 str_append(str, addr->mailbox);
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
363 str_append(str, ": ");
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
364 first = TRUE;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
365 } 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
366 /* 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
367 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
368
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
369 /* 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
370 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
371 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
372 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
373 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
374 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
375 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
376 str_append_c(str, ';');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
377 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
378
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
379 in_group = !in_group;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
380 } 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
381 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
382 /* 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
383 i_assert(addr->mailbox != NULL);
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 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
386 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
387 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
388 } 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
389 /* 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
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 if (addr->name != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
393 str_append(str, addr->name);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
394 str_append_c(str, ' ');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
395 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
396 str_append_c(str, '<');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
397 if (addr->route != NULL) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
398 str_append(str, addr->route);
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
399 str_append_c(str, ':');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
400 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
401 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
402 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
403 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
404 str_append_c(str, '>');
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
405 }
1279
b14d1f375039 message_address_write() didn't work.
Timo Sirainen <tss@iki.fi>
parents: 1278
diff changeset
406
b14d1f375039 message_address_write() didn't work.
Timo Sirainen <tss@iki.fi>
parents: 1278
diff changeset
407 addr = addr->next;
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
408 }
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
409 }
13097
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
410
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
411 static const char *address_headers[] = {
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
412 "From", "Sender", "Reply-To",
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
413 "To", "Cc", "Bcc",
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
414 "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
415 };
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
416
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
417 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
418 {
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
419 unsigned int i;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
420
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
421 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
422 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
423 return TRUE;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
424 }
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
425 return FALSE;
e07c5cb0ae60 lib-mail: Added message_header_is_address()
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
426 }