annotate src/lib-imap-storage/imap-msgpart.c @ 18513:8c49fb6d789b

imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization. Primarily this fixes imapc's prefetching.
author Timo Sirainen <tss@iki.fi>
date Mon, 04 May 2015 18:44:29 +0300
parents 3009a1a6f6d5
children 4cd9e46e0c78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18137
3009a1a6f6d5 global: freshen copyright
Phil Carmody <phil@dovecot.fi>
parents: 17996
diff changeset
1 /* Copyright (c) 2013-2015 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 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
169 } else {
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
170 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
171 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
172
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
173 /* istream-header-filter requires headers to be sorted */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
174 array_sort(fields, i_strcasecmp_p);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
175
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
176 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
177 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
178 return result;
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
179 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
180
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
181 static int
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
182 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
183 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
184 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
185 ARRAY_TYPE(const_string) fields;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
186
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
187 /* 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
188 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
189 &fields) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
190 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
191
14686
9ff19c1d5f69 Added array_append_zero() to write a zero-filled record to an array.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
192 array_append_zero(&fields);
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
193 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
194 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
195 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
196
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
197 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
198 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
199 struct imap_msgpart *msgpart;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
200 pool_t pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
201 unsigned int i;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
202 bool next_digit;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
203 int ret;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
204
14708
2ab4aa784474 imap: Fixed crashes on some FETCH commands
Timo Sirainen <tss@iki.fi>
parents: 14686
diff changeset
205 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
206 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
207 msgpart->pool = pool;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
208 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
209
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
210 /* get the section number */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
211 next_digit = TRUE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
212 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
213 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
214 next_digit = FALSE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
215 } 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
216 next_digit = TRUE;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
217 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
218 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
219 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
220 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
221 if (i == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
222 /* [], [HEADER], etc. */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
223 msgpart->section_number = "";
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
224 } else if (section[i] == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
225 /* [1.2.3] */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
226 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
227 pool_unref(&pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
228 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
229 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
230 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
231 section = "";
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
232 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
233 /* [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
234 if (section[i-1] != '.') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
235 pool_unref(&pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
236 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
237 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
238 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
239 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
240 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
241
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
242 if (*section == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
243 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
244 if (*msgpart->section_number == '\0') {
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
245 /* BODY[] - header+body */
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
246 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
247 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
248 } else {
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
249 /* BODY[1] - body only */
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
250 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
251 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
252 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
253 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
254 section = t_str_ucase(section);
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 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
257 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
258 return -1;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
259 msgpart->fetch_type = FETCH_MIME;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
260 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
261 } 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
262 /* 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
263 msgpart->fetch_type = FETCH_BODY;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
264 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
265 } 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
266 /* 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
267 if (section[6] == '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
268 msgpart->fetch_type = FETCH_HEADER;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
269 ret = 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
270 } else if (strncmp(section, "HEADER.FIELDS ", 14) == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
271 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
272 ret = imap_msgpart_parse_header_fields(msgpart,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
273 section+14);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
274 } else if (strncmp(section, "HEADER.FIELDS.NOT ", 18) == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
275 msgpart->fetch_type = FETCH_HEADER_FIELDS_NOT;
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
276 ret = imap_msgpart_parse_header_fields(msgpart,
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
277 section+18);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
278 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
279 ret = -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
280 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
281 if (ret < 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
282 imap_msgpart_free(&msgpart);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
283 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
284 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
285 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
286 /* 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
287 wanted_fields hint */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
288 } 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
289 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
290 else
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_BODY;
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
292 } else {
16065
ab434891f2af imap: Don't crash with invalid FETCH BODY[sections]
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
293 imap_msgpart_free(&msgpart);
ab434891f2af imap: Don't crash with invalid FETCH BODY[sections]
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
294 return -1;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
295 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
296 return 0;
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
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
299 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
300 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
301 struct imap_msgpart *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 *_msgpart = NULL;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
304
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
305 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
306 pool_unref(&msgpart->pool);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
307 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
308
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
309 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
310 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
311 msgpart->decode_cte_to_binary = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
312 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
313
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
314 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
315 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
316 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
317 msgpart->partial_offset = offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
318 msgpart->partial_size = size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
319 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
320
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
321 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
322 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
323 return msgpart->partial_offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
324 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
325
15637
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
326 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
327 {
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
328 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
329 }
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
330
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
331 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
332 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
333 return msgpart->wanted_fields;
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
18513
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
336 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
337 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
338 {
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
339 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
340
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
341 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
342 return;
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
343
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
344 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
345 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
346 }
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
347
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
348 static int
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
349 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
350 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
351 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
352 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
353 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
354 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
355 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
356 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
357 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
358 bool has_nuls;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
359
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
360 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
361 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
362 HEADER_FILTER_INCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
363 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
364 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
365 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
366 (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
367 } else {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
368 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
369 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
370 HEADER_FILTER_EXCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
371 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
372 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
373 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
374 (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
375 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
376
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
377 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
378 errno = input->stream_errno;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
379 mail_storage_set_critical(mail->box->storage,
17996
7681fcd1ba43 Use i_stream_get_error() wherever possible instead of %m
Timo Sirainen <tss@iki.fi>
parents: 17597
diff changeset
380 "read(%s) failed: %s", i_stream_get_name(mail_input),
7681fcd1ba43 Use i_stream_get_error() wherever possible instead of %m
Timo Sirainen <tss@iki.fi>
parents: 17597
diff changeset
381 i_stream_get_error(mail_input));
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
382 i_stream_unref(&input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
383 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
384 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
385 i_stream_seek(input, 0);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
386 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
387 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
388 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
389 *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
390 *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
391 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
392 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
393
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
394 static struct istream *
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
395 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
396 const struct imap_msgpart *msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
397 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
398 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
399 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
400 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
401 uoff_t virtual_skip = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
402 bool cr_skipped;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
403
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
404 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
405
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
406 if (virtual_skip == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
407 /* no need to seek */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
408 } else if (cache->uid == mail->uid &&
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
409 cache->physical_start == physical_start &&
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
410 cache->virtual_pos < virtual_skip) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
411 /* use cache */
14868
f4de7ed984b3 imap: Fixed fetching partial ranges from non-BODY[]
Timo Sirainen <tss@iki.fi>
parents: 14864
diff changeset
412 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
413 virtual_skip -= cache->virtual_pos;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
414 }
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
415 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
416 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
417 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
418 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
419 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
420 }
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 if ((msgpart->partial_offset != 0 ||
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
423 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
424 /* update cache */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
425 cache->uid = mail->uid;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
426 cache->physical_start = physical_start;
15238
e9cdf435fde2 imap: Another fix for handling partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15237
diff changeset
427 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
428 cache->virtual_pos = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
429 if (cr_skipped) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
430 /* 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
431 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
432 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
433 cache->virtual_pos--;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
434 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
435 }
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
436 crlf_input = i_stream_create_crlf(input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
437 if (cr_skipped)
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
438 i_stream_skip(crlf_input, 1);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
439 i_stream_unref(&input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
440 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
441 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
442
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
443 static void
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
444 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
445 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
446 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
447 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
448 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
449 struct istream *input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
450 uoff_t bytes_left;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
451
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
452 /* 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
453
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
454 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
455 /* 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
456 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
457 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
458 result->size = 0;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
459 return;
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
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
462 if (have_crlfs) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
463 /* 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
464 wanted position */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
465 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
466 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
467 /* 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
468 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
469 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
470 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
471 msgpart);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
472 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
473
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
474 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
475 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
476 /* 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
477 result->size = msgpart->partial_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
478 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
479 /* send all bytes */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
480 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
481 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
482
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
483 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
484 /* 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
485 0x80 characters. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
486 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
487 i_stream_unref(&result->input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
488 result->input = input2;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
489 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
490 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
491 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
492 result->input = input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
493 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
494
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
495 static int
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
496 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
497 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
498 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
499 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
500
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
501 if (*msgpart->section_number == '\0') {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
502 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
503 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
504 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
505
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
506 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
507 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
508 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
509 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
510 /* MIME part not found. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
511 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
512 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
513 }
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
514
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
515 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
516 case FETCH_MIME:
14924
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
517 /* 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
518 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
519 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
520 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
521 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
522 with b) */
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
523 case FETCH_FULL:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
524 case FETCH_MIME_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
525 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
526 case FETCH_HEADER:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
527 case FETCH_HEADER_FIELDS:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
528 case FETCH_HEADER_FIELDS_NOT:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
529 case FETCH_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
530 /* fetching message/rfc822 part's header/body */
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
531 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
532 *part_r = NULL;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
533 return 0;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
534 }
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
535 i_assert(part->children != NULL &&
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
536 part->children->next == NULL);
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
537 part = part->children;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
538 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
539 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
540 *part_r = part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
541 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
542 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
543
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
544 static int
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
545 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
546 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
547 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
548 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
549 {
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
550 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
551 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
552 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
553
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
554 memset(&hdr_size, 0, sizeof(hdr_size));
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
555 memset(&body_size, 0, sizeof(body_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
556 memset(&part_size, 0, sizeof(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
557
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
558 if (*msgpart->section_number != '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
559 /* find the MIME part */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
560 if (mail_get_stream(mail, NULL, NULL, &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
561 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
562
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
563 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
564 hdr_size = part->header_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
565 body_size = part->body_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
566 } else switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
567 case FETCH_FULL:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
568 /* fetch the whole message */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
569 if (mail_get_stream(mail, NULL, NULL, &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
570 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
571 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
572 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
573
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
574 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
575 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
576 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
577 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
578 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
579 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
580 case FETCH_MIME:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
581 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
582 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
583 case FETCH_HEADER:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
584 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
585 /* fetch the message's header */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
586 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
587 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
588 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
589 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
590 case FETCH_HEADER_FIELDS:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
591 /* 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
592 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
593 msgpart->header_ctx =
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
594 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
595 msgpart->headers);
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
596 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
597 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
598 &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
599 return -1;
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
600 result_r->size_field = 0;
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
601 break;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
602 case FETCH_BODY:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
603 /* fetch the message's body */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
604 if (mail_get_stream(mail, &hdr_size, &body_size, &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
605 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
606 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
607 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
608 }
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
609
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
610 if (msgpart->headers != NULL) {
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
611 /* return specific headers */
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
612 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
613 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
614 have_crlfs_r, result_r);
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
615 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
616
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
617 switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
618 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
619 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
620 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
621 /* fall through */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
622 case FETCH_MIME:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
623 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
624 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
625 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
626 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
627 case FETCH_HEADER_FIELDS:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
628 case FETCH_HEADER_FIELDS_NOT:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
629 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
630 case FETCH_BODY:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
631 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
632 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
633 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
634 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
635 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
636 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
637
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
638 result_r->input = input;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
639 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
640 *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
641 *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
642 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
643 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
644 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
645
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
646 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
647 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
648 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
649 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
650 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
651 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
652 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
653
14864
ec5346eb7d60 imap: Fixed FETCHing nonexistent parts.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
654 memset(result_r, 0, sizeof(*result_r));
ec5346eb7d60 imap: Fixed FETCHing nonexistent parts.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
655
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
656 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
657 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
658 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
659 /* 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
660 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
661 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
662 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
663
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
664 if (msgpart->decode_cte_to_binary &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
665 (msgpart->fetch_type == FETCH_FULL ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
666 msgpart->fetch_type == FETCH_BODY ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
667 msgpart->fetch_type == FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
668 /* binary fetch */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
669 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
670 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
671 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
672 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
673 }
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
674 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
675 &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
676 &result_r->input) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
677 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
678 have_crlfs = TRUE;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
679 use_partial_cache = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
680 } 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
681 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
682 &have_crlfs, result_r) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
683 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
684 binary = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
685 use_partial_cache = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
686 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
687
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
688 if (binary && msgpart->decode_cte_to_binary)
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
689 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
690
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
691 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
692 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
693 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
694 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
695
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
696 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
697 uoff_t *size_r)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
698 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
699 struct imap_msgpart_open_result result;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
700 struct message_part *part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
701 bool include_hdr;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
702 unsigned int lines;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
703 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
704
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
705 if (!msgpart->decode_cte_to_binary ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
706 (msgpart->fetch_type != FETCH_FULL &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
707 msgpart->fetch_type != FETCH_BODY &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
708 msgpart->fetch_type != FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
709 /* generic implementation */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
710 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
711 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
712 i_stream_unref(&result.input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
713 *size_r = result.size;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
714 return 0;
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
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
717 /* binary-optimized implementation: */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
718 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
719 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
720 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
721 /* 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
722 *size_r = 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
723 return 0;
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 (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
726 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
727 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
728 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
729 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
730 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
731 }
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
732
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
733 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
734 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
735 struct message_part *all_parts)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
736 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
737 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
738 const char *bodystructure, *error;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
739
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
740 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
741 &bodystructure) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
742 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
743 if (all_parts->context != NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
744 /* we just parsed the bodystructure */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
745 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
746 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
747
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
748 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
749 all_parts, &error) < 0) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
750 mail_storage_set_critical(mail->box->storage,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
751 "Invalid message_part/BODYSTRUCTURE %s: %s",
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
752 bodystructure, error);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
753 mail_set_cache_corrupted(mail, MAIL_FETCH_MESSAGE_PARTS);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
754 mail_set_cache_corrupted(mail, MAIL_FETCH_IMAP_BODYSTRUCTURE);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
755 return -1;
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 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
758 }
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 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
761 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
762 struct message_part **binpart_r)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
763 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
764 struct message_part **pos;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
765 uoff_t size;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
766 unsigned int lines;
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
767
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
768 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
769 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
770
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
771 *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
772 **binpart_r = *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
773 (*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
774 (*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
775
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
776 pos = &(*binpart_r)->children;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
777 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
778 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
779 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
780 pos = &(*pos)->next;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
781 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
782 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
783 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
784
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
785 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
786 struct imap_msgpart *msgpart,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
787 const char **bpstruct_r)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
788 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
789 struct message_part *all_parts, *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
790 string_t *bpstruct;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
791 int ret;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
792
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
793 /* 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
794 BODYSTRUCTURE */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
795 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
796
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
797 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
798 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
799 if (ret == 0) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
800 /* MIME part not found. */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
801 *bpstruct_r = NULL;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
802 return 0;
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
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
805 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
806 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
807 if (all_parts->context == NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
808 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
809 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
810 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
811 if (part == NULL)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
812 part = all_parts;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
813
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
814 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
815 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
816
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
817 if (ret >= 0) {
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
818 bpstruct = t_str_new(256);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
819 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
820 *bpstruct_r = str_c(bpstruct);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
821 }
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
822 return ret < 0 ? -1 : 1;
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
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
825
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
826 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
827 {
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
828 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
829 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
830 }