Mercurial > dovecot > core-2.2
annotate src/imap/imap-fetch-body.c @ 15715:36ef72481934
Oops :) Update copyrights to 2013 without breaking all .c files.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 02 Feb 2013 17:02:55 +0200 |
parents | 90710c6c3beb |
children | ab434891f2af |
rev | line source |
---|---|
15715
36ef72481934
Oops :) Update copyrights to 2013 without breaking all .c files.
Timo Sirainen <tss@iki.fi>
parents:
15714
diff
changeset
|
1 /* Copyright (c) 2002-2013 Dovecot authors, see the included COPYING file */ |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
9219
97cdfeb57129
Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
9015
diff
changeset
|
3 #include "imap-common.h" |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
6 #include "strescape.h" |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "istream.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ostream.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "istream-header-filter.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "message-parser.h" |
11428
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
11 #include "mail-storage-private.h" |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
12 #include "imap-quote.h" |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
13 #include "imap-parser.h" |
14591
07e6ca397a72
Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
14228
diff
changeset
|
14 #include "imap-msgpart.h" |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "imap-fetch.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include <stdlib.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <ctype.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <unistd.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct imap_fetch_body_data { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
22 const char *section; /* NOTE: always uppercased */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
23 struct imap_msgpart *msgpart; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
25 unsigned int partial:1; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
26 unsigned int binary:1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
27 unsigned int binary_size:1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 }; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
30 static void fetch_read_error(struct imap_fetch_context *ctx) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 { |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
32 struct imap_fetch_state *state = &ctx->state; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
33 |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
34 errno = state->cur_input->stream_errno; |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
35 mail_storage_set_critical(state->cur_mail->box->storage, |
15636
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
36 "read(%s) failed: %m (FETCH %s for mailbox %s UID %u)", |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
37 state->cur_human_name, |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
38 i_stream_get_name(state->cur_input), |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
39 mailbox_get_vname(state->cur_mail->box), state->cur_mail->uid); |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
40 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
42 static const char *get_body_name(const struct imap_fetch_body_data *body) |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
43 { |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
44 string_t *str; |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
45 |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
46 str = t_str_new(128); |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
47 if (body->binary_size) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
48 str_append(str, "BINARY.SIZE"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
49 else if (body->binary) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
50 str_append(str, "BINARY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
51 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
52 str_append(str, "BODY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
53 str_printfa(str, "[%s]", body->section); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
54 if (body->partial) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
55 str_printfa(str, "<%"PRIuUOFF_T">", |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
56 imap_msgpart_get_partial_offset(body->msgpart)); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
57 } |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
58 return str_c(str); |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
59 } |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
60 |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
61 static string_t *get_prefix(struct imap_fetch_state *state, |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 const struct imap_fetch_body_data *body, |
14860
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
63 uoff_t size, bool has_nuls) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 string_t *str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 str = t_str_new(128); |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
68 if (state->cur_first) |
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
69 state->cur_first = FALSE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 str_append_c(str, ' '); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
73 str_append(str, get_body_name(body)); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
14860
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
75 if (size == (uoff_t)-1) |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
76 str_append(str, " NIL"); |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
77 else if (has_nuls && body->binary) |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
78 str_printfa(str, " ~{%"PRIuUOFF_T"}\r\n", size); |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
79 else |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 str_printfa(str, " {%"PRIuUOFF_T"}\r\n", size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 return str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
84 static int fetch_stream_continue(struct imap_fetch_context *ctx) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 { |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
86 struct imap_fetch_state *state = &ctx->state; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 off_t ret; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 o_stream_set_max_buffer_size(ctx->client->output, 0); |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
90 ret = o_stream_send_istream(ctx->client->output, state->cur_input); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 o_stream_set_max_buffer_size(ctx->client->output, (size_t)-1); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
93 if (ret > 0) |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
94 state->cur_offset += ret; |
2448 | 95 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
96 if (state->cur_offset != state->cur_size) { |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
97 /* unfinished */ |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
98 if (state->cur_input->stream_errno != 0) { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
99 fetch_read_error(ctx); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
100 client_disconnect(ctx->client, "FETCH failed"); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
101 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
102 } |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
103 if (!i_stream_have_bytes_left(state->cur_input)) { |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
104 /* Input stream gave less data than expected */ |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
105 i_error("FETCH %s for mailbox %s UID %u " |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
106 "got too little data: " |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
107 "%"PRIuUOFF_T" vs %"PRIuUOFF_T, |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
108 state->cur_human_name, |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
109 mailbox_get_vname(state->cur_mail->box), |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
110 state->cur_mail->uid, |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
111 state->cur_offset, state->cur_size); |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
112 mail_set_cache_corrupted(state->cur_mail, |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
113 state->cur_size_field); |
9327
a9ffb4614b5e
If FETCH gets too little message data, use "FETCH failed" disconnection reason.
Timo Sirainen <tss@iki.fi>
parents:
9219
diff
changeset
|
114 client_disconnect(ctx->client, "FETCH failed"); |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
115 return -1; |
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
116 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
117 if (ret < 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
118 /* client probably disconnected */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
119 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
120 } |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
121 |
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
122 o_stream_set_flush_pending(ctx->client->output, TRUE); |
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
123 return 0; |
2635
e69519ea4682
Make sure we disconnect if mail input is finished unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
2557
diff
changeset
|
124 } |
5276
56535cb50a09
If mail was in CR+LF format in the disk and we used sendfile() call, but the
Timo Sirainen <tss@iki.fi>
parents:
5079
diff
changeset
|
125 return 1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
15636
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
128 static const char * |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
129 get_body_human_name(pool_t pool, struct imap_fetch_body_data *body) |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
130 { |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
131 string_t *str; |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
132 uoff_t partial_offset, partial_size; |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
133 |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
134 str = t_str_new(64); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
135 if (body->binary) |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
136 str_append(str, "BINARY["); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
137 else |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
138 str_append(str, "BODY["); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
139 str_append(str, body->section); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
140 str_append_c(str, ']'); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
141 |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
142 partial_offset = imap_msgpart_get_partial_offset(body->msgpart); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
143 partial_size = imap_msgpart_get_partial_size(body->msgpart); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
144 if (partial_offset != 0 || partial_size != (uoff_t)-1) { |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
145 str_printfa(str, "<%"PRIuUOFF_T, partial_offset); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
146 if (partial_size != (uoff_t)-1) |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
147 str_printfa(str, ".%"PRIuUOFF_T, partial_size); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
148 str_append_c(str, '>'); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
149 } |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
150 return p_strdup(pool, str_c(str)); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
151 } |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
152 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
153 static int fetch_body_msgpart(struct imap_fetch_context *ctx, struct mail *mail, |
14892 | 154 struct imap_fetch_body_data *body) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
156 struct imap_msgpart_open_result result; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
157 string_t *str; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 |
14892 | 159 if (mail == NULL) { |
160 imap_msgpart_free(&body->msgpart); | |
161 return 1; | |
162 } | |
163 | |
15451
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
164 if (imap_msgpart_open(mail, body->msgpart, &result) < 0) { |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
165 if (!body->binary || |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
166 mailbox_get_last_mail_error(mail->box) != MAIL_ERROR_INVALIDDATA) |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
167 return -1; |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
168 /* tried to do BINARY fetch for a MIME part with broken |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
169 content */ |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
170 str = get_prefix(&ctx->state, body, (uoff_t)-1, FALSE); |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
171 o_stream_nsend(ctx->client->output, str_data(str), str_len(str)); |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
172 return 1; |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
173 } |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
174 ctx->state.cur_input = result.input; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
175 ctx->state.cur_size = result.size; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
176 ctx->state.cur_size_field = result.size_field; |
15636
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
177 ctx->state.cur_human_name = get_body_human_name(ctx->ctx_pool, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
179 str = get_prefix(&ctx->state, body, ctx->state.cur_size, |
14860
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
180 result.binary_decoded_input_has_nuls); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
181 o_stream_nsend(ctx->client->output, str_data(str), str_len(str)); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
183 ctx->state.cont_handler = fetch_stream_continue; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
184 return ctx->state.cont_handler(ctx); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
187 static int fetch_binary_size(struct imap_fetch_context *ctx, struct mail *mail, |
14892 | 188 struct imap_fetch_body_data *body) |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
189 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
190 string_t *str; |
15070
8e29272c35fa
lib-imap-storage: imap_msgpart_size() should return size as uoff_t, not size_t
Timo Sirainen <tss@iki.fi>
parents:
14892
diff
changeset
|
191 uoff_t size; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
192 |
14892 | 193 if (mail == NULL) { |
194 imap_msgpart_free(&body->msgpart); | |
195 return 1; | |
196 } | |
197 | |
15451
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
198 if (imap_msgpart_size(mail, body->msgpart, &size) < 0) { |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
199 if (mailbox_get_last_mail_error(mail->box) != MAIL_ERROR_INVALIDDATA) |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
200 return -1; |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
201 /* tried to do BINARY.SIZE fetch for a MIME part with broken |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
202 content */ |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
203 size = 0; |
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
204 } |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
205 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
206 str = t_str_new(128); |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
207 if (ctx->state.cur_first) |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
208 ctx->state.cur_first = FALSE; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
209 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
210 str_append_c(str, ' '); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
211 str_printfa(str, "%s %"PRIuUOFF_T, get_body_name(body), size); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
212 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
213 if (o_stream_send(ctx->client->output, str_data(str), str_len(str)) < 0) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
214 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
215 return 1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
216 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
217 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
218 /* Parse next digits in string into integer. Returns -1 if the integer |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 becomes too big and wraps. */ |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
220 static int read_uoff_t(const char **p, uoff_t *value) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 uoff_t prev; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 *value = 0; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 while (**p >= '0' && **p <= '9') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 prev = *value; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 *value = *value * 10 + (**p - '0'); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 if (*value < prev) |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
230 return -1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 (*p)++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
234 return 0; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
237 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
238 body_header_fields_parse(struct imap_fetch_init_context *ctx, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
239 struct imap_fetch_body_data *body, const char *prefix, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
240 const struct imap_arg *args, unsigned int args_count) |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
241 { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
242 string_t *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
243 const char *value; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
244 size_t i; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
245 |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
246 str = str_new(ctx->pool, 128); |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
247 str_append(str, prefix); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
248 str_append(str, " ("); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
249 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
250 for (i = 0; i < args_count; i++) { |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
251 if (!imap_arg_get_astring(&args[i], &value)) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
252 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
253 "Header list contains non-strings"; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
254 return -1; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
255 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
256 value = t_str_ucase(value); |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
257 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
258 if (i != 0) |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
259 str_append_c(str, ' '); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
260 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
261 if (args[i].type == IMAP_ARG_ATOM) |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
262 str_append(str, value); |
15241
e8181fc25500
imap: Avoid double-quoting non-atom header field
Timo Sirainen <tss@iki.fi>
parents:
15175
diff
changeset
|
263 else |
15242
4137ea599dcd
lib-imap: Renamed imap_dquote_append() to imap_append_quoted()
Timo Sirainen <tss@iki.fi>
parents:
15241
diff
changeset
|
264 imap_append_quoted(str, value); |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
265 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
266 str_append_c(str, ')'); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
267 body->section = str_c(str); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
268 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
269 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
270 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
271 static int body_parse_partial(struct imap_fetch_body_data *body, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
272 const char *p, const char **error_r) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
273 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
274 uoff_t offset, size = (uoff_t)-1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
275 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
276 if (*p == '\0') |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
277 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
278 /* <start.end> */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
279 if (*p != '<') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
280 *error_r = "Unexpected data after ']'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
281 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
282 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
283 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
284 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
285 body->partial = TRUE; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
286 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
287 if (read_uoff_t(&p, &offset) < 0 || offset > OFF_T_MAX) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
288 /* wrapped */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
289 *error_r = "Too big partial start"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
290 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
291 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
292 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
293 if (*p == '.') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
294 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
295 if (read_uoff_t(&p, &size) < 0 || size > OFF_T_MAX) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
296 /* wrapped */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
297 *error_r = "Too big partial end"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
298 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
299 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
300 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
301 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
302 if (*p != '>') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
303 *error_r = "Missing '>' in partial"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
304 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
305 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
306 if (p[1] != '\0') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
307 *error_r = "Unexpected data after '>'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
308 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
309 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
310 imap_msgpart_set_partial(body->msgpart, offset, size); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
311 return 0; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
312 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
313 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
314 bool imap_fetch_body_section_init(struct imap_fetch_init_context *ctx) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 struct imap_fetch_body_data *body; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
317 const struct imap_arg *list_args; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
318 unsigned int list_count; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
319 const char *str, *p, *error; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
321 i_assert(strncmp(ctx->name, "BODY", 4) == 0); |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
322 p = ctx->name + 4; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
323 |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
324 body = p_new(ctx->pool, struct imap_fetch_body_data, 1); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
326 if (strncmp(p, ".PEEK", 5) == 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 p += 5; |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
328 else |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
329 ctx->fetch_ctx->flags_update_seen = TRUE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 if (*p != '[') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
331 ctx->error = "Invalid BODY[..] parameter: Missing '['"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
335 if (imap_arg_get_list_full(&ctx->args[0], &list_args, &list_count)) { |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
336 /* BODY[HEADER.FIELDS.. (headers list)] */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
337 if (!imap_arg_get_atom(&ctx->args[1], &str) || |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
338 str[0] != ']') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
339 ctx->error = "Invalid BODY[..] parameter: Missing ']'"; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
340 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
341 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
342 if (body_header_fields_parse(ctx, body, p+1, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
343 list_args, list_count) < 0) |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
344 return FALSE; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
345 p = str+1; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
346 ctx->args += 2; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
347 } else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
348 /* no headers list */ |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
349 body->section = p+1; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
350 p = strchr(body->section, ']'); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
351 if (p == NULL) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
352 ctx->error = "Invalid BODY[..] parameter: Missing ']'"; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
353 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
354 } |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
355 body->section = p_strdup_until(ctx->pool, body->section, p); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
356 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
357 } |
14888
cf79ab812651
imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents:
14887
diff
changeset
|
358 if (imap_msgpart_parse(body->section, &body->msgpart) < 0) { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
359 ctx->error = "Invalid BODY[..] section"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
360 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
361 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
362 ctx->fetch_ctx->fetch_data |= |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
363 imap_msgpart_get_fetch_data(body->msgpart); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
364 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
365 if (body_parse_partial(body, p, &error) < 0) { |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
366 ctx->error = p_strdup_printf(ctx->pool, |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
367 "Invalid BODY[..] parameter: %s", error); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
368 return FALSE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
371 /* update the section name for the imap_fetch_add_handler() */ |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
372 ctx->name = p_strdup(ctx->pool, get_body_name(body)); |
14892 | 373 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, |
374 "NIL", fetch_body_msgpart, body); | |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
375 return TRUE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
378 bool imap_fetch_binary_init(struct imap_fetch_init_context *ctx) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
379 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
380 struct imap_fetch_body_data *body; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
381 const struct imap_arg *list_args; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
382 unsigned int list_count; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
383 const char *str, *p, *error; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
384 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
385 i_assert(strncmp(ctx->name, "BINARY", 6) == 0); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
386 p = ctx->name + 6; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
387 |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
388 body = p_new(ctx->pool, struct imap_fetch_body_data, 1); |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
389 body->binary = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
390 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
391 if (strncmp(p, ".SIZE", 5) == 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
392 /* fetch decoded size of the section */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
393 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
394 body->binary_size = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
395 } else if (strncmp(p, ".PEEK", 5) == 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
396 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
397 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
398 ctx->fetch_ctx->flags_update_seen = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
399 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
400 if (*p != '[') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
401 ctx->error = "Invalid BINARY[..] parameter: Missing '['"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
402 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
403 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
404 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
405 if (imap_arg_get_list_full(&ctx->args[0], &list_args, &list_count)) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
406 /* BINARY[HEADER.FIELDS.. (headers list)] */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
407 if (!imap_arg_get_atom(&ctx->args[1], &str) || |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
408 str[0] != ']') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
409 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
410 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
411 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
412 if (body_header_fields_parse(ctx, body, p+1, |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
413 list_args, list_count) < 0) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
414 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
415 p = str+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
416 ctx->args += 2; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
417 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
418 /* no headers list */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
419 body->section = p+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
420 p = strchr(body->section, ']'); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
421 if (p == NULL) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
422 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
423 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
424 } |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
425 body->section = p_strdup_until(ctx->pool, body->section, p); |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
426 p++; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
427 } |
14888
cf79ab812651
imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents:
14887
diff
changeset
|
428 if (imap_msgpart_parse(body->section, &body->msgpart) < 0) { |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
429 ctx->error = "Invalid BINARY[..] section"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
430 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
431 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
432 imap_msgpart_set_decode_to_binary(body->msgpart); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
433 ctx->fetch_ctx->fetch_data |= |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
434 imap_msgpart_get_fetch_data(body->msgpart); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
435 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
436 if (!body->binary_size) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
437 if (body_parse_partial(body, p, &error) < 0) { |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
438 ctx->error = p_strdup_printf(ctx->pool, |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
439 "Invalid BINARY[..] parameter: %s", error); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
440 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
441 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
442 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
443 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
444 /* update the section name for the imap_fetch_add_handler() */ |
14889
00be97a2139a
imap: FETCH API updated to allow using the same parsed FETCH in multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
14888
diff
changeset
|
445 ctx->name = p_strdup(ctx->pool, get_body_name(body)); |
14892 | 446 if (body->binary_size) { |
447 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, | |
15451
9c1791d1834f
imap: Fixed handling FETCH BINARY for broken content.
Timo Sirainen <tss@iki.fi>
parents:
15242
diff
changeset
|
448 "0", fetch_binary_size, body); |
14892 | 449 } else { |
450 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, | |
451 "NIL", fetch_body_msgpart, body); | |
452 } | |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
453 return TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
454 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
455 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
456 static int ATTR_NULL(3) |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
457 fetch_rfc822_size(struct imap_fetch_context *ctx, struct mail *mail, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
458 void *context ATTR_UNUSED) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 uoff_t size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
462 if (mail_get_virtual_size(mail, &size) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
465 str_printfa(ctx->state.cur_str, "RFC822.SIZE %"PRIuUOFF_T" ", size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
469 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
470 fetch_and_free_msgpart(struct imap_fetch_context *ctx, |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
471 struct mail *mail, struct imap_msgpart **_msgpart) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
472 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
473 struct imap_msgpart_open_result result; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
474 int ret; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
475 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
476 ret = imap_msgpart_open(mail, *_msgpart, &result); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
477 imap_msgpart_free(_msgpart); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
478 if (ret < 0) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
479 return -1; |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
480 ctx->state.cur_input = result.input; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
481 ctx->state.cur_size = result.size; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
482 ctx->state.cur_size_field = result.size_field; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
483 ctx->state.cont_handler = fetch_stream_continue; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
484 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
485 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
486 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
487 static int ATTR_NULL(3) |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
488 fetch_rfc822(struct imap_fetch_context *ctx, struct mail *mail, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
489 void *context ATTR_UNUSED) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
491 struct imap_msgpart *msgpart; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 const char *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
493 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
494 msgpart = imap_msgpart_full(); |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
495 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0) |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
496 return -1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
498 str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n", |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
499 ctx->state.cur_size); |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
500 if (ctx->state.cur_first) { |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
501 str++; ctx->state.cur_first = FALSE; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
502 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
503 o_stream_nsend_str(ctx->client->output, str); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
505 ctx->state.cur_human_name = "RFC822"; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
506 return ctx->state.cont_handler(ctx); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
509 static int ATTR_NULL(3) |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
510 fetch_rfc822_header(struct imap_fetch_context *ctx, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
511 struct mail *mail, void *context ATTR_UNUSED) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
513 struct imap_msgpart *msgpart; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 const char *str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
516 msgpart = imap_msgpart_header(); |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
517 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0) |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
518 return -1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n", |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
521 ctx->state.cur_size); |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
522 if (ctx->state.cur_first) { |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
523 str++; ctx->state.cur_first = FALSE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
525 o_stream_nsend_str(ctx->client->output, str); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
527 ctx->state.cur_human_name = "RFC822.HEADER"; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
528 return ctx->state.cont_handler(ctx); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
531 static int ATTR_NULL(3) |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
532 fetch_rfc822_text(struct imap_fetch_context *ctx, struct mail *mail, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14624
diff
changeset
|
533 void *context ATTR_UNUSED) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
535 struct imap_msgpart *msgpart; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 const char *str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
538 msgpart = imap_msgpart_body(); |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
539 if (fetch_and_free_msgpart(ctx, mail, &msgpart) < 0) |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
540 return -1; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n", |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
543 ctx->state.cur_size); |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
544 if (ctx->state.cur_first) { |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
545 str++; ctx->state.cur_first = FALSE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
546 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
547 o_stream_nsend_str(ctx->client->output, str); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
549 ctx->state.cur_human_name = "RFC822.TEXT"; |
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
550 return ctx->state.cont_handler(ctx); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
553 bool imap_fetch_rfc822_init(struct imap_fetch_init_context *ctx) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
555 const char *name = ctx->name; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
556 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
557 if (name[6] == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
558 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_HEADER | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 MAIL_FETCH_STREAM_BODY; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
560 ctx->fetch_ctx->flags_update_seen = TRUE; |
15079
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
561 imap_fetch_add_handler(ctx, 0, "NIL", |
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
562 fetch_rfc822, (void *)NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
566 if (strcmp(name+6, ".SIZE") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
567 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_VIRTUAL_SIZE; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
568 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_BUFFERED, |
15079
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
569 "0", fetch_rfc822_size, (void *)NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
572 if (strcmp(name+6, ".HEADER") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
573 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_HEADER; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
574 imap_fetch_add_handler(ctx, 0, "NIL", |
15079
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
575 fetch_rfc822_header, (void *)NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
578 if (strcmp(name+6, ".TEXT") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
579 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_BODY; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
580 ctx->fetch_ctx->flags_update_seen = TRUE; |
15079
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
581 imap_fetch_add_handler(ctx, 0, "NIL", |
925d4a890a9b
Fixed compiling with OSes where NULL isn't defined as void pointer (e.g. Solaris).
Timo Sirainen <tss@iki.fi>
parents:
15070
diff
changeset
|
582 fetch_rfc822_text, (void *)NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
586 ctx->error = t_strconcat("Unknown parameter ", name, NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 } |