Mercurial > dovecot > core-2.2
annotate src/imap/imap-fetch-body.c @ 22713:cb108f786fb4
Updated copyright notices to include the year 2018.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 01 Jan 2018 22:42:08 +0100 |
parents | 2e2563132d5f |
children | 15f548f4d144 |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2002-2018 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 <ctype.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 <unistd.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 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
|
21 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
|
22 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
|
23 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
24 unsigned int partial:1; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
25 unsigned int binary:1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
26 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
|
27 }; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
17601
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
29 static void fetch_read_error(struct imap_fetch_context *ctx, |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
30 const char **disconnect_reason_r) |
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 |
17601
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
34 if (state->cur_input->stream_errno == ENOENT) { |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
35 if (state->cur_mail->expunged) { |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
36 *disconnect_reason_r = "Mail expunged while it was being FETCHed"; |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
37 return; |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
38 } |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
39 } |
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
|
40 mail_storage_set_critical(state->cur_mail->box->storage, |
16776
c140de1b506b
imap: If FETCH fails, log the stream's error string instead of errno.
Timo Sirainen <tss@iki.fi>
parents:
16759
diff
changeset
|
41 "read(%s) failed: %s (FETCH %s for mailbox %s UID %u)", |
16759
be26ae8a9fca
imap: Fixed/improved error logging for FETCH
Timo Sirainen <tss@iki.fi>
parents:
16065
diff
changeset
|
42 i_stream_get_name(state->cur_input), |
16776
c140de1b506b
imap: If FETCH fails, log the stream's error string instead of errno.
Timo Sirainen <tss@iki.fi>
parents:
16759
diff
changeset
|
43 i_stream_get_error(state->cur_input), |
15636
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
44 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
|
45 mailbox_get_vname(state->cur_mail->box), state->cur_mail->uid); |
17601
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
46 *disconnect_reason_r = "FETCH read() failed"; |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
47 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
49 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
|
50 { |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
51 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
|
52 |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
53 str = t_str_new(128); |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
54 if (body->binary_size) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
55 str_append(str, "BINARY.SIZE"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
56 else if (body->binary) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
57 str_append(str, "BINARY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
58 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
59 str_append(str, "BODY"); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
60 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
|
61 if (body->partial) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
62 str_printfa(str, "<%"PRIuUOFF_T">", |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
63 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
|
64 } |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
65 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
|
66 } |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
67 |
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 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
|
69 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
|
70 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
|
71 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 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
|
73 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 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
|
75 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
|
76 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
|
77 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 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
|
79 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
80 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
|
81 |
14860
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
82 if (size == (uoff_t)-1) |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
83 str_append(str, " NIL"); |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
84 else if (has_nuls && body->binary) |
f0feae227c60
imap: Send FETCH BINARY output using literal8.
Timo Sirainen <tss@iki.fi>
parents:
14859
diff
changeset
|
85 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
|
86 else |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 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
|
88 return str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
91 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
|
92 { |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
93 struct imap_fetch_state *state = &ctx->state; |
17601
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
94 const char *disconnect_reason; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 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
|
96 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 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
|
98 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
|
99 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
|
100 |
18706
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
101 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
|
102 state->cur_offset += ret; |
18706
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
103 if (ctx->state.cur_stats_sizep != NULL) |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
104 *ctx->state.cur_stats_sizep += ret; |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
105 } |
2448 | 106 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
107 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
|
108 /* unfinished */ |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
109 if (state->cur_input->stream_errno != 0) { |
17601
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
110 fetch_read_error(ctx, &disconnect_reason); |
d0d9f79a71eb
imap: If FETCH fails because mail has already been expunged, don't log an error.
Timo Sirainen <tss@iki.fi>
parents:
17557
diff
changeset
|
111 client_disconnect(ctx->client, disconnect_reason); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
112 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
113 } |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
114 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
|
115 /* Input stream gave less data than expected */ |
19886
63955a428a73
Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
116 mail_set_cache_corrupted_reason(state->cur_mail, |
63955a428a73
Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
117 state->cur_size_field, t_strdup_printf( |
63955a428a73
Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
118 "read(%s): FETCH %s 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
|
119 "%"PRIuUOFF_T" vs %"PRIuUOFF_T, |
16759
be26ae8a9fca
imap: Fixed/improved error logging for FETCH
Timo Sirainen <tss@iki.fi>
parents:
16065
diff
changeset
|
120 i_stream_get_name(state->cur_input), |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
121 state->cur_human_name, |
19886
63955a428a73
Use mail_set_cache_corrupted_reason() wherever possible.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
122 state->cur_offset, state->cur_size)); |
9327
a9ffb4614b5e
If FETCH gets too little message data, use "FETCH failed" disconnection reason.
Timo Sirainen <tss@iki.fi>
parents:
9219
diff
changeset
|
123 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
|
124 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
|
125 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
126 if (ret < 0) { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
127 /* client probably disconnected */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
128 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
129 } |
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
|
130 |
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
|
131 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
|
132 return 0; |
2635
e69519ea4682
Make sure we disconnect if mail input is finished unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
2557
diff
changeset
|
133 } |
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
|
134 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
|
135 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
15636
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
137 static const char * |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
138 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
|
139 { |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
140 string_t *str; |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
141 uoff_t partial_offset, partial_size; |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
142 |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
143 str = t_str_new(64); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
144 if (body->binary) |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
145 str_append(str, "BINARY["); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
146 else |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
147 str_append(str, "BODY["); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
148 str_append(str, body->section); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
149 str_append_c(str, ']'); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
150 |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
151 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
|
152 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
|
153 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
|
154 str_printfa(str, "<%"PRIuUOFF_T, partial_offset); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
155 if (partial_size != (uoff_t)-1) |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
156 str_printfa(str, ".%"PRIuUOFF_T, partial_size); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
157 str_append_c(str, '>'); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
158 } |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
159 return p_strdup(pool, str_c(str)); |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
160 } |
b56e7845a9e8
imap: Improved unexpected FETCH error messages.
Timo Sirainen <tss@iki.fi>
parents:
15451
diff
changeset
|
161 |
18706
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
162 static void fetch_state_update_stats(struct imap_fetch_context *ctx, |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
163 const struct imap_msgpart *msgpart) |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
164 { |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
165 if (!imap_msgpart_contains_body(msgpart)) { |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
166 ctx->client->fetch_hdr_count++; |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
167 ctx->state.cur_stats_sizep = &ctx->client->fetch_hdr_bytes; |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
168 } else { |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
169 ctx->client->fetch_body_count++; |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
170 ctx->state.cur_stats_sizep = &ctx->client->fetch_body_bytes; |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
171 } |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
172 } |
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
173 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
174 static int fetch_body_msgpart(struct imap_fetch_context *ctx, struct mail *mail, |
14892 | 175 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
|
176 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
177 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
|
178 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
|
179 |
14892 | 180 if (mail == NULL) { |
181 imap_msgpart_free(&body->msgpart); | |
182 return 1; | |
183 } | |
184 | |
17302
197f77f6ef0d
imap: If FETCH BINARY fails because of invalid MIME part data, return [UNKNOWN-CTE] error.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
185 if (imap_msgpart_open(mail, body->msgpart, &result) < 0) |
197f77f6ef0d
imap: If FETCH BINARY fails because of invalid MIME part data, return [UNKNOWN-CTE] error.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
186 return -1; |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 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
|
191 |
18706
93bba97afb2a
Added %{fetch_hdr/body_count/bytes} variables to imap_logout_format
Timo Sirainen <tss@iki.fi>
parents:
18513
diff
changeset
|
192 fetch_state_update_stats(ctx, body->msgpart); |
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
|
193 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
|
194 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
|
195 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
|
196 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
197 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
|
198 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
|
199 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
201 static int fetch_binary_size(struct imap_fetch_context *ctx, struct mail *mail, |
14892 | 202 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
|
203 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
204 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
|
205 uoff_t size; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
206 |
14892 | 207 if (mail == NULL) { |
208 imap_msgpart_free(&body->msgpart); | |
209 return 1; | |
210 } | |
211 | |
17302
197f77f6ef0d
imap: If FETCH BINARY fails because of invalid MIME part data, return [UNKNOWN-CTE] error.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
212 if (imap_msgpart_size(mail, body->msgpart, &size) < 0) |
197f77f6ef0d
imap: If FETCH BINARY fails because of invalid MIME part data, return [UNKNOWN-CTE] error.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
213 return -1; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
214 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
215 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
|
216 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
|
217 ctx->state.cur_first = FALSE; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
218 else |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
219 str_append_c(str, ' '); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
220 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
|
221 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
222 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
|
223 return -1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
224 return 1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
225 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
226 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
227 /* 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
|
228 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
|
229 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
|
230 { |
17557
9b9b6dc7dd9b
imap: harden read_uoff_t() against overflow
Phil Carmody <phil@dovecot.fi>
parents:
17412
diff
changeset
|
231 return str_parse_uoff(*p, value, p); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 } |
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 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
235 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
|
236 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
|
237 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
|
238 { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
239 string_t *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
240 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
|
241 size_t i; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
242 |
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
|
243 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
|
244 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
|
245 str_append(str, " ("); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
246 |
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
|
247 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
|
248 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
|
249 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
250 "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
|
251 return -1; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
252 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
253 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
|
254 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
255 if (i != 0) |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
256 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
|
257 |
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
|
258 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
|
259 str_append(str, value); |
15241
e8181fc25500
imap: Avoid double-quoting non-atom header field
Timo Sirainen <tss@iki.fi>
parents:
15175
diff
changeset
|
260 else |
15242
4137ea599dcd
lib-imap: Renamed imap_dquote_append() to imap_append_quoted()
Timo Sirainen <tss@iki.fi>
parents:
15241
diff
changeset
|
261 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
|
262 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
263 str_append_c(str, ')'); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
264 body->section = str_c(str); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
265 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
266 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
267 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
268 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
|
269 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
|
270 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
271 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
|
272 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
273 if (*p == '\0') |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
274 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
275 /* <start.end> */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
276 if (*p != '<') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
277 *error_r = "Unexpected data after ']'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
278 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
279 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
280 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
281 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
282 body->partial = TRUE; |
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 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
|
285 /* wrapped */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
286 *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
|
287 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
288 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
289 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
290 if (*p == '.') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
291 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
292 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
|
293 /* wrapped */ |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
294 *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
|
295 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
296 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
297 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
298 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
299 if (*p != '>') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
300 *error_r = "Missing '>' in partial"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
301 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
302 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
303 if (p[1] != '\0') { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
304 *error_r = "Unexpected data after '>'"; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
305 return -1; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
306 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
307 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
|
308 return 0; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
309 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
310 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
311 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
|
312 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 struct imap_fetch_body_data *body; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
314 const struct imap_arg *list_args; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
315 unsigned int list_count; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
316 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
|
317 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
318 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
|
319 p = ctx->name + 4; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
320 |
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
|
321 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
|
322 |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
323 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
|
324 p += 5; |
14624
3a8ada7302a3
imap: Removed unnecessary code.
Timo Sirainen <tss@iki.fi>
parents:
14623
diff
changeset
|
325 else |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
326 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
|
327 if (*p != '[') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
328 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
|
329 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
332 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
|
333 /* BODY[HEADER.FIELDS.. (headers list)] */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
334 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
|
335 str[0] != ']') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
336 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
|
337 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
338 } |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
339 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
|
340 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
|
341 return FALSE; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
342 p = str+1; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
343 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
|
344 } else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
345 /* no headers list */ |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
346 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
|
347 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
|
348 if (p == NULL) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
349 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
|
350 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
351 } |
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
|
352 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
|
353 p++; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
354 } |
14888
cf79ab812651
imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents:
14887
diff
changeset
|
355 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
|
356 ctx->error = "Invalid BODY[..] section"; |
16065
ab434891f2af
imap: Don't crash with invalid FETCH BODY[sections]
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
357 return FALSE; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
358 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
359 ctx->fetch_ctx->fetch_data |= |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
360 imap_msgpart_get_fetch_data(body->msgpart); |
18513
8c49fb6d789b
imap: FETCH BODY.PEEK[HEADER.FIELDS (..)] didn't set wanted_headers optimization.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
361 imap_msgpart_get_wanted_headers(body->msgpart, &ctx->fetch_ctx->all_headers); |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
362 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
363 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
|
364 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
|
365 "Invalid BODY[..] parameter: %s", error); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
366 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
|
367 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
369 /* 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
|
370 ctx->name = p_strdup(ctx->pool, get_body_name(body)); |
14892 | 371 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, |
372 "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
|
373 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
|
374 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
376 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
|
377 { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
378 struct imap_fetch_body_data *body; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
379 const struct imap_arg *list_args; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
380 unsigned int list_count; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
381 const char *str, *p, *error; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
382 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
383 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
|
384 p = ctx->name + 6; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
385 |
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
|
386 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
|
387 body->binary = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
388 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
389 if (strncmp(p, ".SIZE", 5) == 0) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
390 /* fetch decoded size of the section */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
391 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
392 body->binary_size = TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
393 } 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
|
394 p += 5; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
395 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
396 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
|
397 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
398 if (*p != '[') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
399 ctx->error = "Invalid BINARY[..] parameter: Missing '['"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
400 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
401 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
402 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
403 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
|
404 /* BINARY[HEADER.FIELDS.. (headers list)] */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
405 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
|
406 str[0] != ']') { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
407 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
408 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
409 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
410 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
|
411 list_args, list_count) < 0) |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
412 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
413 p = str+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
414 ctx->args += 2; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
415 } else { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
416 /* no headers list */ |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
417 body->section = p+1; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
418 p = strchr(body->section, ']'); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
419 if (p == NULL) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
420 ctx->error = "Invalid BINARY[..] parameter: Missing ']'"; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
421 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
422 } |
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
|
423 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
|
424 p++; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
425 } |
14888
cf79ab812651
imap_msgpart_parse() doesn't really need a mailbox parameter.
Timo Sirainen <tss@iki.fi>
parents:
14887
diff
changeset
|
426 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
|
427 ctx->error = "Invalid BINARY[..] section"; |
17412
3f4d224f2e6a
imap: exit imap_fetch_binary_init() identically on all failures
Phil Carmody <phil@dovecot.fi>
parents:
17302
diff
changeset
|
428 return FALSE; |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
429 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
430 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
|
431 ctx->fetch_ctx->fetch_data |= |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
432 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
|
433 |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
434 if (!body->binary_size) { |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
435 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
|
436 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
|
437 "Invalid BINARY[..] parameter: %s", error); |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
438 return FALSE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
439 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
440 } |
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 /* 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
|
443 ctx->name = p_strdup(ctx->pool, get_body_name(body)); |
14892 | 444 if (body->binary_size) { |
445 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
|
446 "0", fetch_binary_size, body); |
14892 | 447 } else { |
448 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, | |
449 "NIL", fetch_body_msgpart, body); | |
450 } | |
14859
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
451 return TRUE; |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
452 } |
f3ef88e19cd5
IMAP BINARY extension supports now FETCH BINARY command.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
453 |
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
|
454 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
|
455 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
|
456 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
|
457 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 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
|
459 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
460 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
|
461 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
463 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
|
464 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
467 static int |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
468 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
|
469 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
|
470 { |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
471 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
|
472 int ret; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
473 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
474 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
|
475 imap_msgpart_free(_msgpart); |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
476 if (ret < 0) |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
477 return -1; |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
478 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
|
479 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
|
480 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
|
481 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
|
482 return 0; |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
483 } |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
484 |
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
|
485 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
|
486 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
|
487 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
|
488 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
489 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
|
490 const char *str; |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
491 |
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
492 msgpart = imap_msgpart_full(); |
18713
1044c55fb4ef
imap: Fixed crash in FETCH RFC822* caused by earlier commit
Timo Sirainen <tss@iki.fi>
parents:
18706
diff
changeset
|
493 fetch_state_update_stats(ctx, msgpart); |
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
|
494 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
|
495 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
|
496 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
497 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
|
498 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
|
499 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
|
500 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
|
501 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
502 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
|
503 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
504 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
|
505 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
|
506 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 |
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
|
508 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
|
509 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
|
510 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
|
511 { |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
512 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
|
513 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
|
514 |
14623
df8ba29d9eb3
imap: Rewrote FETCH command to use imap-msgpart API.
Timo Sirainen <tss@iki.fi>
parents:
14591
diff
changeset
|
515 msgpart = imap_msgpart_header(); |
18713
1044c55fb4ef
imap: Fixed crash in FETCH RFC822* caused by earlier commit
Timo Sirainen <tss@iki.fi>
parents:
18706
diff
changeset
|
516 fetch_state_update_stats(ctx, msgpart); |
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(); |
18713
1044c55fb4ef
imap: Fixed crash in FETCH RFC822* caused by earlier commit
Timo Sirainen <tss@iki.fi>
parents:
18706
diff
changeset
|
539 fetch_state_update_stats(ctx, msgpart); |
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
|
540 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
|
541 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
|
542 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 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
|
544 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
|
545 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
|
546 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
|
547 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
548 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
|
549 |
14887
0c73a42c194e
imap: FETCH API cleanup: keep fetch state in a separate struct.
Timo Sirainen <tss@iki.fi>
parents:
14860
diff
changeset
|
550 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
|
551 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
|
552 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
554 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
|
555 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
556 const char *name = ctx->name; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
557 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
558 if (name[6] == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
559 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
|
560 MAIL_FETCH_STREAM_BODY; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
561 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
|
562 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
|
563 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
|
564 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
567 if (strcmp(name+6, ".SIZE") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
568 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
|
569 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
|
570 "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
|
571 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
573 if (strcmp(name+6, ".HEADER") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
574 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
|
575 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
|
576 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
|
577 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
579 if (strcmp(name+6, ".TEXT") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
580 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
|
581 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
|
582 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
|
583 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
|
584 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
587 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
|
588 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 } |