Mercurial > dovecot > core-2.2
annotate src/imap/imap-fetch-body.c @ 14591:07e6ca397a72
Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
This is done to prevent introducing dependencies on lib-storage in
lib-imap. It contains IMAP message part access functionality, including
URL-based access.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Sat, 02 Jun 2012 17:56:27 +0300 |
parents | d8a88e53f1e6 |
children | df8ba29d9eb3 |
rev | line source |
---|---|
14133
ba770cba5598
Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents:
14074
diff
changeset
|
1 /* Copyright (c) 2002-2012 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" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "message-send.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
|
12 #include "mail-storage-private.h" |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
13 #include "imap-parser.h" |
14591
07e6ca397a72
Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
14228
diff
changeset
|
14 #include "imap-msgpart.h" |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "imap-fetch.h" |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include <stdlib.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <ctype.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <unistd.h> |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct imap_fetch_body_data { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct imap_fetch_body_data *next; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct mailbox_header_lookup_ctx *header_ctx; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 const char *section; /* NOTE: always uppercased */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 uoff_t skip, max_size; /* if you don't want max_size, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 set it to (uoff_t)-1 */ |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
28 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
29 const char *const *fields; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
30 size_t fields_count; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
31 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 unsigned int skip_set:1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 unsigned int peek:1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 }; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
36 static void fetch_read_error(struct imap_fetch_context *ctx) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 { |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
38 errno = ctx->cur_input->stream_errno; |
11428
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
39 mail_storage_set_critical(ctx->box->storage, |
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
40 "read(%s) failed: %m (FETCH for mailbox %s UID %u)", |
e5b491043b5e
If read() from a mail stream fails, log the stream name (filename typically).
Timo Sirainen <tss@iki.fi>
parents:
11241
diff
changeset
|
41 i_stream_get_name(ctx->cur_input), |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
42 mailbox_get_vname(ctx->cur_mail->box), ctx->cur_mail->uid); |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
43 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
45 static int seek_partial(unsigned int select_counter, unsigned int uid, |
13563
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
46 struct partial_fetch_cache *partial, |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
47 struct istream *stream, |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
48 uoff_t virtual_skip, bool *cr_skipped_r) |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
49 { |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 if (select_counter == partial->select_counter && uid == partial->uid && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 stream->v_offset == partial->physical_start && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 virtual_skip >= partial->pos.virtual_size) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 /* we can use the cache */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 virtual_skip -= partial->pos.virtual_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } else { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 partial->select_counter = select_counter; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 partial->uid = uid; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 partial->physical_start = stream->v_offset; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 partial->cr_skipped = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 memset(&partial->pos, 0, sizeof(partial->pos)); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 i_stream_seek(stream, partial->physical_start + |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 partial->pos.physical_size); |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
65 if (message_skip_virtual(stream, virtual_skip, &partial->pos, |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
66 partial->cr_skipped, cr_skipped_r) < 0) |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
67 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
|
68 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 partial->cr_skipped = FALSE; |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
70 return 0; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 static uoff_t get_send_size(const struct imap_fetch_body_data *body, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 uoff_t max_size) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 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
|
77 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 if (body->skip >= max_size) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 return 0; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 size = max_size - body->skip; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 return size <= body->max_size ? size : body->max_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
85 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
|
86 { |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
87 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
|
88 |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
89 str = t_str_new(128); |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
90 str_printfa(str, "BODY[%s]", body->section); |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
91 if (body->skip_set) |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
92 str_printfa(str, "<%"PRIuUOFF_T">", body->skip); |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
93 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
|
94 } |
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
95 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 static string_t *get_prefix(struct imap_fetch_context *ctx, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 const struct imap_fetch_body_data *body, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 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
|
99 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 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
|
101 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 str = t_str_new(128); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (ctx->first) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 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
|
107 |
4973
ec41129cd0ef
When client fetches message data that has already been expunged, reply with
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
108 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
|
109 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 if (size != (uoff_t)-1) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 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
|
112 else |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 str_append(str, " NIL"); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 return str; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
5079
e3e8f01b4899
If we disconnect the client because message ended unexpectedly, log an
Timo Sirainen <tss@iki.fi>
parents:
4973
diff
changeset
|
117 static off_t imap_fetch_send(struct imap_fetch_context *ctx, |
e3e8f01b4899
If we disconnect the client because message ended unexpectedly, log an
Timo Sirainen <tss@iki.fi>
parents:
4973
diff
changeset
|
118 struct ostream *output, struct istream *input, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
119 bool cr_skipped, uoff_t virtual_size, |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
120 bool add_missing_eoh, bool *last_cr) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 const unsigned char *msg; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 size_t i, size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 uoff_t vsize_left, sent; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 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
|
126 unsigned char add; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
127 bool blocks = FALSE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 /* go through the message data and insert CRs where needed. */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 sent = 0; vsize_left = virtual_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 while (vsize_left > 0 && !blocks && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 i_stream_read_data(input, &msg, &size, 0) > 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 add = '\0'; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 for (i = 0; i < size && vsize_left > 0; i++) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 vsize_left--; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 if (msg[i] == '\n') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if ((i > 0 && msg[i-1] != '\r') || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 (i == 0 && !cr_skipped)) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 /* missing CR */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 add = '\r'; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 break; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 } else if (msg[i] == '\0') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 add = 128; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 break; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 if ((ret = o_stream_send(output, msg, i)) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 return -1; |
2646
64e22d5c2829
signed vs. unsigned warning fix
Timo Sirainen <tss@iki.fi>
parents:
2638
diff
changeset
|
152 if ((uoff_t)ret < i) { |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 add = '\0'; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 blocks = TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
2485 | 156 |
157 if (ret > 0) | |
158 cr_skipped = msg[ret-1] == '\r'; | |
159 | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 i_stream_skip(input, ret); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 sent += ret; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 if (add != '\0') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 if ((ret = o_stream_send(output, &add, 1)) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 if (ret == 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 blocks = TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 else { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 sent++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 cr_skipped = add == '\r'; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 if (add == 128) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 i_stream_skip(input, 1); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 } |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
176 if (input->stream_errno != 0) { |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
177 fetch_read_error(ctx); |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
178 return -1; |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
179 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 |
2448 | 181 if (add_missing_eoh && sent + 2 == virtual_size) { |
182 /* Netscape missing EOH workaround. */ | |
183 o_stream_set_max_buffer_size(output, (size_t)-1); | |
184 if (o_stream_send(output, "\r\n", 2) < 0) | |
185 return -1; | |
186 sent += 2; | |
187 } | |
188 | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 if ((uoff_t)sent != virtual_size && !blocks) { |
3336
a3a72d5bdfce
o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents:
3299
diff
changeset
|
190 /* Input stream gave less data than we expected. Two choices |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 here: either we fill the missing data with spaces or we |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 disconnect the client. |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 We shouldn't really ever get here. One reason is if mail |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 was deleted from NFS server while we were reading it. |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 Another is some temporary disk error. |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 If we filled the missing data the client could cache it, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 and if it was just a temporary error the message would be |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 permanently left corrupted in client's local cache. So, we |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 disconnect the client and hope that next try works. */ |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
202 i_error("FETCH %s for mailbox %s UID %u got too little data: " |
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
203 "%"PRIuUOFF_T" vs %"PRIuUOFF_T, ctx->cur_name, |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
204 mailbox_get_vname(ctx->cur_mail->box), |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
205 ctx->cur_mail->uid, (uoff_t)sent, virtual_size); |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
206 mail_set_cache_corrupted(ctx->cur_mail, ctx->cur_size_field); |
9327
a9ffb4614b5e
If FETCH gets too little message data, use "FETCH failed" disconnection reason.
Timo Sirainen <tss@iki.fi>
parents:
9219
diff
changeset
|
207 client_disconnect(ctx->client, "FETCH failed"); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 *last_cr = cr_skipped; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 return sent; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 static int fetch_stream_send(struct imap_fetch_context *ctx) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 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
|
218 |
2638
f7bad0650b25
Allow buffering of output stream when sending message body, to avoid tons of
Timo Sirainen <tss@iki.fi>
parents:
2635
diff
changeset
|
219 o_stream_set_max_buffer_size(ctx->client->output, 4096); |
5079
e3e8f01b4899
If we disconnect the client because message ended unexpectedly, log an
Timo Sirainen <tss@iki.fi>
parents:
4973
diff
changeset
|
220 ret = imap_fetch_send(ctx, ctx->client->output, ctx->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
|
221 ctx->skip_cr, ctx->cur_size - ctx->cur_offset, |
2448 | 222 ctx->cur_append_eoh, &ctx->skip_cr); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 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
|
224 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 if (ret < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 ctx->cur_offset += ret; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 if (ctx->update_partial) { |
13563
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
230 struct partial_fetch_cache *p = &ctx->client->last_partial; |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
231 |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
232 p->cr_skipped = ctx->skip_cr != 0; |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
233 p->pos.physical_size = |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
234 ctx->cur_input->v_offset - p->physical_start; |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
235 p->pos.virtual_size += ret; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 return ctx->cur_offset == ctx->cur_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 static int fetch_stream_send_direct(struct imap_fetch_context *ctx) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 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
|
244 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 o_stream_set_max_buffer_size(ctx->client->output, 0); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 ret = o_stream_send_istream(ctx->client->output, ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 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
|
248 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 if (ret < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 ctx->cur_offset += ret; |
2448 | 253 |
254 if (ctx->cur_append_eoh && ctx->cur_offset + 2 == ctx->cur_size) { | |
255 /* Netscape missing EOH workaround. */ | |
256 if (o_stream_send(ctx->client->output, "\r\n", 2) < 0) | |
257 return -1; | |
258 ctx->cur_offset += 2; | |
259 ctx->cur_append_eoh = FALSE; | |
260 } | |
261 | |
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
|
262 if (ctx->cur_offset != ctx->cur_size) { |
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
|
263 /* unfinished */ |
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
|
264 if (!i_stream_have_bytes_left(ctx->cur_input)) { |
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
|
265 /* Input stream gave less data than expected */ |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
266 i_error("FETCH %s for mailbox %s UID %u " |
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
267 "got too little data (copying): " |
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
|
268 "%"PRIuUOFF_T" vs %"PRIuUOFF_T, |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
269 ctx->cur_name, mailbox_get_vname(ctx->cur_mail->box), |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
270 ctx->cur_mail->uid, ctx->cur_offset, ctx->cur_size); |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
271 mail_set_cache_corrupted(ctx->cur_mail, |
11241
be74fa9bfcc9
imap: If FETCH notices cached message size is wrong, mark cache corrupted (second such check).
Timo Sirainen <tss@iki.fi>
parents:
11063
diff
changeset
|
272 ctx->cur_size_field); |
9327
a9ffb4614b5e
If FETCH gets too little message data, use "FETCH failed" disconnection reason.
Timo Sirainen <tss@iki.fi>
parents:
9219
diff
changeset
|
273 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
|
274 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
|
275 } |
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
|
276 |
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
|
277 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
|
278 return 0; |
2635
e69519ea4682
Make sure we disconnect if mail input is finished unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
2557
diff
changeset
|
279 } |
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
|
280 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
|
281 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 static int fetch_stream(struct imap_fetch_context *ctx, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 const struct message_size *size) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 struct istream *input; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 if (size->physical_size == size->virtual_size && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 ctx->cur_mail->has_no_nuls) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 /* no need to kludge with CRs, we can use sendfile() */ |
7031
4b51ee73ed51
Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents:
7022
diff
changeset
|
291 input = i_stream_create_limit(ctx->cur_input, ctx->cur_size); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
292 i_stream_unref(&ctx->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
|
293 ctx->cur_input = input; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 ctx->cont_handler = fetch_stream_send_direct; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 } else { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 ctx->cont_handler = fetch_stream_send; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 return ctx->cont_handler(ctx); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 static int fetch_data(struct imap_fetch_context *ctx, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 const struct imap_fetch_body_data *body, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 const struct message_size *size) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 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
|
308 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
309 ctx->cur_name = p_strconcat(ctx->pool, |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
310 "[", body->section, "]", NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 ctx->cur_size = get_send_size(body, size->virtual_size); |
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 str = get_prefix(ctx, body, ctx->cur_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 if (o_stream_send(ctx->client->output, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 str_data(str), str_len(str)) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 if (!ctx->update_partial) { |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
319 if (message_skip_virtual(ctx->cur_input, body->skip, NULL, |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
320 FALSE, &ctx->skip_cr) < 0) { |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
321 fetch_read_error(ctx); |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
322 return -1; |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
323 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 } else { |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
325 if (seek_partial(ctx->select_counter, ctx->cur_mail->uid, |
13563
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
326 &ctx->client->last_partial, ctx->cur_input, |
690f60827f59
imap: Moved partial fetch cache from static variable into struct client.
Timo Sirainen <tss@iki.fi>
parents:
13150
diff
changeset
|
327 body->skip, &ctx->skip_cr) < 0) { |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
328 fetch_read_error(ctx); |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
329 return -1; |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
330 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 return fetch_stream(ctx, size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 static int fetch_body(struct imap_fetch_context *ctx, struct mail *mail, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
337 const 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
|
338 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 const struct message_size *fetch_size; |
7022
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
340 struct istream *input; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 struct message_size hdr_size, body_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
343 switch (body->section[0]) { |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
344 case '\0': |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
345 /* BODY[] - fetch everything */ |
7022
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
346 if (mail_get_stream(mail, NULL, NULL, &input) < 0 || |
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
347 mail_get_virtual_size(mail, &body_size.virtual_size) < 0 || |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
348 mail_get_physical_size(mail, &body_size.physical_size) < 0) |
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
349 return -1; |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
350 fetch_size = &body_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
351 ctx->cur_size_field = MAIL_FETCH_VIRTUAL_SIZE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 break; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 case 'H': |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 /* BODY[HEADER] - fetch only header */ |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
355 if (mail_get_hdr_stream(mail, &hdr_size, &input) < 0) |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
356 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
|
357 fetch_size = &hdr_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
358 ctx->cur_size_field = MAIL_FETCH_MESSAGE_PARTS; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 break; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 case 'T': |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 /* BODY[TEXT] - skip header */ |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
362 if (mail_get_stream(mail, &hdr_size, &body_size, &input) < 0) |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
363 return -1; |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
364 i_stream_skip(input, hdr_size.physical_size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 fetch_size = &body_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
366 ctx->cur_size_field = MAIL_FETCH_VIRTUAL_SIZE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 break; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 default: |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 i_unreached(); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
372 ctx->cur_input = input; |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
373 i_stream_ref(ctx->cur_input); |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
374 ctx->update_partial = TRUE; |
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
375 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 return fetch_data(ctx, body, fetch_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 static int fetch_header_partial_from(struct imap_fetch_context *ctx, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 const struct imap_fetch_body_data *body, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 const char *header_section) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 struct message_size msg_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 struct istream *input; |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
385 uoff_t old_offset; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 /* MIME, HEADER.FIELDS (list), HEADER.FIELDS.NOT (list) */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 if (strncmp(header_section, "HEADER.FIELDS ", 14) == 0) { |
2436
f8c4ad92092c
header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
390 input = i_stream_create_header_filter(ctx->cur_input, |
14074 | 391 HEADER_FILTER_INCLUDE, |
392 body->fields, body->fields_count, | |
393 null_header_filter_callback, NULL); | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 } else if (strncmp(header_section, "HEADER.FIELDS.NOT ", 18) == 0) { |
2436
f8c4ad92092c
header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
395 input = i_stream_create_header_filter(ctx->cur_input, |
14074 | 396 HEADER_FILTER_EXCLUDE, |
397 body->fields, body->fields_count, | |
398 null_header_filter_callback, NULL); | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 } else { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 i_error("BUG: Accepted invalid section from user: '%s'", |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 header_section); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
405 i_stream_unref(&ctx->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
|
406 ctx->cur_input = input; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
409 old_offset = ctx->cur_input->v_offset; |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
410 if (message_get_header_size(ctx->cur_input, &msg_size, NULL) < 0) { |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
411 fetch_read_error(ctx); |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
412 return -1; |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
413 } |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
414 i_stream_seek(ctx->cur_input, old_offset); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
416 ctx->cur_size_field = 0; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 return fetch_data(ctx, body, &msg_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
420 static int |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
421 fetch_body_header_partial(struct imap_fetch_context *ctx, struct mail *mail, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
422 const 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
|
423 { |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
424 if (mail_get_hdr_stream(mail, NULL, &ctx->cur_input) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 return fetch_header_partial_from(ctx, body, body->section); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
433 static int |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
434 fetch_body_header_fields(struct imap_fetch_context *ctx, struct mail *mail, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
435 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
|
436 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 struct message_size size; |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
438 uoff_t old_offset; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 |
4073 | 440 if (mail == NULL) { |
441 /* deinit */ | |
8011
2d902d1f8bea
struct mailbox_header_lookup_ctx can now be referenced/unreferenced so it
Timo Sirainen <tss@iki.fi>
parents:
7561
diff
changeset
|
442 mailbox_header_lookup_unref(&body->header_ctx); |
4073 | 443 return 0; |
444 } | |
445 | |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
446 if (mail_get_header_stream(mail, body->header_ctx, &ctx->cur_input) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
452 old_offset = ctx->cur_input->v_offset; |
8526
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
453 if (message_get_body_size(ctx->cur_input, &size, NULL) < 0) { |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
454 fetch_read_error(ctx); |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
455 return -1; |
c63cc3580150
Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
456 } |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
457 i_stream_seek(ctx->cur_input, old_offset); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 |
2448 | 459 /* FIXME: We'll just always add the end of headers line now. |
460 ideally mail-storage would have a way to tell us if it exists. */ | |
461 size.virtual_size += 2; | |
462 ctx->cur_append_eoh = TRUE; | |
463 | |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
464 ctx->cur_size_field = 0; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 return fetch_data(ctx, body, &size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 static int fetch_body_mime(struct imap_fetch_context *ctx, struct mail *mail, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4073
diff
changeset
|
469 const 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
|
470 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 const struct message_part *part; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 const char *section; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 |
14591
07e6ca397a72
Created lib-imap-storage for IMAP-specific functionality that uses lib-storage.
Stephan Bosch <stephan@rename-it.nl>
parents:
14228
diff
changeset
|
474 if (imap_msgpart_find(mail, body->section, &part, §ion) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 if (part == NULL) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 /* part doesn't exist */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 string_t *str = get_prefix(ctx, body, (uoff_t)-1); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 if (o_stream_send(ctx->client->output, |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 str_data(str), str_len(str)) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
486 if (mail_get_stream(mail, NULL, NULL, &ctx->cur_input) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
487 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 ctx->update_partial = TRUE; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
491 ctx->cur_size_field = MAIL_FETCH_MESSAGE_PARTS; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 |
3491
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
493 if (*section == '\0') { |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
494 /* fetch the whole section */ |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
495 i_stream_seek(ctx->cur_input, part->physical_pos + |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
496 part->header_size.physical_size); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
497 return fetch_data(ctx, body, &part->body_size); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
498 } |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
499 |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
500 if (strcmp(section, "MIME") == 0) { |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
501 /* fetch section's MIME header */ |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
502 i_stream_seek(ctx->cur_input, part->physical_pos); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
503 return fetch_data(ctx, body, &part->header_size); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
504 } |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
505 |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
506 /* TEXT and HEADER are only for message/rfc822 parts */ |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
507 if ((part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) == 0) { |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
508 string_t *str = get_prefix(ctx, body, 0); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
509 if (o_stream_send(ctx->client->output, |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
510 str_data(str), str_len(str)) < 0) |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
511 return -1; |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
512 return 1; |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
513 } |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
514 |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
515 i_assert(part->children != NULL && part->children->next == NULL); |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
516 part = part->children; |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
517 |
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
518 if (strcmp(section, "TEXT") == 0) { |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 i_stream_seek(ctx->cur_input, part->physical_pos + |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 part->header_size.physical_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 return fetch_data(ctx, body, &part->body_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 if (strcmp(section, "HEADER") == 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 /* all headers */ |
2991
ca4341dbde8a
MIME part header fetches weren't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
526 i_stream_seek(ctx->cur_input, part->physical_pos); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 return fetch_data(ctx, body, &part->header_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 |
3491
2dbd7232d7df
Several fixes to FETCHing MIME body parts. [n.MIME] was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
530 if (strncmp(section, "HEADER", 6) == 0) { |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 i_stream_seek(ctx->cur_input, part->physical_pos); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 return fetch_header_partial_from(ctx, body, section); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 i_error("BUG: Accepted invalid section from user: '%s'", body->section); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
539 static bool fetch_body_header_fields_check(const char *section) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 if (*section++ != '(') |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 |
3299
361ce931354e
Don't allow FETCH BODY[HEADER.FIELDS ()], ie. empty list.
Timo Sirainen <tss@iki.fi>
parents:
3259
diff
changeset
|
544 if (*section == ')') |
361ce931354e
Don't allow FETCH BODY[HEADER.FIELDS ()], ie. empty list.
Timo Sirainen <tss@iki.fi>
parents:
3259
diff
changeset
|
545 return FALSE; /* has to be at least one field */ |
361ce931354e
Don't allow FETCH BODY[HEADER.FIELDS ()], ie. empty list.
Timo Sirainen <tss@iki.fi>
parents:
3259
diff
changeset
|
546 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 while (*section != '\0' && *section != ')') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 if (*section == '(') |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 section++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 if (*section++ != ')') |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 if (*section != '\0') |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
561 static bool fetch_body_header_fields_init(struct imap_fetch_init_context *ctx, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
562 struct imap_fetch_body_data *body, |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
563 const char *section) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
565 const char *const *arr; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 if (!fetch_body_header_fields_check(section)) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
570 if ((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
|
571 MAIL_FETCH_STREAM_BODY)) != 0) { |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 /* we'll need to open the file anyway, don't try to get the |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 headers from cache. */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
574 imap_fetch_add_handler(ctx, 0, "NIL", |
3216
8632ec8486c6
Send buffered fetch items to client first. Fixes kmail and Thunderbird
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
575 fetch_body_header_partial, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 } |
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 for (arr = body->fields; *arr != NULL; arr++) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
580 const char *hdr = p_strdup(ctx->fetch_ctx->pool, *arr); |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
581 array_append(&ctx->fetch_ctx->all_headers, &hdr, 1); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
584 body->header_ctx = mailbox_header_lookup_init(ctx->fetch_ctx->box, |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
585 body->fields); |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
586 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT, "NIL", |
4073 | 587 fetch_body_header_fields, body); |
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 TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
591 static bool |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
592 fetch_body_section_name_init(struct imap_fetch_init_context *ctx, |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
593 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
|
594 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
595 const char *section = body->section; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 if (*section == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
598 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
|
599 MAIL_FETCH_STREAM_BODY; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
600 imap_fetch_add_handler(ctx, 0, "NIL", fetch_body, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
601 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
602 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
603 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
604 if (strcmp(section, "TEXT") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
605 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
|
606 imap_fetch_add_handler(ctx, 0, "NIL", fetch_body, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
608 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
610 if (strncmp(section, "HEADER", 6) == 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
611 /* exact header matches could be cached */ |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 if (section[6] == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
613 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
|
614 imap_fetch_add_handler(ctx, 0, "NIL", fetch_body, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
616 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 if (strncmp(section, "HEADER.FIELDS ", 14) == 0 && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 fetch_body_header_fields_init(ctx, body, section+14)) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
620 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 if (strncmp(section, "HEADER.FIELDS.NOT ", 18) == 0 && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 fetch_body_header_fields_check(section+18)) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
624 imap_fetch_add_handler(ctx, 0, "NIL", |
3216
8632ec8486c6
Send buffered fetch items to client first. Fixes kmail and Thunderbird
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
625 fetch_body_header_partial, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 } else if (*section >= '0' && *section <= '9') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
629 ctx->fetch_ctx->fetch_data |= MAIL_FETCH_STREAM_BODY | |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
630 MAIL_FETCH_MESSAGE_PARTS; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 while ((*section >= '0' && *section <= '9') || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 *section == '.') section++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 if (*section == '\0' || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 strcmp(section, "MIME") == 0 || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 strcmp(section, "TEXT") == 0 || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 strcmp(section, "HEADER") == 0 || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
639 (strncmp(section, "HEADER.FIELDS ", 14) == 0 && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
640 fetch_body_header_fields_check(section+14)) || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 (strncmp(section, "HEADER.FIELDS.NOT ", 18) == 0 && |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
642 fetch_body_header_fields_check(section+18))) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
643 imap_fetch_add_handler(ctx, 0, "NIL", |
3216
8632ec8486c6
Send buffered fetch items to client first. Fixes kmail and Thunderbird
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
644 fetch_body_mime, body); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
645 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
646 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
649 ctx->error = "Invalid BODY[..] parameter: Unknown or broken section"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 /* Parse next digits in string into integer. Returns FALSE if the integer |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 becomes too big and wraps. */ |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3592
diff
changeset
|
655 static bool 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
|
656 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
657 uoff_t prev; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
659 *value = 0; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
660 while (**p >= '0' && **p <= '9') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 prev = *value; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
662 *value = *value * 10 + (**p - '0'); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
664 if (*value < prev) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
666 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 (*p)++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
669 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
671 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
672 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
673 static bool |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
674 body_section_build(struct imap_fetch_init_context *ctx, |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
675 struct imap_fetch_body_data *body, const char *prefix, |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
676 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
|
677 { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
678 string_t *str; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
679 const char **arr, *value; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
680 size_t i; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
681 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
682 str = str_new(ctx->fetch_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
|
683 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
|
684 str_append(str, " ("); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
685 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
686 /* @UNSAFE: NULL-terminated list of headers */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
687 arr = p_new(ctx->fetch_ctx->pool, const char *, args_count + 1); |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
688 |
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
|
689 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
|
690 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
|
691 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
692 "Header list contains non-strings"; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
693 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
694 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
695 |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
696 if (i != 0) |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
697 str_append_c(str, ' '); |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
698 arr[i] = p_strdup(ctx->fetch_ctx->pool, 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
|
699 |
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
|
700 if (args[i].type == IMAP_ARG_ATOM) |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
701 str_append(str, arr[i]); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
702 else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
703 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
|
704 str_append(str, str_escape(arr[i])); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
705 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
|
706 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
707 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
708 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
|
709 |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
710 qsort(arr, args_count, sizeof(*arr), i_strcasecmp_p); |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
711 body->fields = arr; |
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
|
712 body->fields_count = args_count; |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
713 body->section = str_c(str); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
714 return TRUE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
715 } |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
716 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
717 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
|
718 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
719 struct imap_fetch_body_data *body; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
720 const struct imap_arg *list_args; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
721 unsigned int list_count; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
722 const char *partial, *str, *p; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
724 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
|
725 p = ctx->name + 4; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
726 |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
727 body = p_new(ctx->fetch_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
|
728 body->max_size = (uoff_t)-1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
729 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
730 if (strncmp(p, ".PEEK", 5) == 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
731 body->peek = TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 p += 5; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
733 } else { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
734 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
|
735 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
736 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
737 if (*p != '[') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
738 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
|
739 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
741 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
742 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
|
743 /* BODY[HEADER.FIELDS.. (headers list)] */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
744 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
|
745 str[0] != ']') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
746 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
|
747 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
748 } |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
749 if (!body_section_build(ctx, body, p+1, 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
|
750 return FALSE; |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
751 p = str; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
752 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
|
753 } else { |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
754 /* no headers list */ |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
755 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
|
756 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
|
757 if (p == NULL) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
758 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
|
759 return FALSE; |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
760 } |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
761 body->section = p_strdup_until(ctx->fetch_ctx->pool, |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
762 body->section, p); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 if (*++p == '<') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 /* <start.end> */ |
2655 | 767 partial = p; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
768 p++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
769 body->skip_set = TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
770 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 if (!read_uoff_t(&p, &body->skip) || body->skip > OFF_T_MAX) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 /* wrapped */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
773 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
774 "Too big partial start"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
778 if (*p == '.') { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
779 p++; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
780 if (!read_uoff_t(&p, &body->max_size) || |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 body->max_size > OFF_T_MAX) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 /* wrapped */ |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
783 ctx->error = "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
784 "Too big partial end"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
785 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
787 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
788 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
789 if (*p != '>') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
790 ctx->error = t_strdup_printf( |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
791 "Invalid BODY[..] parameter: " |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
792 "Missing '>' in '%s'", partial); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
793 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
794 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
796 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
797 /* sanitize the name */ |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
798 ctx->name = 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
|
799 return fetch_body_section_name_init(ctx, body); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
800 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
801 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 static int fetch_rfc822_size(struct imap_fetch_context *ctx, struct mail *mail, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
803 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
|
804 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 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
|
806 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
807 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
|
808 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
809 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
810 str_printfa(ctx->cur_str, "RFC822.SIZE %"PRIuUOFF_T" ", size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
811 return 1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
812 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
813 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
814 static int fetch_rfc822(struct imap_fetch_context *ctx, struct mail *mail, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
815 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
|
816 { |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
817 struct message_size size; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
818 const char *str; |
7022
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
819 struct istream *input; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
820 |
7022
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
821 if (mail_get_stream(mail, NULL, NULL, &input) < 0 || |
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
822 mail_get_virtual_size(mail, &size.virtual_size) < 0 || |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
823 mail_get_physical_size(mail, &size.physical_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
|
824 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
825 |
7022
ebdd050c0a58
If mail_get_stream() succeeds but mail_get_*_size() fails, we didn't
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
826 ctx->cur_input = input; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 if (ctx->cur_offset == 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 str = t_strdup_printf(" RFC822 {%"PRIuUOFF_T"}\r\n", |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
832 size.virtual_size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 if (ctx->first) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 str++; ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
836 if (o_stream_send_str(ctx->client->output, str) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
837 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
838 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
840 ctx->cur_name = "RFC822"; |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
841 ctx->cur_size = size.virtual_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
842 ctx->cur_size_field = MAIL_FETCH_VIRTUAL_SIZE; |
6866
b223a34c64cb
Don't get message's header and body sizes separately if we really only need
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
843 return fetch_stream(ctx, &size); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
844 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
845 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
846 static int fetch_rfc822_header(struct imap_fetch_context *ctx, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
847 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
|
848 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
849 struct message_size hdr_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
850 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
|
851 |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13563
diff
changeset
|
852 if (mail_get_hdr_stream(mail, &hdr_size, &ctx->cur_input) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
853 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
854 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
855 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
856 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
857 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
858 str = t_strdup_printf(" RFC822.HEADER {%"PRIuUOFF_T"}\r\n", |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
859 hdr_size.virtual_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
860 if (ctx->first) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
861 str++; ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
862 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
863 if (o_stream_send_str(ctx->client->output, str) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
864 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
865 |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
866 ctx->cur_name = "RFC822.HEADER"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
867 ctx->cur_size = hdr_size.virtual_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
868 ctx->cur_size_field = MAIL_FETCH_MESSAGE_PARTS; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
869 return fetch_stream(ctx, &hdr_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
870 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
871 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
872 static int fetch_rfc822_text(struct imap_fetch_context *ctx, struct mail *mail, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
873 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
|
874 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
875 struct message_size hdr_size, body_size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
876 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
|
877 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
878 if (mail_get_stream(mail, &hdr_size, &body_size, &ctx->cur_input) < 0) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
879 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
880 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
881 i_stream_ref(ctx->cur_input); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
882 ctx->update_partial = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
883 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
884 str = t_strdup_printf(" RFC822.TEXT {%"PRIuUOFF_T"}\r\n", |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
885 body_size.virtual_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
886 if (ctx->first) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
887 str++; ctx->first = FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 if (o_stream_send_str(ctx->client->output, str) < 0) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
890 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
891 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
892 i_stream_seek(ctx->cur_input, hdr_size.physical_size); |
8812
69a5c4798421
imap: Improve "FETCH .. got too little data" error messages.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
893 ctx->cur_name = "RFC822.TEXT"; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
894 ctx->cur_size = body_size.virtual_size; |
7253
6f9786d83007
If stream ends unexpectedly, it was most likely because of a broken cached
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
895 ctx->cur_size_field = MAIL_FETCH_VIRTUAL_SIZE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
896 return fetch_stream(ctx, &body_size); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
897 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
898 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
899 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
|
900 { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
901 const char *name = ctx->name; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
902 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
903 if (name[6] == '\0') { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
904 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
|
905 MAIL_FETCH_STREAM_BODY; |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
906 ctx->fetch_ctx->flags_update_seen = TRUE; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
907 imap_fetch_add_handler(ctx, 0, "NIL", fetch_rfc822, NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
908 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
909 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
910 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
911 if (strcmp(name+6, ".SIZE") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
912 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
|
913 imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_BUFFERED, |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
914 "0", fetch_rfc822_size, NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
915 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
916 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
917 if (strcmp(name+6, ".HEADER") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
918 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
|
919 imap_fetch_add_handler(ctx, 0, "NIL", |
4073 | 920 fetch_rfc822_header, NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
921 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
922 } |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
2655
diff
changeset
|
923 if (strcmp(name+6, ".TEXT") == 0) { |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
924 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
|
925 ctx->fetch_ctx->flags_update_seen = TRUE; |
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
926 imap_fetch_add_handler(ctx, 0, "NIL", fetch_rfc822_text, NULL); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
927 return TRUE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
928 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
929 |
14228
d8a88e53f1e6
imap: Changed internal FETCH command handling API.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
930 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
|
931 return FALSE; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
932 } |