annotate src/lib-imap-storage/imap-msgpart.c @ 19552:0f22db71df7a

global: freshen copyright git ls-files | xargs perl -p -i -e 's/(\d+)-201[0-5]/$1-2016/g;s/ (201[0-5]) Dovecot/ $1-2016 Dovecot/'
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 13 Jan 2016 12:24:03 +0200
parents 4cd9e46e0c78
children 63955a428a73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19552
0f22db71df7a global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 18705
diff changeset
1 /* Copyright (c) 2013-2016 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
18705
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
309 bool imap_msgpart_contains_body(const struct imap_msgpart *msgpart)
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
310 {
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
311 switch (msgpart->fetch_type) {
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
312 case FETCH_HEADER:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
313 case FETCH_HEADER_FIELDS:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
314 case FETCH_HEADER_FIELDS_NOT:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
315 return FALSE;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
316 case FETCH_FULL:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
317 case FETCH_MIME:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
318 case FETCH_MIME_BODY:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
319 case FETCH_BODY:
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
320 break;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
321 }
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
322 return TRUE;
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
323 }
4cd9e46e0c78 lib-imap-storage: Added imap_msgpart_contains_body()
Timo Sirainen <tss@iki.fi>
parents: 18513
diff changeset
324
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
325 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
326 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
327 msgpart->decode_cte_to_binary = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
328 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
329
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
330 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
331 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
332 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
333 msgpart->partial_offset = offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
334 msgpart->partial_size = size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
335 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
336
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
337 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
338 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
339 return msgpart->partial_offset;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
340 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
341
15637
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
342 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
343 {
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
344 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
345 }
b0e0eb30c2b9 lib-imap-storage: Added imap_msgpart_get_partial_size() missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents: 15413
diff changeset
346
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
347 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
348 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
349 return msgpart->wanted_fields;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
350 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
351
18513
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
352 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
353 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
354 {
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
355 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
356
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
357 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
358 return;
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
359
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
360 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
361 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
362 }
8c49fb6d789b imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
363
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
364 static int
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
365 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
366 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
367 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
368 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
369 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
370 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
371 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
372 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
373 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
374 bool has_nuls;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
375
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
376 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
377 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
378 HEADER_FILTER_INCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
379 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
380 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
381 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
382 (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
383 } else {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
384 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
385 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
386 HEADER_FILTER_EXCLUDE |
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
387 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
388 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
389 *null_header_filter_callback,
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14912
diff changeset
390 (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
391 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
392
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
393 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
394 errno = input->stream_errno;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
395 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
396 "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
397 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
398 i_stream_unref(&input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
399 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
400 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
401 i_stream_seek(input, 0);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
402 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
403 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
404 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
405 *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
406 *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
407 return 0;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
408 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
409
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
410 static struct istream *
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
411 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
412 const struct imap_msgpart *msgpart)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
413 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
414 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
415 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
416 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
417 uoff_t virtual_skip = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
418 bool cr_skipped;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
419
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
420 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
421
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
422 if (virtual_skip == 0) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
423 /* no need to seek */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
424 } 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
425 cache->physical_start == physical_start &&
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
426 cache->virtual_pos < virtual_skip) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
427 /* use cache */
14868
f4de7ed984b3 imap: Fixed fetching partial ranges from non-BODY[]
Timo Sirainen <tss@iki.fi>
parents: 14864
diff changeset
428 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
429 virtual_skip -= cache->virtual_pos;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
430 }
15413
ecf2f2044455 lib-imap-storage: When returning an error istream, give it a useful name.
Timo Sirainen <tss@iki.fi>
parents: 15238
diff changeset
431 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
432 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
433 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
434 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
435 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
436 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
437
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
438 if ((msgpart->partial_offset != 0 ||
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
439 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
440 /* update cache */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
441 cache->uid = mail->uid;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
442 cache->physical_start = physical_start;
15238
e9cdf435fde2 imap: Another fix for handling partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15237
diff changeset
443 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
444 cache->virtual_pos = msgpart->partial_offset;
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
445 if (cr_skipped) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
446 /* 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
447 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
448 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
449 cache->virtual_pos--;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
450 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
451 }
15177
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
452 crlf_input = i_stream_create_crlf(input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
453 if (cr_skipped)
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
454 i_stream_skip(crlf_input, 1);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
455 i_stream_unref(&input);
99843f74422a imap: Fixed partial FETCHes.
Timo Sirainen <tss@iki.fi>
parents: 15070
diff changeset
456 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
457 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
458
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
459 static void
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
460 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
461 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
462 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
463 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
464 {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
465 struct istream *input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
466 uoff_t bytes_left;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
467
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
468 /* 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
469
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
470 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
471 /* 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
472 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
473 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
474 result->size = 0;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14591
diff changeset
475 return;
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
476 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
477
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
478 if (have_crlfs) {
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
479 /* 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
480 wanted position */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
481 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
482 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
483 /* 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
484 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
485 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
486 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
487 msgpart);
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
488 }
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
489
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
490 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
491 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
492 /* 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
493 result->size = msgpart->partial_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
494 } else {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
495 /* send all bytes */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
496 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
497 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
498
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
499 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
500 /* 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
501 0x80 characters. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
502 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
503 i_stream_unref(&result->input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
504 result->input = input2;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
505 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
506 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
507 i_stream_unref(&result->input);
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
508 result->input = input2;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
509 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
510
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
511 static int
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
512 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
513 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
514 {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
515 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
516
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
517 if (*msgpart->section_number == '\0') {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
518 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
519 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
520 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
521
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
522 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
523 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
524 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
525 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
526 /* MIME part not found. */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
527 *part_r = NULL;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
528 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
529 }
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
530
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
531 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
532 case FETCH_MIME:
14924
6c55e57c98a1 imap: Allow fetching [x.MIME] for message/rfc822 again.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
533 /* 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
534 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
535 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
536 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
537 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
538 with b) */
14872
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
539 case FETCH_FULL:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
540 case FETCH_MIME_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
541 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
542 case FETCH_HEADER:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
543 case FETCH_HEADER_FIELDS:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
544 case FETCH_HEADER_FIELDS_NOT:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
545 case FETCH_BODY:
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
546 /* fetching message/rfc822 part's header/body */
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
547 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
548 *part_r = NULL;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
549 return 0;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
550 }
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
551 i_assert(part->children != NULL &&
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
552 part->children->next == NULL);
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
553 part = part->children;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
554 break;
9f20f7bd992d imap: More fixes to fetching messages.
Timo Sirainen <tss@iki.fi>
parents: 14868
diff changeset
555 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
556 *part_r = part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
557 return 1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
558 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
559
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
560 static int
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
561 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
562 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
563 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
564 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
565 {
17198
95ae49692ccb lib-imap-storage: Don't waste effort getting mail's physical size if it can't be done quickly.
Timo Sirainen <tss@iki.fi>
parents: 17197
diff changeset
566 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
567 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
568 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
569
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
570 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
571 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
572 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
573
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
574 if (*msgpart->section_number != '\0') {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
575 /* find the MIME part */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
576 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
577 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
578
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
579 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
580 hdr_size = part->header_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
581 body_size = part->body_size;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
582 } else switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
583 case FETCH_FULL:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
584 /* fetch the whole message */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
585 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
586 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
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_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
589
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
590 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
591 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
592 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
593 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
594 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
595 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
596 case FETCH_MIME:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
597 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
598 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
599 case FETCH_HEADER:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
600 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
601 /* fetch the message's header */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
602 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
603 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
604 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
605 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
606 case FETCH_HEADER_FIELDS:
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
607 /* 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
608 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
609 msgpart->header_ctx =
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
610 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
611 msgpart->headers);
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
612 }
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
613 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
614 &input) < 0)
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
615 return -1;
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
616 result_r->size_field = 0;
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
617 break;
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
618 case FETCH_BODY:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
619 /* fetch the message's body */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
620 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
621 return -1;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
622 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
623 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
624 }
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
625
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
626 if (msgpart->headers != NULL) {
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
627 /* return specific headers */
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
628 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
629 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
630 have_crlfs_r, result_r);
17197
cba3890dafdb lib-imap-storage: Reverted previous change.
Timo Sirainen <tss@iki.fi>
parents: 17196
diff changeset
631 }
14591
07e6ca397a72 Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
632
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
633 switch (msgpart->fetch_type) {
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
634 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
635 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
636 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
637 /* fall through */
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
638 case FETCH_MIME:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
639 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
640 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
641 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
642 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
643 case FETCH_HEADER_FIELDS:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
644 case FETCH_HEADER_FIELDS_NOT:
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
645 i_unreached();
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
646 case FETCH_BODY:
14853
5ceeb25ed337 imap: FETCH BODY[n] shouldn't include MIME headers
Timo Sirainen <tss@iki.fi>
parents: 14708
diff changeset
647 case FETCH_MIME_BODY:
14622
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
648 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
649 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
650 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
651 break;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
652 }
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
653
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
654 result_r->input = input;
6fb61872b30a lib-imap-storage: imap-msgpart rewrite and API change.
Timo Sirainen <tss@iki.fi>
parents: 14594
diff changeset
655 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
656 *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
657 *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
658 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
659 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
660 }
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
661
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
662 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
663 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
664 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
665 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
666 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
667 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
668 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
669
14864
ec5346eb7d60 imap: Fixed FETCHing nonexistent parts.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
670 memset(result_r, 0, sizeof(*result_r));
ec5346eb7d60 imap: Fixed FETCHing nonexistent parts.
Timo Sirainen <tss@iki.fi>
parents: 14860
diff changeset
671
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
672 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
673 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
674 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
675 /* 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
676 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
677 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
678 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
679
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
680 if (msgpart->decode_cte_to_binary &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
681 (msgpart->fetch_type == FETCH_FULL ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
682 msgpart->fetch_type == FETCH_BODY ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
683 msgpart->fetch_type == FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
684 /* binary fetch */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
685 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
686 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
687 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
688 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
689 }
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
690 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
691 &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
692 &result_r->input) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
693 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
694 have_crlfs = TRUE;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
695 use_partial_cache = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
696 } 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
697 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
698 &have_crlfs, result_r) < 0)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
699 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
700 binary = FALSE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
701 use_partial_cache = TRUE;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
702 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
703
14860
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
704 if (binary && msgpart->decode_cte_to_binary)
f0feae227c60 imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents: 14859
diff changeset
705 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
706
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
707 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
708 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
709 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
710 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
711
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
712 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
713 uoff_t *size_r)
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
714 {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
715 struct imap_msgpart_open_result result;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
716 struct message_part *part;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
717 bool include_hdr;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
718 unsigned int lines;
14859
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
719 int ret;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
720
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
721 if (!msgpart->decode_cte_to_binary ||
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
722 (msgpart->fetch_type != FETCH_FULL &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
723 msgpart->fetch_type != FETCH_BODY &&
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
724 msgpart->fetch_type != FETCH_MIME_BODY)) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
725 /* generic implementation */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
726 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
727 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
728 i_stream_unref(&result.input);
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
729 *size_r = result.size;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
730 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
731 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
732
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
733 /* binary-optimized implementation: */
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
734 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
735 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
736 if (ret == 0) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
737 /* 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
738 *size_r = 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
739 return 0;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
740 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
741 if (part == NULL) {
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
742 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
743 return -1;
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
744 }
f3ef88e19cd5 IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents: 14853
diff changeset
745 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
746 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
747 }
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
748
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
749 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
750 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
751 struct message_part *all_parts)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
752 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
753 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
754 const char *bodystructure, *error;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
755
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
756 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
757 &bodystructure) < 0)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
758 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
759 if (all_parts->context != NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
760 /* we just parsed the bodystructure */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
761 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
762 }
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 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
765 all_parts, &error) < 0) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
766 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
767 "Invalid message_part/BODYSTRUCTURE %s: %s",
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
768 bodystructure, error);
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
769 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
770 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
771 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
772 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
773 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
774 }
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 static int
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
777 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
778 struct message_part **binpart_r)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
779 {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
780 struct message_part **pos;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
781 uoff_t size;
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
782 unsigned int lines;
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
783
15237
3484591230ac imap: URLFETCH BINARY BODYPARTSTRUCTURE returns binary-decoded line counts.
Timo Sirainen <tss@iki.fi>
parents: 15177
diff changeset
784 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
785 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
786
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
787 *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
788 **binpart_r = *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
789 (*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
790 (*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
791
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
792 pos = &(*binpart_r)->children;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
793 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
794 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
795 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
796 pos = &(*pos)->next;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
797 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
798 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
799 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
800
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
801 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
802 struct imap_msgpart *msgpart,
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
803 const char **bpstruct_r)
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 struct message_part *all_parts, *part;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
806 string_t *bpstruct;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
807 int ret;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
808
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
809 /* 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
810 BODYSTRUCTURE */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
811 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
812
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
813 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
814 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
815 if (ret == 0) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
816 /* MIME part not found. */
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
817 *bpstruct_r = NULL;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
818 return 0;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
819 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
820
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
821 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
822 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
823 if (all_parts->context == NULL) {
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
824 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
825 return -1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
826 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
827 if (part == NULL)
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
828 part = all_parts;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
829
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
830 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
831 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
832
15065
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
833 if (ret >= 0) {
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
834 bpstruct = t_str_new(256);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
835 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
836 *bpstruct_r = str_c(bpstruct);
1b4ab06fa0e2 lib-imap-storage: imap_msgpart_bodypartstructure() returned freed data.
Timo Sirainen <tss@iki.fi>
parents: 15058
diff changeset
837 }
15058
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
838 return ret < 0 ? -1 : 1;
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
839 }
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
840
a69c48fa4f32 lib-imap-storage: Added support for getting BODYPARTSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 14924
diff changeset
841
14888
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
842 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
843 {
cf79ab812651 imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents: 14872
diff changeset
844 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
845 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
846 }