Mercurial > dovecot > core-2.2
annotate src/lib-imap/imap-bodystructure.c @ 21294:dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Both imap_bodystructure_write() and imap_body_parse_from_bodystructure() produced such invalid output.
This caused an RFC 3501 violation in IMAP FETCH BODY and BODYSTRUCTURE responses.
Test suite is amended to test this situation.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Wed, 14 Dec 2016 02:51:54 +0100 |
parents | d946c76fb3d4 |
children | 59437f8764c6 |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
18137
diff
changeset
|
1 /* Copyright (c) 2002-2016 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "lib.h" | |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
4 #include "buffer.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
647
diff
changeset
|
5 #include "istream.h" |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
6 #include "str.h" |
0 | 7 #include "message-parser.h" |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
8 #include "rfc822-parser.h" |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
9 #include "rfc2231-parser.h" |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
10 #include "imap-parser.h" |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
11 #include "imap-quote.h" |
0 | 12 #include "imap-envelope.h" |
13 #include "imap-bodystructure.h" | |
14 | |
1537
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
15 #define DEFAULT_CHARSET \ |
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
16 "\"charset\" \"us-ascii\"" |
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
17 |
0 | 18 #define EMPTY_BODYSTRUCTURE \ |
1537
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
19 "(\"text\" \"plain\" ("DEFAULT_CHARSET") NIL NIL \"7bit\" 0 0)" |
0 | 20 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
21 #define NVL(str, nullstr) ((str) != NULL ? (str) : (nullstr)) |
0 | 22 |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
23 static char *imap_get_string(pool_t pool, const char *value) |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
24 { |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
25 string_t *str = t_str_new(64); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
26 |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
27 imap_append_string(str, value); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
28 return p_strdup(pool, str_c(str)); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
29 } |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
30 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
31 static void parse_content_type(struct message_part_body_data *data, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
32 struct message_header_line *hdr) |
0 | 33 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
34 struct rfc822_parser_context parser; |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
35 const char *value, *const *results; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
36 string_t *str; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
37 unsigned int i; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
38 bool charset_found = FALSE; |
20889
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
39 int ret; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
40 |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
41 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
42 rfc822_skip_lwsp(&parser); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
43 |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
44 str = t_str_new(256); |
20889
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
45 ret = rfc822_parse_content_type(&parser, str); |
0 | 46 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
47 /* Save content type and subtype */ |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
48 value = str_c(str); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
49 for (i = 0; value[i] != '\0'; i++) { |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
50 if (value[i] == '/') { |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
51 data->content_subtype = |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
52 imap_get_string(data->pool, value + i+1); |
0 | 53 break; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
54 } |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
55 } |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
56 str_truncate(str, i); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
57 data->content_type = imap_get_string(data->pool, str_c(str)); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
58 |
20889
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
59 if (ret < 0) { |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
60 /* Content-Type is broken, but we wanted to get it as well as |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
61 we could. Don't try to read the parameters anymore though. |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
62 |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
63 We don't completely ignore a broken Content-Type, because |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
64 then it would be written as text/plain. This would cause a |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
65 mismatch with the message_part's MESSAGE_PART_FLAG_TEXT. */ |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
66 return; |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
67 } |
f8ba998a6b7c
lib-imap: Don't write a broken Content-Type as text/plain to BODYSTRUCTURE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19677
diff
changeset
|
68 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
69 /* parse parameters and save them */ |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
70 str_truncate(str, 0); |
14688
128c598d2870
Avoid using (void)s by adding ATTR_NOWARN_UNUSED_RESULT attributes and other ways.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
71 rfc2231_parse(&parser, &results); |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
72 for (; *results != NULL; results += 2) { |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
73 if (strcasecmp(results[0], "charset") == 0) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
74 charset_found = TRUE; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
75 |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
76 str_append_c(str, ' '); |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
77 imap_append_string(str, results[0]); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
78 str_append_c(str, ' '); |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
79 imap_append_string(str, results[1]); |
0 | 80 } |
81 | |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
82 if (!charset_found && |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
83 strcasecmp(data->content_type, "\"text\"") == 0) { |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
84 /* set a default charset */ |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
85 str_append_c(str, ' '); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
86 str_append(str, DEFAULT_CHARSET); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
87 } |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
88 if (str_len(str) > 0) { |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
89 data->content_type_params = |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
90 p_strdup(data->pool, str_c(str) + 1); |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
877
diff
changeset
|
91 } |
0 | 92 } |
93 | |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
94 static void parse_content_transfer_encoding(struct message_part_body_data *data, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
95 struct message_header_line *hdr) |
0 | 96 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
97 struct rfc822_parser_context parser; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
98 string_t *str; |
0 | 99 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
100 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
101 rfc822_skip_lwsp(&parser); |
0 | 102 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
103 str = t_str_new(256); |
19677
a904c19c42ff
lib-imap: Write invalid Content-Transfer-Encoding value as "7bit" to BODY/BODYSTRUCTURE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
104 if (rfc822_parse_mime_token(&parser, str) >= 0 && |
a904c19c42ff
lib-imap: Write invalid Content-Transfer-Encoding value as "7bit" to BODY/BODYSTRUCTURE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
105 rfc822_skip_lwsp(&parser) == 0 && str_len(str) > 0) { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
106 data->content_transfer_encoding = |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
107 imap_get_string(data->pool, str_c(str)); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
108 } |
0 | 109 } |
110 | |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
111 static void parse_content_disposition(struct message_part_body_data *data, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
112 struct message_header_line *hdr) |
0 | 113 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
114 struct rfc822_parser_context parser; |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
115 const char *const *results; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
116 string_t *str; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
117 |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
118 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
119 rfc822_skip_lwsp(&parser); |
0 | 120 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
121 str = t_str_new(256); |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
122 if (rfc822_parse_mime_token(&parser, str) < 0) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
123 return; |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
124 data->content_disposition = imap_get_string(data->pool, str_c(str)); |
0 | 125 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
126 /* parse parameters and save them */ |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
127 str_truncate(str, 0); |
14688
128c598d2870
Avoid using (void)s by adding ATTR_NOWARN_UNUSED_RESULT attributes and other ways.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
128 rfc2231_parse(&parser, &results); |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7949
diff
changeset
|
129 for (; *results != NULL; results += 2) { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
130 str_append_c(str, ' '); |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
131 imap_append_string(str, results[0]); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
132 str_append_c(str, ' '); |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
133 imap_append_string(str, results[1]); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
134 } |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
135 if (str_len(str) > 0) { |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
136 data->content_disposition_params = |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
137 p_strdup(data->pool, str_c(str) + 1); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
138 } |
0 | 139 } |
140 | |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
897
diff
changeset
|
141 static void parse_content_language(const unsigned char *value, size_t value_len, |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
142 struct message_part_body_data *data) |
0 | 143 { |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
144 struct rfc822_parser_context parser; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
145 string_t *str; |
398
e807d88e653c
Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
342
diff
changeset
|
146 |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
147 /* Language-Header = "Content-Language" ":" 1#Language-tag |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
148 Language-Tag = Primary-tag *( "-" Subtag ) |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
149 Primary-tag = 1*8ALPHA |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
150 Subtag = 1*8ALPHA */ |
0 | 151 |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
152 rfc822_parser_init(&parser, value, value_len, NULL); |
0 | 153 |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
154 str = t_str_new(128); |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
155 str_append_c(str, '"'); |
0 | 156 |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
157 rfc822_skip_lwsp(&parser); |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
158 while (rfc822_parse_atom(&parser, str) >= 0) { |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
159 str_append(str, "\" \""); |
398
e807d88e653c
Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
342
diff
changeset
|
160 |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
161 if (parser.data == parser.end || *parser.data != ',') |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
162 break; |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
163 parser.data++; |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
164 rfc822_skip_lwsp(&parser); |
398
e807d88e653c
Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
342
diff
changeset
|
165 } |
e807d88e653c
Parse Content-Language correctly for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
342
diff
changeset
|
166 |
3407
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
167 if (str_len(str) > 1) { |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
168 str_truncate(str, str_len(str) - 2); |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
169 data->content_language = p_strdup(data->pool, str_c(str)); |
f484ad51ad9f
Make Content-Language parser use rfc822-parser API.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
170 } |
0 | 171 } |
172 | |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
173 static void parse_content_header(struct message_part_body_data *d, |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
174 struct message_header_line *hdr, |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
175 pool_t pool) |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
176 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
177 const char *name = hdr->name + strlen("Content-"); |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
178 const char *value; |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
179 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
180 if (hdr->continues) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
181 hdr->use_full_value = TRUE; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
182 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
183 } |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
184 |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
185 value = t_strndup(hdr->full_value, hdr->full_value_len); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
186 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
187 switch (*name) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
188 case 'i': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
189 case 'I': |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
190 if (strcasecmp(name, "ID") == 0 && d->content_id == NULL) |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
191 d->content_id = imap_get_string(pool, value); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
192 break; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
193 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
194 case 'm': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
195 case 'M': |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
196 if (strcasecmp(name, "MD5") == 0 && d->content_md5 == NULL) |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
197 d->content_md5 = imap_get_string(pool, value); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
198 break; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
199 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
200 case 't': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
201 case 'T': |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
202 if (strcasecmp(name, "Type") == 0 && d->content_type == NULL) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
203 parse_content_type(d, hdr); |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
204 else if (strcasecmp(name, "Transfer-Encoding") == 0 && |
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
205 d->content_transfer_encoding == NULL) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
206 parse_content_transfer_encoding(d, hdr); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
207 break; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
208 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
209 case 'l': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
210 case 'L': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
211 if (strcasecmp(name, "Language") == 0 && |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
212 d->content_language == NULL) { |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
213 parse_content_language(hdr->full_value, |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
214 hdr->full_value_len, d); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
215 } else if (strcasecmp(name, "Location") == 0 && |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
216 d->content_location == NULL) { |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
217 d->content_location = imap_get_string(pool, value); |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
218 } |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
219 break; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
220 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
221 case 'd': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
222 case 'D': |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
223 if (strcasecmp(name, "Description") == 0 && |
15248
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
224 d->content_description == NULL) |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
225 d->content_description = imap_get_string(pool, value); |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
226 else if (strcasecmp(name, "Disposition") == 0 && |
cb143b430787
lib-imap: bodystructure parsing now uses imap_append_string() instead of imap_quote*()
Timo Sirainen <tss@iki.fi>
parents:
15062
diff
changeset
|
227 d->content_disposition_params == NULL) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
228 parse_content_disposition(d, hdr); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
229 break; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
230 } |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
231 } |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
232 |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1665
diff
changeset
|
233 void imap_bodystructure_parse_header(pool_t pool, struct message_part *part, |
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1665
diff
changeset
|
234 struct message_header_line *hdr) |
0 | 235 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
236 struct message_part_body_data *part_data; |
1619
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
237 struct message_part_envelope_data *envelope; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
238 bool parent_rfc822; |
0 | 239 |
1619
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
240 if (hdr == NULL) { |
7014
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
241 if (part->context == NULL) { |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
242 /* no Content-* headers. add an empty context |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
243 structure anyway. */ |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
244 part->context = part_data = |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
245 p_new(pool, struct message_part_body_data, 1); |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
246 part_data->pool = pool; |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
247 } else if ((part->flags & MESSAGE_PART_FLAG_IS_MIME) == 0) { |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
248 /* If there was no Mime-Version, forget all |
6835ac721609
Add a context structure to all message parts and remove the NULL checks.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
249 the Content-stuff */ |
1619
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
250 part_data = part->context; |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
251 envelope = part_data->envelope; |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
252 |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
253 memset(part_data, 0, sizeof(*part_data)); |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
254 part_data->pool = pool; |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
255 part_data->envelope = envelope; |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
256 } |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
257 return; |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
258 } |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
259 |
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
260 if (hdr->eoh) |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
261 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
262 |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
263 parent_rfc822 = part->parent != NULL && |
1619
5bdda4147b36
Fixes for handling missing Mime-Version
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
264 (part->parent->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) != 0; |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
265 if (!parent_rfc822 && strncasecmp(hdr->name, "Content-", 8) != 0) |
0 | 266 return; |
267 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
268 if (part->context == NULL) { |
0 | 269 /* initialize message part data */ |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
270 part->context = part_data = |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
271 p_new(pool, struct message_part_body_data, 1); |
0 | 272 part_data->pool = pool; |
273 } | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
274 part_data = part->context; |
0 | 275 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
276 if (strncasecmp(hdr->name, "Content-", 8) == 0) { |
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
|
277 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
278 parse_content_header(part_data, hdr, pool); |
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
|
279 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
280 } |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
897
diff
changeset
|
281 |
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
897
diff
changeset
|
282 if (parent_rfc822) { |
0 | 283 /* message/rfc822, we need the envelope */ |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1257
diff
changeset
|
284 imap_envelope_parse_header(pool, &part_data->envelope, hdr); |
0 | 285 } |
286 } | |
287 | |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
288 static void |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
289 imap_bodystructure_write_siblings(const struct message_part *part, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
290 string_t *dest, bool extended) |
0 | 291 { |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
292 for (; part != NULL; part = part->next) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
293 str_append_c(dest, '('); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
294 imap_bodystructure_write(part, dest, extended); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
295 str_append_c(dest, ')'); |
0 | 296 } |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
297 } |
0 | 298 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
299 static void |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
300 part_write_bodystructure_data_common(struct message_part_body_data *data, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
301 string_t *str) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
302 { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
303 str_append_c(str, ' '); |
0 | 304 if (data->content_disposition == NULL) |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
305 str_append(str, "NIL"); |
0 | 306 else { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
307 str_append_c(str, '('); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
308 str_append(str, data->content_disposition); |
862
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
309 str_append_c(str, ' '); |
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
310 |
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
311 if (data->content_disposition_params == NULL) |
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
312 str_append(str, "NIL"); |
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
313 else { |
375923d2f910
BODYSTRUCTURE reply was incorrect. pine didn't like it.
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
314 str_append_c(str, '('); |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
315 str_append(str, data->content_disposition_params); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
316 str_append_c(str, ')'); |
0 | 317 } |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
318 str_append_c(str, ')'); |
0 | 319 } |
320 | |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
321 str_append_c(str, ' '); |
0 | 322 if (data->content_language == NULL) |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
323 str_append(str, "NIL"); |
0 | 324 else { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
325 str_append_c(str, '('); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
326 str_append(str, data->content_language); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
327 str_append_c(str, ')'); |
0 | 328 } |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
329 |
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
330 str_append_c(str, ' '); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
331 str_append(str, NVL(data->content_location, "NIL")); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
332 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
333 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
334 static void part_write_body_multipart(const struct message_part *part, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
335 string_t *str, bool extended) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
336 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
337 struct message_part_body_data *data = part->context; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
338 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
339 if (part->children != NULL) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
340 imap_bodystructure_write_siblings(part->children, str, extended); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
341 else { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
342 /* no parts in multipart message, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
343 that's not allowed. write a single |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
344 0-length text/plain structure */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
345 str_append(str, EMPTY_BODYSTRUCTURE); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
346 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
347 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
348 str_append_c(str, ' '); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
349 if (data->content_subtype != NULL) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
350 str_append(str, data->content_subtype); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
351 else |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
352 str_append(str, "\"x-unknown\""); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
353 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
354 if (!extended) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
355 return; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
356 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
357 /* BODYSTRUCTURE data */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
358 str_append_c(str, ' '); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
359 if (data->content_type_params == NULL) |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
360 str_append(str, "NIL"); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
361 else { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
362 str_append_c(str, '('); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
363 str_append(str, data->content_type_params); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
364 str_append_c(str, ')'); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
365 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
366 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
367 part_write_bodystructure_data_common(data, str); |
0 | 368 } |
369 | |
5334
8d9234a26a3f
Make imap_bodystructure_write() parameter constant. Patch by Max Kellermann
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
370 static void part_write_body(const struct message_part *part, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
371 string_t *str, bool extended) |
0 | 372 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
373 struct message_part_body_data *data = part->context; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
374 bool text; |
0 | 375 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
376 if (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) { |
1665
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
377 str_append(str, "\"message\" \"rfc822\""); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
378 text = FALSE; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
379 } else { |
1665
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
380 /* "content type" "subtype" */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
381 text = data->content_type == NULL || |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
382 strcasecmp(data->content_type, "\"text\"") == 0; |
1665
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
383 str_append(str, NVL(data->content_type, "\"text\"")); |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
384 str_append_c(str, ' '); |
1255
58041ce0a24c
Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents:
1107
diff
changeset
|
385 |
1665
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
386 if (data->content_subtype != NULL) |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
387 str_append(str, data->content_subtype); |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
388 else { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
389 if (text) |
1665
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
390 str_append(str, "\"plain\""); |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
391 else |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
392 str_append(str, "\"unknown\""); |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
393 |
e50e21588020
Some message/rfc822 mails were returned as text/plain
Timo Sirainen <tss@iki.fi>
parents:
1664
diff
changeset
|
394 } |
1255
58041ce0a24c
Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents:
1107
diff
changeset
|
395 } |
0 | 396 |
397 /* ("content type param key" "value" ...) */ | |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
398 str_append_c(str, ' '); |
1537
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
399 if (data->content_type_params == NULL) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
400 if (!text) |
1537
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
401 str_append(str, "NIL"); |
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
402 else |
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
403 str_append(str, "("DEFAULT_CHARSET")"); |
d4563a5ba30b
Add charset/us-ascii into body/bodystructure replies if no charset is given
Timo Sirainen <tss@iki.fi>
parents:
1327
diff
changeset
|
404 } else { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
405 str_append_c(str, '('); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
406 str_append(str, data->content_type_params); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
407 str_append_c(str, ')'); |
0 | 408 } |
409 | |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
410 str_printfa(str, " %s %s %s %"PRIuUOFF_T, |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
411 NVL(data->content_id, "NIL"), |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
412 NVL(data->content_description, "NIL"), |
1255
58041ce0a24c
Default to 7bit instead of 8bit content-encoding-type.
Timo Sirainen <tss@iki.fi>
parents:
1107
diff
changeset
|
413 NVL(data->content_transfer_encoding, "\"7bit\""), |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
414 part->body_size.virtual_size); |
0 | 415 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
416 if (text) { |
0 | 417 /* text/.. contains line count */ |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
418 str_printfa(str, " %u", part->body_size.lines); |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
419 } else if (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) { |
0 | 420 /* message/rfc822 contains envelope + body + line count */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
421 struct message_part_body_data *child_data; |
0 | 422 |
423 i_assert(part->children != NULL); | |
424 i_assert(part->children->next == NULL); | |
425 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
426 child_data = part->children->context; |
0 | 427 |
1664 | 428 str_append(str, " ("); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
429 if (child_data->envelope_str != NULL) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
430 str_append(str, child_data->envelope_str); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
431 else |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
432 imap_envelope_write_part_data(child_data->envelope, str); |
1663
4aca99baa9a4
Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
433 str_append(str, ") "); |
4aca99baa9a4
Don't write envelope as NIL into bodystructure even if it's broken.
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
434 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
435 imap_bodystructure_write_siblings(part->children, str, extended); |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
436 str_printfa(str, " %u", part->body_size.lines); |
0 | 437 } |
438 | |
439 if (!extended) | |
440 return; | |
441 | |
442 /* BODYSTRUCTURE data */ | |
443 | |
444 /* "md5" ("content disposition" ("disposition" "params")) | |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
445 ("body" "language" "params") "location" */ |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
446 str_append_c(str, ' '); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
447 str_append(str, NVL(data->content_md5, "NIL")); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
448 part_write_bodystructure_data_common(data, str); |
0 | 449 } |
450 | |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
451 bool imap_bodystructure_is_plain_7bit(const struct message_part *part) |
3460
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
452 { |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
453 const struct message_part_body_data *data = part->context; |
3460
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
454 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
455 i_assert(part->parent == NULL); |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
456 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
457 /* if content-type is text/xxx we don't have to check any |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
458 multipart stuff */ |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
459 if ((part->flags & MESSAGE_PART_FLAG_TEXT) == 0) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
460 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
461 if (part->next != NULL || part->children != NULL) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
462 return FALSE; /* shouldn't happen normally.. */ |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
463 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
464 /* must be text/plain */ |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
465 if (data->content_subtype != NULL && |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
466 strcasecmp(data->content_subtype, "\"plain\"") != 0) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
467 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
468 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
469 /* only allowed parameter is charset=us-ascii, which is also default */ |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
470 if (data->content_type_params != NULL && |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
471 strcasecmp(data->content_type_params, DEFAULT_CHARSET) != 0) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
472 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
473 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
474 if (data->content_id != NULL || |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
475 data->content_description != NULL) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
476 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
477 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
478 if (data->content_transfer_encoding != NULL && |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
479 strcasecmp(data->content_transfer_encoding, "\"7bit\"") != 0) |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
480 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
481 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
482 /* BODYSTRUCTURE checks: */ |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
483 if (data->content_md5 != NULL || |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
484 data->content_disposition != NULL || |
7949
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
485 data->content_language != NULL || |
e787f6cae97c
Added missing Content-Language: support for BODYSTRUCTURE.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
486 data->content_location != NULL) |
3460
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
487 return FALSE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
488 |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
489 return TRUE; |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
490 } |
e8cbf3ae00db
Added imap_bodystructure_is_plain_7bit()
Timo Sirainen <tss@iki.fi>
parents:
3407
diff
changeset
|
491 |
5334
8d9234a26a3f
Make imap_bodystructure_write() parameter constant. Patch by Max Kellermann
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
492 void imap_bodystructure_write(const struct message_part *part, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
493 string_t *dest, bool extended) |
0 | 494 { |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
495 if (part->flags & MESSAGE_PART_FLAG_MULTIPART) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
496 part_write_body_multipart(part, dest, extended); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
497 else |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
498 part_write_body(part, dest, extended); |
0 | 499 } |
500 | |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
501 static bool str_append_nstring(string_t *str, const struct imap_arg *arg) |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
502 { |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
503 const char *cstr; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
504 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
505 if (!imap_arg_get_nstring(arg, &cstr)) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
506 return FALSE; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
507 |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
508 switch (arg->type) { |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
509 case IMAP_ARG_NIL: |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
510 str_append(str, "NIL"); |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
511 break; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
512 case IMAP_ARG_ATOM: |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
513 str_append(str, cstr); |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
514 break; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
515 case IMAP_ARG_STRING: |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
516 str_append_c(str, '"'); |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
517 /* NOTE: we're parsing with no-unescape flag, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
518 so don't double-escape it here */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
519 str_append(str, cstr); |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
520 str_append_c(str, '"'); |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
521 break; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
522 case IMAP_ARG_LITERAL: { |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
523 str_printfa(str, "{%"PRIuSIZE_T"}\r\n", strlen(cstr)); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
524 str_append(str, cstr); |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
525 break; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
526 } |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
527 default: |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
528 i_unreached(); |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
529 return FALSE; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
530 } |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
531 return TRUE; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
532 } |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
533 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
534 static bool |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
535 get_nstring(const struct imap_arg *arg, pool_t pool, string_t *tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
536 const char **value_r) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
537 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
538 if (arg->type == IMAP_ARG_NIL) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
539 *value_r = NULL; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
540 return TRUE; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
541 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
542 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
543 str_truncate(tmpstr, 0); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
544 if (!str_append_nstring(tmpstr, arg)) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
545 return FALSE; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
546 *value_r = p_strdup(pool, str_c(tmpstr)); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
547 return TRUE; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
548 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
549 |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
550 static void |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
551 imap_write_envelope_list(const struct imap_arg *args, string_t *str, |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
552 bool toplevel) |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
553 { |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
554 const struct imap_arg *children; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
555 |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
556 /* don't do any typechecking, just write it out */ |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
557 while (!IMAP_ARG_IS_EOL(args)) { |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
558 bool list = FALSE; |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
559 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
560 if (!str_append_nstring(str, args)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
561 if (!imap_arg_get_list(args, &children)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
562 /* everything is either nstring or list */ |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
563 i_unreached(); |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
564 } |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
565 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
566 str_append_c(str, '('); |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
567 imap_write_envelope_list(children, str, FALSE); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
568 str_append_c(str, ')'); |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
569 |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
570 list = TRUE; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
571 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
572 args++; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
573 |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
574 if ((toplevel || !list) && !IMAP_ARG_IS_EOL(args)) |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
575 str_append_c(str, ' '); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
576 } |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
577 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
578 |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
579 static void |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
580 imap_write_envelope(const struct imap_arg *args, string_t *str) |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
581 { |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
582 imap_write_envelope_list(args, str, TRUE); |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
583 } |
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
584 |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
585 static int imap_write_nstring_list(const struct imap_arg *args, string_t *str) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
586 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
587 str_truncate(str, 0); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
588 while (!IMAP_ARG_IS_EOL(args)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
589 if (!str_append_nstring(str, &args[0])) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
590 return -1; |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
591 args++; |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
592 if (IMAP_ARG_IS_EOL(args)) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
593 break; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
594 str_append_c(str, ' '); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
595 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
596 return 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
597 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
598 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
599 static int imap_write_params(const struct imap_arg *arg, pool_t pool, |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
600 string_t *tmpstr, unsigned int divisible, |
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
601 const char **value_r) |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
602 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
603 const struct imap_arg *list_args; |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
604 unsigned int list_count; |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
605 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
606 if (arg->type == IMAP_ARG_NIL) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
607 *value_r = NULL; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
608 return 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
609 } |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
610 if (!imap_arg_get_list_full(arg, &list_args, &list_count)) |
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
611 return -1; |
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
612 if ((list_count % divisible) != 0) |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
613 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
614 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
615 if (imap_write_nstring_list(list_args, tmpstr) < 0) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
616 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
617 *value_r = p_strdup(pool, str_c(tmpstr)); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
618 return 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
619 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
620 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
621 static int |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
622 imap_bodystructure_parse_lines(const struct imap_arg *arg, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
623 const struct message_part *part, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
624 const char **error_r) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
625 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
626 const char *value; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
627 unsigned int lines; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
628 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
629 if (!imap_arg_get_atom(arg, &value) || |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
630 str_to_uint(value, &lines) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
631 *error_r = "Invalid lines field"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
632 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
633 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
634 if (lines != part->body_size.lines) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
635 *error_r = "message_part lines doesn't match lines in BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
636 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
637 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
638 return 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
639 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
640 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
641 static int |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
642 imap_bodystructure_parse_args_common(struct message_part_body_data *data, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
643 pool_t pool, string_t *tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
644 const struct imap_arg *args, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
645 const char **error_r) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
646 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
647 const struct imap_arg *list_args; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
648 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
649 if (args->type == IMAP_ARG_NIL) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
650 args++; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
651 else if (!imap_arg_get_list(args, &list_args)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
652 *error_r = "Invalid content-disposition list"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
653 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
654 } else { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
655 if (!get_nstring(list_args++, pool, tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
656 &data->content_disposition)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
657 *error_r = "Invalid content-disposition"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
658 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
659 } |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
660 if (imap_write_params(list_args, pool, tmpstr, 2, |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
661 &data->content_disposition_params) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
662 *error_r = "Invalid content-disposition params"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
663 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
664 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
665 args++; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
666 } |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
667 if (imap_write_params(args++, pool, tmpstr, 1, |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
668 &data->content_language) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
669 *error_r = "Invalid content-language"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
670 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
671 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
672 if (!get_nstring(args++, pool, tmpstr, &data->content_location)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
673 *error_r = "Invalid content-location"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
674 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
675 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
676 return 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
677 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
678 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
679 static int |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
680 imap_bodystructure_parse_args(const struct imap_arg *args, pool_t pool, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
681 struct message_part *part, string_t *tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
682 const char **error_r) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
683 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
684 struct message_part_body_data *data; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
685 struct message_part *child_part; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
686 const struct imap_arg *list_args; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
687 const char *value, *content_type, *subtype; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
688 uoff_t vsize; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
689 bool multipart, text, message_rfc822; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
690 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
691 i_assert(part->context == NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
692 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
693 part->context = data = p_new(pool, struct message_part_body_data, 1); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
694 data->pool = pool; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
695 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
696 multipart = FALSE; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
697 child_part = part->children; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
698 while (args->type == IMAP_ARG_LIST) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
699 if ((part->flags & MESSAGE_PART_FLAG_MULTIPART) == 0 || |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
700 child_part == NULL) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
701 *error_r = "message_part hierarchy doesn't match BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
702 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
703 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
704 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
705 list_args = imap_arg_as_list(args); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
706 if (imap_bodystructure_parse_args(list_args, pool, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
707 child_part, tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
708 error_r) < 0) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
709 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
710 child_part = child_part->next; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
711 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
712 multipart = TRUE; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
713 args++; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
714 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
715 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
716 if (multipart) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
717 if (child_part != NULL) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
718 *error_r = "message_part hierarchy doesn't match BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
719 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
720 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
721 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
722 data->content_type = "\"multipart\""; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
723 if (!get_nstring(args++, pool, tmpstr, &data->content_subtype)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
724 *error_r = "Invalid multipart content-type"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
725 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
726 } |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
727 if (imap_write_params(args++, pool, tmpstr, 2, |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
728 &data->content_type_params) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
729 *error_r = "Invalid content params"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
730 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
731 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
732 return imap_bodystructure_parse_args_common(data, pool, tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
733 args, error_r); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
734 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
735 if ((part->flags & MESSAGE_PART_FLAG_MULTIPART) != 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
736 *error_r = "message_part multipart flag doesn't match BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
737 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
738 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
739 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
740 /* "content type" "subtype" */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
741 if (!imap_arg_get_astring(&args[0], &content_type) || |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
742 !imap_arg_get_astring(&args[1], &subtype)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
743 *error_r = "Invalid content-type"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
744 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
745 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
746 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
747 if (!get_nstring(&args[0], pool, tmpstr, &data->content_type) || |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
748 !get_nstring(&args[1], pool, tmpstr, &data->content_subtype)) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
749 i_unreached(); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
750 args += 2; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
751 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
752 text = strcasecmp(content_type, "text") == 0; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
753 message_rfc822 = strcasecmp(content_type, "message") == 0 && |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
754 strcasecmp(subtype, "rfc822") == 0; |
20890
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
755 #if 0 |
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
756 /* Disabled for now. Earlier Dovecot versions handled broken |
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
757 Content-Type headers by writing them as "text" "plain" to |
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
758 BODYSTRUCTURE reply, but the message_part didn't have |
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
759 MESSAGE_PART_FLAG_TEXT. */ |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
760 if (text != ((part->flags & MESSAGE_PART_FLAG_TEXT) != 0)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
761 *error_r = "message_part text flag doesn't match BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
762 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
763 } |
20890
d946c76fb3d4
lib-imap: imap_bodystructure_parse() ignores text/plain flag mismatch for now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20889
diff
changeset
|
764 #endif |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
765 if (message_rfc822 != ((part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) != 0)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
766 *error_r = "message_part message/rfc822 flag doesn't match BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
767 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
768 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
769 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
770 /* ("content type param key" "value" ...) | NIL */ |
15062
9935621836c8
lib-imap: Fixed Content-Language parsing from BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
15057
diff
changeset
|
771 if (imap_write_params(args++, pool, tmpstr, 2, |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
772 &data->content_type_params) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
773 *error_r = "Invalid content params"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
774 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
775 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
776 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
777 /* "content id" "content description" "transfer encoding" size */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
778 if (!get_nstring(args++, pool, tmpstr, &data->content_id)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
779 *error_r = "Invalid content-id"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
780 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
781 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
782 if (!get_nstring(args++, pool, tmpstr, &data->content_description)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
783 *error_r = "Invalid content-description"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
784 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
785 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
786 if (!get_nstring(args++, pool, tmpstr, &data->content_transfer_encoding)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
787 *error_r = "Invalid content-transfer-encoding"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
788 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
789 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
790 if (!imap_arg_get_atom(args++, &value) || |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
791 str_to_uoff(value, &vsize) < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
792 *error_r = "Invalid size field"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
793 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
794 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
795 if (vsize != part->body_size.virtual_size) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
796 *error_r = "message_part virtual_size doesn't match " |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
797 "size in BODYSTRUCTURE"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
798 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
799 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
800 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
801 if (text) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
802 /* text/xxx - text lines */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
803 if (imap_bodystructure_parse_lines(args, part, error_r) < 0) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
804 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
805 args++; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
806 i_assert(part->children == NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
807 } else if (message_rfc822) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
808 /* message/rfc822 - envelope + bodystructure + text lines */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
809 struct message_part_body_data *child_data; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
810 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
811 i_assert(part->children != NULL && |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
812 part->children->next == NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
813 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
814 if (!imap_arg_get_list(&args[1], &list_args)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
815 *error_r = "Child bodystructure list expected"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
816 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
817 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
818 if (imap_bodystructure_parse_args(list_args, pool, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
819 part->children, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
820 tmpstr, error_r) < 0) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
821 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
822 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
823 /* save envelope to the child's context data */ |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
824 if (!imap_arg_get_list(&args[0], &list_args)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
825 *error_r = "Envelope list expected"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
826 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
827 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
828 str_truncate(tmpstr, 0); |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
829 imap_write_envelope(list_args, tmpstr); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
830 child_data = part->children->context; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
831 child_data->envelope_str = p_strdup(pool, str_c(tmpstr)); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
832 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
833 args += 2; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
834 if (imap_bodystructure_parse_lines(args, part, error_r) < 0) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
835 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
836 args++; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
837 } else { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
838 i_assert(part->children == NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
839 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
840 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
841 if (!get_nstring(args++, pool, tmpstr, &data->content_md5)) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
842 *error_r = "Invalid content-description"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
843 return -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
844 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
845 return imap_bodystructure_parse_args_common(data, pool, tmpstr, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
846 args, error_r); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
847 } |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
848 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
849 int imap_bodystructure_parse(const char *bodystructure, pool_t pool, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
850 struct message_part *parts, const char **error_r) |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
851 { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
852 struct istream *input; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
853 struct imap_parser *parser; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
854 const struct imap_arg *args; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
855 int ret; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
856 bool fatal; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
857 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
858 i_assert(parts != NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
859 i_assert(parts->next == NULL); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
860 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
861 input = i_stream_create_from_data(bodystructure, strlen(bodystructure)); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
862 (void)i_stream_read(input); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
863 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
864 parser = imap_parser_create(input, NULL, (size_t)-1); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
865 ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE | |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
866 IMAP_PARSE_FLAG_LITERAL_TYPE, &args); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
867 if (ret < 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
868 *error_r = t_strdup_printf("IMAP parser failed: %s", |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
869 imap_parser_get_error(parser, &fatal)); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
870 } else if (ret == 0) { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
871 *error_r = "Empty bodystructure"; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
872 ret = -1; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
873 } else T_BEGIN { |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
874 string_t *tmpstr = t_str_new(256); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
875 ret = imap_bodystructure_parse_args(args, pool, parts, |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
876 tmpstr, error_r); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
877 } T_END; |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
878 |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
879 imap_parser_unref(&parser); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
880 i_stream_destroy(&input); |
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
881 return ret; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
882 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
883 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
884 static int imap_parse_bodystructure_args(const struct imap_arg *args, |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
885 string_t *str, const char **error_r) |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
886 { |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5334
diff
changeset
|
887 const struct imap_arg *subargs; |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
888 const struct imap_arg *list_args; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
889 const char *value, *content_type, *subtype; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
890 bool multipart, text, message_rfc822; |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3571
diff
changeset
|
891 int i; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
892 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
893 multipart = FALSE; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
894 while (args->type == IMAP_ARG_LIST) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
895 str_append_c(str, '('); |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
896 list_args = imap_arg_as_list(args); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
897 if (imap_parse_bodystructure_args(list_args, str, error_r) < 0) |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
898 return -1; |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
899 str_append_c(str, ')'); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
900 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
901 multipart = TRUE; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
902 args++; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
903 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
904 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
905 if (multipart) { |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
906 /* next is subtype of Content-Type. rest is skipped. */ |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
907 str_append_c(str, ' '); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
908 if (!str_append_nstring(str, args)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
909 *error_r = "Invalid multipart content-type"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
910 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
911 } |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
912 return 0; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
913 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
914 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
915 /* "content type" "subtype" */ |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
916 if (!imap_arg_get_astring(&args[0], &content_type) || |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
917 !imap_arg_get_astring(&args[1], &subtype)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
918 *error_r = "Invalid content-type"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
919 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
920 } |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
921 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
922 if (!str_append_nstring(str, &args[0])) |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
923 i_unreached(); |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
924 str_append_c(str, ' '); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
925 if (!str_append_nstring(str, &args[1])) |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
926 i_unreached(); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
927 |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
928 text = strcasecmp(content_type, "text") == 0; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
929 message_rfc822 = strcasecmp(content_type, "message") == 0 && |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
930 strcasecmp(subtype, "rfc822") == 0; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
931 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
932 args += 2; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
933 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
934 /* ("content type param key" "value" ...) | NIL */ |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
935 if (imap_arg_get_list(args, &subargs)) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
936 str_append(str, " ("); |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
937 while (!IMAP_ARG_IS_EOL(subargs)) { |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
938 if (!str_append_nstring(str, &subargs[0])) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
939 *error_r = "Invalid content param key"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
940 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
941 } |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
942 str_append_c(str, ' '); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
943 if (!str_append_nstring(str, &subargs[1])) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
944 *error_r = "Invalid content param value"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
945 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
946 } |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
947 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
948 subargs += 2; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
949 if (IMAP_ARG_IS_EOL(subargs)) |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
950 break; |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
951 str_append_c(str, ' '); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
952 } |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
953 str_append(str, ")"); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
954 } else if (args->type == IMAP_ARG_NIL) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
955 str_append(str, " NIL"); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
956 } else { |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
957 *error_r = "list/NIL expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
958 return -1; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
959 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
960 args++; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
961 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
962 /* "content id" "content description" "transfer encoding" size */ |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
963 for (i = 0; i < 4; i++, args++) { |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
964 str_append_c(str, ' '); |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
913
diff
changeset
|
965 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
966 if (!str_append_nstring(str, args)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
967 *error_r = "nstring expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
968 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
969 } |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
970 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
971 |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
972 if (text) { |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
973 /* text/xxx - text lines */ |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
974 if (!imap_arg_get_atom(args, &value)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
975 *error_r = "Text lines expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
976 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
977 } |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
978 |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
979 str_append_c(str, ' '); |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
980 str_append(str, value); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
981 } else if (message_rfc822) { |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
982 /* message/rfc822 - envelope + bodystructure + text lines */ |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
768
diff
changeset
|
983 str_append_c(str, ' '); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
984 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
985 if (!imap_arg_get_list(&args[0], &list_args)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
986 *error_r = "Envelope list expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
987 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
988 } |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
989 str_append_c(str, '('); |
21294
dfa20786a81d
lib-imap: imap-bodystructure: Prevent writing erroneous whitespace between items in an envelope address list.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20890
diff
changeset
|
990 imap_write_envelope(list_args, str); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
991 str_append(str, ") ("); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
992 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
993 if (!imap_arg_get_list(&args[1], &list_args)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
994 *error_r = "Child bodystructure list expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
995 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
996 } |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
997 if (imap_parse_bodystructure_args(list_args, str, error_r) < 0) |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
998 return -1; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
999 |
4027
0e7a9b0aa8c3
BODYSTRUCTURE -> BODY conversion was broken with mails containing
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1000 str_append(str, ") "); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1001 if (!imap_arg_get_atom(&args[2], &value)) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1002 *error_r = "Text lines expected"; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1003 return -1; |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1004 } |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
1005 str_append(str, value); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1006 } |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1007 return 0; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1008 } |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1009 |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1010 int imap_body_parse_from_bodystructure(const char *bodystructure, |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1011 string_t *dest, const char **error_r) |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1012 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
1013 struct istream *input; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
1014 struct imap_parser *parser; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5334
diff
changeset
|
1015 const struct imap_arg *args; |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1016 bool fatal; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1017 int ret; |
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1018 |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6117
diff
changeset
|
1019 input = i_stream_create_from_data(bodystructure, strlen(bodystructure)); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
647
diff
changeset
|
1020 (void)i_stream_read(input); |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1021 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
1022 parser = imap_parser_create(input, NULL, (size_t)-1); |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1619
diff
changeset
|
1023 ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE | |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1619
diff
changeset
|
1024 IMAP_PARSE_FLAG_LITERAL_TYPE, &args); |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1025 if (ret < 0) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1026 *error_r = t_strdup_printf("IMAP parser failed: %s", |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1027 imap_parser_get_error(parser, &fatal)); |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1028 } else if (ret == 0) { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1029 *error_r = "Empty bodystructure"; |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
1030 ret = -1; |
15056
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1031 } else { |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1032 ret = imap_parse_bodystructure_args(args, dest, error_r); |
6acd8b149709
imap_body_parse_from_bodystructure() now returns the error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
1033 } |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1034 |
13627
f63f2b2217c3
lib-imap: Added reference counting to imap parser.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
1035 imap_parser_unref(&parser); |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4027
diff
changeset
|
1036 i_stream_destroy(&input); |
15057
d1f084a39708
lib-imap: Added support for parsing IMAP BODYSTRUCTURE and writing out a modified version.
Timo Sirainen <tss@iki.fi>
parents:
15056
diff
changeset
|
1037 return ret; |
445
8179ef2a2c62
If BODYSTRUCTURE is cached, we can use it to generate BODY reply. It takes
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
1038 } |