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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "imap-envelope.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "imap-bodystructure.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 part_data->pool = pool;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 i_assert(part->children != NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 i_assert(part->children->next == NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
1664
Timo Sirainen <tss@iki.fi>
parents: 1663
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 if (!extended)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 /* BODYSTRUCTURE data */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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 }