annotate src/lib-imap-storage/imap-msgpart.c @ 22656:1789bf2a1e01

director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0 The reset command would just hang in that case. doveadm would never have sent this, so this is just an extra sanity check.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 05 Nov 2017 23:51:56 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
2
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
3 #include "lib.h"
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
4 #include "str.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
5 #include "array.h"
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
6 #include "istream.h"
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
7 #include "istream-crlf.h"
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
8 #include "istream-nonuls.h"
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
9 #include "istream-base64.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
10 #include "istream-header-filter.h"
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
11 #include "istream-qp.h"
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
12 #include "ostream.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
13 #include "message-parser.h"
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
14 #include "message-decoder.h"
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
15 #include "mail-storage-private.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
16 #include "mail-namespace.h"
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
17 #include "imap-bodystructure.h"
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
18 #include "imap-parser.h"
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
19 #include "imap-msgpart.h"
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
20
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
21 enum fetch_type {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
22 FETCH_FULL,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
23 FETCH_MIME,
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
24 FETCH_MIME_BODY,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
25 FETCH_HEADER,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
26 FETCH_HEADER_FIELDS,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
27 FETCH_HEADER_FIELDS_NOT,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
28 FETCH_BODY
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
29 };
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
30
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
31 struct imap_msgpart {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
32 pool_t pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
33
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
34 /* "" for root, otherwise e.g. "1.2.3". the .MIME, .HEADER, etc.
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
35 suffix not included */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
36 const char *section_number;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
37 enum fetch_type fetch_type;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
38 enum mail_fetch_field wanted_fields;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
39
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
40 /* HEADER.FIELDS[.NOT] (list of headers) */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
41 struct mailbox_header_lookup_ctx *header_ctx;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
42 const char *const *headers;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
43
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
44 /* which part of the message part to fetch (default: 0..(uoff_t)-1) */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
45 uoff_t partial_offset, partial_size;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
46
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
47 unsigned int decode_cte_to_binary:1;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
48 };
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
49
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
50 struct imap_msgpart_open_ctx {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
51 /* from matching message_part, set after opening: */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
52 uoff_t physical_pos;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
53 struct message_size mime_hdr_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
54 struct message_size mime_body_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
55 };
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
56
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
57 static struct imap_msgpart *imap_msgpart_type(enum fetch_type fetch_type)
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
58 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
59 struct imap_msgpart *msgpart;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
60 pool_t pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
61
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
62 pool = pool_alloconly_create("imap msgpart", sizeof(*msgpart)+32);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
63 msgpart = p_new(pool, struct imap_msgpart, 1);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
64 msgpart->pool = pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
65 msgpart->partial_size = (uoff_t)-1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
66 msgpart->fetch_type = fetch_type;
14708
2ab4aa784474 imap: Fixed crashes on some FETCH commands
Timo Sirainen <tss@iki.fi>
parents: 14686
diff changeset
67 msgpart->section_number = "";
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
68 if (fetch_type == FETCH_HEADER || fetch_type == FETCH_FULL)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
69 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
70 if (fetch_type == FETCH_BODY || fetch_type == FETCH_FULL)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
71 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
72 return msgpart;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
73 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
74
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
75 struct imap_msgpart *imap_msgpart_full(void)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
76 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
77 return imap_msgpart_type(FETCH_FULL);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
78 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
79
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
80 struct imap_msgpart *imap_msgpart_header(void)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
81 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
82 return imap_msgpart_type(FETCH_HEADER);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
83 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
84
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
85 struct imap_msgpart *imap_msgpart_body(void)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
86 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
87 return imap_msgpart_type(FETCH_BODY);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
88 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
89
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
90 static struct message_part *
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
91 imap_msgpart_find(struct message_part *parts, const char *section)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
92 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
93 struct message_part *part = parts;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
94 const char *path;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
95 unsigned int num;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
96
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
97 path = section;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
98 while (*path >= '0' && *path <= '9' && part != NULL) {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
99 /* get part number, we have already verified its validity */
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
100 num = 0;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
101 while (*path != '\0' && *path != '.') {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
102 i_assert(*path >= '0' && *path <= '9');
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
103
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
104 num = num*10 + (*path - '0');
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
105 path++;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
106 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
107
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
108 if (*path == '.')
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
109 path++;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
110
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
111 if ((part->flags & MESSAGE_PART_FLAG_MULTIPART) != 0) {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
112 /* find the part */
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
113 part = part->children;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
114 for (; num > 1 && part != NULL; num--)
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
115 part = part->next;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
116 } else {
14911
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
117 /* only 1 allowed with non-multipart messages.
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
118 if the child isn't message/rfc822, the path must be
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
119 finished after this. */
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
120 if (num != 1)
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
121 part = NULL;
14911
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
122 else if (*path != '\0' &&
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
123 (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) == 0)
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
124 part = NULL;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
125 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
126
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
127 if (part != NULL &&
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
128 (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) != 0 &&
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
129 (*path >= '0' && *path <= '9')) {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
130 /* if we continue inside the message/rfc822, skip this
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
131 body part */
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
132 part = part->children;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
133 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
134 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
135 i_assert(part == NULL || *path == '\0');
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
136 return part;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
137 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
138
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
139 static int
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
140 imap_msgpart_get_header_fields(pool_t pool, const char *header_list,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
141 ARRAY_TYPE(const_string) *fields)
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
142 {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
143 struct istream *input;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
144 struct imap_parser *parser;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
145 const struct imap_arg *args, *hdr_list;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
146 unsigned int list_count;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
147 unsigned int i;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
148 int result = 0;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
149
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
150 input = i_stream_create_from_data(header_list, strlen(header_list));
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
151 parser = imap_parser_create(input, NULL, (size_t)-1);
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
152
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
153 if (imap_parser_finish_line(parser, 0, 0, &args) > 0 &&
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
154 imap_arg_get_list_full(args, &hdr_list, &list_count) &&
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
155 args[1].type == IMAP_ARG_EOL &&
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
156 list_count > 0) {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
157 const char *value;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
158
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
159 p_array_init(fields, pool, list_count);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
160 for (i = 0; i < list_count; i++) {
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
161 if (!imap_arg_get_astring(&hdr_list[i], &value)) {
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
162 result = -1;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
163 break;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
164 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
165
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
166 value = p_strdup(pool, t_str_ucase(value));
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
167 array_append(fields, &value, 1);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
168 }
20268
60327526fd00 lib-imap-storage: Don't sort uninitialized array on invalid header list.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20267
diff changeset
169 /* istream-header-filter requires headers to be sorted */
60327526fd00 lib-imap-storage: Don't sort uninitialized array on invalid header list.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20267
diff changeset
170 array_sort(fields, i_strcasecmp_p);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
171 } else {
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
172 result = -1;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
173 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
174
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
175 imap_parser_unref(&parser);
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
176 i_stream_unref(&input);
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
177 return result;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
178 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
179
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
180 static int
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
181 imap_msgpart_parse_header_fields(struct imap_msgpart *msgpart,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
182 const char *header_list)
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
183 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
184 ARRAY_TYPE(const_string) fields;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
185
20260
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
186 if (header_list[0] == ' ')
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
187 header_list++;
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
188
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
189 /* HEADER.FIELDS (list), HEADER.FIELDS.NOT (list) */
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
190 if (imap_msgpart_get_header_fields(msgpart->pool, header_list,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
191 &fields) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
192 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
193
14686
9ff19c1d5f69 Added array_append_zero() to write a zero-filled record to an array.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
194 array_append_zero(&fields);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
195 msgpart->headers = array_idx(&fields, 0);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
196 return 0;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
197 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
198
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
199 int imap_msgpart_parse(const char *section, struct imap_msgpart **msgpart_r)
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
200 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
201 struct imap_msgpart *msgpart;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
202 pool_t pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
203 unsigned int i;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
204 bool next_digit;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
205 int ret;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
206
14708
2ab4aa784474 imap: Fixed crashes on some FETCH commands
Timo Sirainen <tss@iki.fi>
parents: 14686
diff changeset
207 pool = pool_alloconly_create("imap msgpart", 1024);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
208 msgpart = *msgpart_r = p_new(pool, struct imap_msgpart, 1);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
209 msgpart->pool = pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
210 msgpart->partial_size = (uoff_t)-1;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
211
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
212 /* get the section number */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
213 next_digit = TRUE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
214 for (i = 0; section[i] != '\0'; i++) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
215 if (section[i] >= '0' && section[i] <= '9') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
216 next_digit = FALSE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
217 } else if (!next_digit && section[i] == '.') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
218 next_digit = TRUE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
219 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
220 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
221 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
222 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
223 if (i == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
224 /* [], [HEADER], etc. */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
225 msgpart->section_number = "";
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
226 } else if (section[i] == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
227 /* [1.2.3] */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
228 if (i > 0 && section[i-1] == '.') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
229 pool_unref(&pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
230 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
231 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
232 msgpart->section_number = p_strdup(pool, section);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
233 section = "";
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
234 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
235 /* [1.2.3.MIME], [1.2.3.HEADER], etc */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
236 if (section[i-1] != '.') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
237 pool_unref(&pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
238 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
239 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
240 msgpart->section_number = p_strndup(pool, section, i-1);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
241 section += i;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
242 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
243
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
244 if (*section == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
245 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
246 if (*msgpart->section_number == '\0') {
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
247 /* BODY[] - header+body */
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
248 msgpart->fetch_type = FETCH_FULL;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
249 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
250 } else {
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
251 /* BODY[1] - body only */
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
252 msgpart->fetch_type = FETCH_MIME_BODY;
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
253 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
254 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
255 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
256 section = t_str_ucase(section);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
257
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
258 if (strcmp(section, "MIME") == 0) {
16857
73216464c8e1 imap: Don't assert-crash on FETCH BODY[MIME] (return BAD instead)
Timo Sirainen <tss@iki.fi>
parents: 16065
diff changeset
259 if (msgpart->section_number[0] == '\0')
73216464c8e1 imap: Don't assert-crash on FETCH BODY[MIME] (return BAD instead)
Timo Sirainen <tss@iki.fi>
parents: 16065
diff changeset
260 return -1;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
261 msgpart->fetch_type = FETCH_MIME;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
262 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
263 } else if (strcmp(section, "TEXT") == 0) {
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
264 /* body (for root or for message/rfc822) */
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
265 msgpart->fetch_type = FETCH_BODY;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
266 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
267 } else if (strncmp(section, "HEADER", 6) == 0) {
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
268 /* header (for root or for message/rfc822) */
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
269 if (section[6] == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
270 msgpart->fetch_type = FETCH_HEADER;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
271 ret = 0;
20260
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
272 } else if (strncmp(section, "HEADER.FIELDS.NOT", 17) == 0) {
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
273 msgpart->fetch_type = FETCH_HEADER_FIELDS_NOT;
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
274 ret = imap_msgpart_parse_header_fields(msgpart,
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
275 section+17);
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
276 } else if (strncmp(section, "HEADER.FIELDS", 13) == 0) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
277 msgpart->fetch_type = FETCH_HEADER_FIELDS;
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
278 ret = imap_msgpart_parse_header_fields(msgpart,
20260
9b5fddcd1f68 lib-imap-storage: Allow HEADER.FIELDS(..) without space before '('
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19886
diff changeset
279 section+13);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
280 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
281 ret = -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
282 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
283 if (ret < 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
284 imap_msgpart_free(&msgpart);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
285 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
286 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
287 if (msgpart->fetch_type == FETCH_HEADER_FIELDS) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
288 /* we may be able to get this from cache, don't give a
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
289 wanted_fields hint */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
290 } else if (*msgpart->section_number == '\0')
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
291 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
292 else
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
293 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
294 } else {
16065
ab434891f2af imap: Don't crash with invalid FETCH BODY[sections]
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
295 imap_msgpart_free(&msgpart);
ab434891f2af imap: Don't crash with invalid FETCH BODY[sections]
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
296 return -1;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
297 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
298 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
299 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
300
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
301 void imap_msgpart_free(struct imap_msgpart **_msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
302 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
303 struct imap_msgpart *msgpart = *_msgpart;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
304
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
305 *_msgpart = NULL;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
306
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
307 imap_msgpart_close_mailbox(msgpart);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
308 pool_unref(&msgpart->pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
309 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
310
18705
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
311 bool imap_msgpart_contains_body(const struct imap_msgpart *msgpart)
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
312 {
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
313 switch (msgpart->fetch_type) {
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
314 case FETCH_HEADER:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
315 case FETCH_HEADER_FIELDS:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
316 case FETCH_HEADER_FIELDS_NOT:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
317 return FALSE;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
318 case FETCH_FULL:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
319 case FETCH_MIME:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
320 case FETCH_MIME_BODY:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
321 case FETCH_BODY:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
322 break;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
323 }
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
324 return TRUE;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
325 }
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
326
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
327 void imap_msgpart_set_decode_to_binary(struct imap_msgpart *msgpart)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
328 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
329 msgpart->decode_cte_to_binary = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
330 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
331
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
332 void imap_msgpart_set_partial(struct imap_msgpart *msgpart,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
333 uoff_t offset, uoff_t size)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
334 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
335 msgpart->partial_offset = offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
336 msgpart->partial_size = size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
337 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
338
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
339 uoff_t imap_msgpart_get_partial_offset(struct imap_msgpart *msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
340 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
341 return msgpart->partial_offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
342 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
343
15637
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
344 uoff_t imap_msgpart_get_partial_size(struct imap_msgpart *msgpart)
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
345 {
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
346 return msgpart->partial_size;
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
347 }
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
348
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
349 enum mail_fetch_field imap_msgpart_get_fetch_data(struct imap_msgpart *msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
350 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
351 return msgpart->wanted_fields;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
352 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
353
18513
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
354 void imap_msgpart_get_wanted_headers(struct imap_msgpart *msgpart,
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
355 ARRAY_TYPE(const_string) *headers)
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
356 {
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
357 unsigned int i;
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
358
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
359 if (msgpart->fetch_type != FETCH_HEADER_FIELDS)
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
360 return;
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
361
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
362 for (i = 0; msgpart->headers[i] != NULL; i++)
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
363 array_append(headers, &msgpart->headers[i], 1);
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
364 }
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
365
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
366 static int
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
367 imap_msgpart_get_partial_header(struct mail *mail, struct istream *mail_input,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
368 const struct imap_msgpart *msgpart,
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
369 uoff_t *virtual_size_r, bool *have_crlfs_r,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
370 struct imap_msgpart_open_result *result_r)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
371 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
372 const char *const *hdr_fields = msgpart->headers;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
373 unsigned int hdr_count = str_array_length(hdr_fields);
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
374 struct message_size hdr_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
375 struct istream *input;
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14622
diff changeset
376 bool has_nuls;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
377
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
378 if (msgpart->fetch_type == FETCH_HEADER_FIELDS) {
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
379 input = i_stream_create_header_filter(mail_input,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
380 HEADER_FILTER_INCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
381 HEADER_FILTER_HIDE_BODY,
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
382 hdr_fields, hdr_count,
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
383 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
384 (void *)NULL);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
385 } else {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
386 i_assert(msgpart->fetch_type == FETCH_HEADER_FIELDS_NOT);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
387 input = i_stream_create_header_filter(mail_input,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
388 HEADER_FILTER_EXCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
389 HEADER_FILTER_HIDE_BODY,
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
390 hdr_fields, hdr_count,
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
391 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
392 (void *)NULL);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
393 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
394
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
395 if (message_get_header_size(input, &hdr_size, &has_nuls) < 0) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
396 errno = input->stream_errno;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
397 mail_storage_set_critical(mail->box->storage,
20267
e0c9a4da066a lib-imap-storage: Minor error logging cleanup/fix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20260
diff changeset
398 "read(%s) failed: %s", i_stream_get_name(input),
e0c9a4da066a lib-imap-storage: Minor error logging cleanup/fix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20260
diff changeset
399 i_stream_get_error(input));
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
400 i_stream_unref(&input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
401 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
402 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
403 i_stream_seek(input, 0);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
404 result_r->input = input;
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
405 result_r->size = hdr_size.virtual_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
406 result_r->size_field = 0;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
407 *virtual_size_r = hdr_size.virtual_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
408 *have_crlfs_r = hdr_size.physical_size == hdr_size.virtual_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
409 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
410 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
411
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
412 static struct istream *
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
413 imap_msgpart_crlf_seek(struct mail *mail, struct istream *input,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
414 const struct imap_msgpart *msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
415 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
416 struct mail_msgpart_partial_cache *cache = &mail->box->partial_cache;
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
417 struct istream *crlf_input, *errinput;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
418 uoff_t physical_start = input->v_offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
419 uoff_t virtual_skip = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
420 bool cr_skipped;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
421
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
422 i_assert(msgpart->headers == NULL); /* HEADER.FIELDS returns CRLFs */
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
423
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
424 if (virtual_skip == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
425 /* no need to seek */
20700
d974673e577c lib-imap-storage: Check that UID is assigned before caching
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
426 } else if (mail->uid > 0 && cache->uid == mail->uid &&
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
427 cache->physical_start == physical_start &&
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
428 cache->virtual_pos < virtual_skip) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
429 /* use cache */
14868
f4de7ed984b3 imap: Fixed fetching partial ranges from non-BODY[]
Timo Sirainen <tss@iki.fi>
parents: 14864
diff changeset
430 i_stream_seek(input, physical_start + cache->physical_pos);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
431 virtual_skip -= cache->virtual_pos;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
432 }
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
433 if (message_skip_virtual(input, virtual_skip, &cr_skipped) < 0) {
17597
82c9a9b7e6e6 When creating istream-error, give an error string whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 17198
diff changeset
434 errinput = i_stream_create_error_str(errno, "%s", i_stream_get_error(input));
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
435 i_stream_set_name(errinput, i_stream_get_name(input));
16937
0505adfe2d8e lib-imap-storage: Fixed leaking istream on error conditions.
Timo Sirainen <tss@iki.fi>
parents: 16857
diff changeset
436 i_stream_unref(&input);
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
437 return errinput;
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
438 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
439
20700
d974673e577c lib-imap-storage: Check that UID is assigned before caching
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
440 if (mail->uid > 0 &&
d974673e577c lib-imap-storage: Check that UID is assigned before caching
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
441 (msgpart->partial_offset != 0 ||
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
442 msgpart->partial_size != (uoff_t)-1) && !input->eof) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
443 /* update cache */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
444 cache->uid = mail->uid;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
445 cache->physical_start = physical_start;
15238
e9cdf435fde2 imap: Another fix for handling partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15237
diff changeset
446 cache->physical_pos = input->v_offset - physical_start;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
447 cache->virtual_pos = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
448 if (cr_skipped) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
449 /* the physical_pos points to virtual CRLF, but
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
450 virtual_pos already skipped CR. that can't work,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
451 so seek back the virtual CR */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
452 cache->virtual_pos--;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
453 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
454 }
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
455 crlf_input = i_stream_create_crlf(input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
456 if (cr_skipped)
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
457 i_stream_skip(crlf_input, 1);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
458 i_stream_unref(&input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
459 return crlf_input;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
460 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
461
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
462 static void
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
463 imap_msgpart_get_partial(struct mail *mail, const struct imap_msgpart *msgpart,
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
464 bool convert_nuls, bool use_partial_cache,
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
465 uoff_t virtual_size, bool have_crlfs,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
466 struct imap_msgpart_open_result *result)
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
467 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
468 struct istream *input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
469 uoff_t bytes_left;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
470
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
471 /* input is already seeked to the beginning of the wanted data */
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
472
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
473 if (msgpart->partial_offset >= virtual_size) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
474 /* can't seek past the MIME part */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
475 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
476 result->input = i_stream_create_from_data("", 0);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
477 result->size = 0;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
478 return;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
479 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
480
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
481 if (have_crlfs) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
482 /* input has CRLF linefeeds, we can quickly seek to
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
483 wanted position */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
484 i_stream_skip(result->input, msgpart->partial_offset);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
485 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
486 /* input has LF linefeeds. it can be slow to seek to wanted
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
487 position, so try to do caching whenever possible */
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
488 i_assert(use_partial_cache);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
489 result->input = imap_msgpart_crlf_seek(mail, result->input,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
490 msgpart);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
491 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
492
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
493 bytes_left = virtual_size - msgpart->partial_offset;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
494 if (msgpart->partial_size <= bytes_left) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
495 /* limit output to specified number of bytes */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
496 result->size = msgpart->partial_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
497 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
498 /* send all bytes */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
499 result->size = bytes_left;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
500 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
501
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
502 if (!mail->has_no_nuls && convert_nuls) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
503 /* IMAP literals must not contain NULs. change them to
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
504 0x80 characters. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
505 input2 = i_stream_create_nonuls(result->input, 0x80);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
506 i_stream_unref(&result->input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
507 result->input = input2;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
508 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
509 input2 = i_stream_create_limit(result->input, result->size);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
510 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
511 result->input = input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
512 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
513
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
514 static int
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
515 imap_msgpart_find_part(struct mail *mail, const struct imap_msgpart *msgpart,
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
516 struct message_part **part_r)
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
517 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
518 struct message_part *parts, *part = NULL;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
519
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
520 if (*msgpart->section_number == '\0') {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
521 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
522 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
523 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
524
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
525 if (mail_get_parts(mail, &parts) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
526 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
527 part = imap_msgpart_find(parts, msgpart->section_number);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
528 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
529 /* MIME part not found. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
530 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
531 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
532 }
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
533
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
534 switch (msgpart->fetch_type) {
14911
2535dbe7c503 imap: Added more tests to return empty data when FETCHing invalid MIME parts.
Timo Sirainen <tss@iki.fi>
parents: 14888
diff changeset
535 case FETCH_MIME:
14924
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
536 /* What to do if this is a message/rfc822? Does it have
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
537 MIME headers or not? Possibilities are: a) no, return
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
538 empty string (UW-IMAP does this), b) return the same as
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
539 HEADER. Dovecot has done b) for a long time and it's not
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
540 very clear which one is correct, so we'll just continue
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
541 with b) */
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
542 case FETCH_FULL:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
543 case FETCH_MIME_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
544 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
545 case FETCH_HEADER:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
546 case FETCH_HEADER_FIELDS:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
547 case FETCH_HEADER_FIELDS_NOT:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
548 case FETCH_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
549 /* fetching message/rfc822 part's header/body */
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
550 if ((part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) == 0) {
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
551 *part_r = NULL;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
552 return 0;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
553 }
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
554 i_assert(part->children != NULL &&
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
555 part->children->next == NULL);
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
556 part = part->children;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
557 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
558 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
559 *part_r = part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
560 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
561 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
562
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
563 static int
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
564 imap_msgpart_open_normal(struct mail *mail, struct imap_msgpart *msgpart,
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
565 const struct message_part *part,
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
566 uoff_t *virtual_size_r, bool *have_crlfs_r,
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
567 struct imap_msgpart_open_result *result_r)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
568 {
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
569 struct message_size hdr_size, body_size, part_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
570 struct istream *input = NULL;
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
571 bool unknown_crlfs = FALSE;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
572
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20700
diff changeset
573 i_zero(&hdr_size);
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20700
diff changeset
574 i_zero(&body_size);
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20700
diff changeset
575 i_zero(&part_size);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
576
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
577 if (*msgpart->section_number != '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
578 /* find the MIME part */
20560
3a71ed48cdf7 Use mail_get_*stream_because() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20268
diff changeset
579 if (mail_get_stream_because(mail, NULL, NULL, "MIME part", &input) < 0)
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
580 return -1;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
581
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
582 i_stream_seek(input, part->physical_pos);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
583 hdr_size = part->header_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
584 body_size = part->body_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
585 } else switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
586 case FETCH_FULL:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
587 /* fetch the whole message */
20560
3a71ed48cdf7 Use mail_get_*stream_because() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20268
diff changeset
588 if (mail_get_stream_because(mail, NULL, NULL, "full mail", &input) < 0 ||
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
589 mail_get_virtual_size(mail, &body_size.virtual_size) < 0)
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
590 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
591 result_r->size_field = MAIL_FETCH_VIRTUAL_SIZE;
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
592
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
593 i_assert(mail->lookup_abort == MAIL_LOOKUP_ABORT_NEVER);
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
594 mail->lookup_abort = MAIL_LOOKUP_ABORT_READ_MAIL;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
595 if (mail_get_physical_size(mail, &body_size.physical_size) < 0)
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
596 unknown_crlfs = TRUE;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
597 mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
598 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
599 case FETCH_MIME:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
600 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
601 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
602 case FETCH_HEADER:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
603 case FETCH_HEADER_FIELDS_NOT:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
604 /* fetch the message's header */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
605 if (mail_get_hdr_stream(mail, &hdr_size, &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
606 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
607 result_r->size_field = MAIL_FETCH_MESSAGE_PARTS;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
608 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
609 case FETCH_HEADER_FIELDS:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
610 /* try to lookup the headers from cache */
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
611 if (msgpart->header_ctx == NULL) {
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
612 msgpart->header_ctx =
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
613 mailbox_header_lookup_init(mail->box,
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
614 msgpart->headers);
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
615 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
616 if (mail_get_header_stream(mail, msgpart->header_ctx,
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
617 &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
618 return -1;
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
619 result_r->size_field = 0;
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
620 break;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
621 case FETCH_BODY:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
622 /* fetch the message's body */
20560
3a71ed48cdf7 Use mail_get_*stream_because() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20268
diff changeset
623 if (mail_get_stream_because(mail, &hdr_size, &body_size,
3a71ed48cdf7 Use mail_get_*stream_because() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20268
diff changeset
624 "mail body", &input) < 0)
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
625 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
626 result_r->size_field = MAIL_FETCH_MESSAGE_PARTS;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
627 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
628 }
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
629
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
630 if (msgpart->headers != NULL) {
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
631 /* return specific headers */
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
632 return imap_msgpart_get_partial_header(mail, input, msgpart,
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
633 virtual_size_r,
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
634 have_crlfs_r, result_r);
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
635 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
636
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
637 switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
638 case FETCH_FULL:
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
639 part_size.physical_size += body_size.physical_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
640 part_size.virtual_size += body_size.virtual_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
641 /* fall through */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
642 case FETCH_MIME:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
643 case FETCH_HEADER:
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
644 part_size.physical_size += hdr_size.physical_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
645 part_size.virtual_size += hdr_size.virtual_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
646 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
647 case FETCH_HEADER_FIELDS:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
648 case FETCH_HEADER_FIELDS_NOT:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
649 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
650 case FETCH_BODY:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
651 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
652 i_stream_skip(input, hdr_size.physical_size);
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
653 part_size.physical_size += body_size.physical_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
654 part_size.virtual_size += body_size.virtual_size;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
655 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
656 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
657
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
658 result_r->input = input;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
659 i_stream_ref(input);
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
660 *virtual_size_r = part_size.virtual_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
661 *have_crlfs_r = !unknown_crlfs &&
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
662 part_size.virtual_size == part_size.physical_size;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
663 return 0;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
664 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
665
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
666 int imap_msgpart_open(struct mail *mail, struct imap_msgpart *msgpart,
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
667 struct imap_msgpart_open_result *result_r)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
668 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
669 struct message_part *part;
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
670 uoff_t virtual_size;
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
671 bool include_hdr, binary, use_partial_cache, have_crlfs;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
672 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
673
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20700
diff changeset
674 i_zero(result_r);
14864
ec5346eb7d60 imap: Fixed FETCHing nonexistent parts.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
675
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
676 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
677 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
678 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
679 /* MIME part not found. return an empty part. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
680 result_r->input = i_stream_create_from_data("", 0);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
681 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
682 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
683
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
684 if (msgpart->decode_cte_to_binary &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
685 (msgpart->fetch_type == FETCH_FULL ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
686 msgpart->fetch_type == FETCH_BODY ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
687 msgpart->fetch_type == FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
688 /* binary fetch */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
689 include_hdr = msgpart->fetch_type == FETCH_FULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
690 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
691 if (mail_get_parts(mail, &part) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
692 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
693 }
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
694 if (mail_get_binary_stream(mail, part, include_hdr,
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
695 &virtual_size, &binary,
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
696 &result_r->input) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
697 return -1;
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
698 have_crlfs = TRUE;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
699 use_partial_cache = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
700 } else {
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
701 if (imap_msgpart_open_normal(mail, msgpart, part, &virtual_size,
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
702 &have_crlfs, result_r) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
703 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
704 binary = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
705 use_partial_cache = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
706 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
707
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
708 if (binary && msgpart->decode_cte_to_binary)
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
709 result_r->binary_decoded_input_has_nuls = TRUE;
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
710
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
711 imap_msgpart_get_partial(mail, msgpart, !binary, use_partial_cache,
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
712 virtual_size, have_crlfs, result_r);
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
713 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
714 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
715
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
716 int imap_msgpart_size(struct mail *mail, struct imap_msgpart *msgpart,
15070
8e29272c35fa lib-imap-storage: imap_msgpart_size() should return size as uoff_t, not size_t
Timo Sirainen <tss@iki.fi>
parents: 15065
diff changeset
717 uoff_t *size_r)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
718 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
719 struct imap_msgpart_open_result result;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
720 struct message_part *part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
721 bool include_hdr;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
722 unsigned int lines;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
723 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
724
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
725 if (!msgpart->decode_cte_to_binary ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
726 (msgpart->fetch_type != FETCH_FULL &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
727 msgpart->fetch_type != FETCH_BODY &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
728 msgpart->fetch_type != FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
729 /* generic implementation */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
730 if (imap_msgpart_open(mail, msgpart, &result) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
731 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
732 i_stream_unref(&result.input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
733 *size_r = result.size;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
734 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
735 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
736
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
737 /* binary-optimized implementation: */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
738 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
739 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
740 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
741 /* MIME part not found. return an empty part. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
742 *size_r = 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
743 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
744 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
745 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
746 if (mail_get_parts(mail, &part) < 0)
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
747 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
748 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
749 include_hdr = msgpart->fetch_type == FETCH_FULL;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
750 return mail_get_binary_size(mail, part, include_hdr, size_r, &lines);
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
751 }
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
752
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
753 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
754 imap_msgpart_parse_bodystructure(struct mail *mail,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
755 struct message_part *all_parts)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
756 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
757 struct mail_private *pmail = (struct mail_private *)mail;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
758 const char *bodystructure, *error;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
759
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
760 if (mail_get_special(mail, MAIL_FETCH_IMAP_BODYSTRUCTURE,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
761 &bodystructure) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
762 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
763 if (all_parts->context != NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
764 /* we just parsed the bodystructure */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
765 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
766 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
767
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
768 if (imap_bodystructure_parse(bodystructure, pmail->data_pool,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
769 all_parts, &error) < 0) {
19886
63955a428a73 Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
770 mail_set_cache_corrupted_reason(mail,
63955a428a73 Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
771 MAIL_FETCH_IMAP_BODYSTRUCTURE, t_strdup_printf(
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
772 "Invalid message_part/BODYSTRUCTURE %s: %s",
19886
63955a428a73 Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
773 bodystructure, error));
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
774 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
775 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
776 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
777 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
778
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
779 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
780 imap_msgpart_vsizes_to_binary(struct mail *mail, const struct message_part *part,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
781 struct message_part **binpart_r)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
782 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
783 struct message_part **pos;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
784 uoff_t size;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
785 unsigned int lines;
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
786
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
787 if (mail_get_binary_size(mail, part, FALSE, &size, &lines) < 0)
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
788 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
789
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
790 *binpart_r = t_new(struct message_part, 1);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
791 **binpart_r = *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
792 (*binpart_r)->body_size.virtual_size = size;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
793 (*binpart_r)->body_size.lines = lines;
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
794
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
795 pos = &(*binpart_r)->children;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
796 for (part = part->children; part != NULL; part = part->next) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
797 if (imap_msgpart_vsizes_to_binary(mail, part, pos) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
798 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
799 pos = &(*pos)->next;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
800 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
801 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
802 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
803
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
804 int imap_msgpart_bodypartstructure(struct mail *mail,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
805 struct imap_msgpart *msgpart,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
806 const char **bpstruct_r)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
807 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
808 struct message_part *all_parts, *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
809 string_t *bpstruct;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
810 int ret;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
811
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
812 /* if we start parsing the body in here, make sure we also parse the
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
813 BODYSTRUCTURE */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
814 mail_add_temp_wanted_fields(mail, MAIL_FETCH_IMAP_BODYSTRUCTURE, NULL);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
815
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
816 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
817 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
818 if (ret == 0) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
819 /* MIME part not found. */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
820 *bpstruct_r = NULL;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
821 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
822 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
823
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
824 if (mail_get_parts(mail, &all_parts) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
825 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
826 if (all_parts->context == NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
827 if (imap_msgpart_parse_bodystructure(mail, all_parts) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
828 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
829 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
830 if (part == NULL)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
831 part = all_parts;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
832
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
833 if (msgpart->decode_cte_to_binary)
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
834 ret = imap_msgpart_vsizes_to_binary(mail, part, &part);
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
835
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
836 if (ret >= 0) {
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
837 bpstruct = t_str_new(256);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
838 imap_bodystructure_write(part, bpstruct, TRUE);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
839 *bpstruct_r = str_c(bpstruct);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
840 }
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
841 return ret < 0 ? -1 : 1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
842 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
843
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
844
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
845 void imap_msgpart_close_mailbox(struct imap_msgpart *msgpart)
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
846 {
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
847 if (msgpart->header_ctx != NULL)
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
848 mailbox_header_lookup_unref(&msgpart->header_ctx);
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
849 }