annotate src/lib-mail/istream-header-filter.c @ 23017:c1d36f2575c7 default tip

lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author Timo Sirainen <timo.sirainen@open-xchange.com>
date Thu, 29 Aug 2019 09:55:25 +0300
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22225
diff changeset
1 /* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
4 #include "array.h"
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "message-parser.h"
13529
cf77e448295c Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
6 #include "istream-private.h"
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream-header-filter.h"
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 struct header_filter_istream {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
11 struct istream_private istream;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
12 pool_t pool;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
14 struct message_header_parser_ctx *hdr_ctx;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
16 const char **headers;
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
17 unsigned int headers_count;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
18
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
19 header_filter_callback *callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
20 void *context;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
21
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
22 buffer_t *hdr_buf;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 struct message_size header_size;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
24 uoff_t skip_count;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
25 uoff_t last_lf_offset;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
26
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
27 unsigned int cur_line, parsed_lines;
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14869
diff changeset
28 ARRAY(unsigned int) match_change_lines;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
29
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
30 unsigned int header_read:1;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
31 unsigned int seen_eoh:1;
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
32 unsigned int header_parsed:1;
18488
aa8786771490 lib-mail: Fixed modifying headers with i_stream_header_filter_add()
Timo Sirainen <tss@iki.fi>
parents: 18343
diff changeset
33 unsigned int headers_edited:1;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
34 unsigned int exclude:1;
2436
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
35 unsigned int crlf:1;
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
36 unsigned int crlf_preserve:1;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
37 unsigned int hide_body:1;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
38 unsigned int add_missing_eoh:1;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
39 unsigned int end_body_with_lf:1;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
40 unsigned int last_lf_added:1;
20134
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
41 unsigned int last_orig_crlf:1;
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
42 unsigned int last_added_newline:1;
19710
25ea1b5c514b lib-mail: Reading from istream-header-filter second time reverted callback's eoh change.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
43 unsigned int eoh_not_matched:1;
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
44 unsigned int callbacks_called:1;
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
45 unsigned int prev_matched:1;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 };
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
48 header_filter_callback *null_header_filter_callback = NULL;
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
49
11959
f7b5732820dd istream-header-filter: Another assert crashfix.
Timo Sirainen <tss@iki.fi>
parents: 11957
diff changeset
50 static ssize_t i_stream_header_filter_read(struct istream_private *stream);
f7b5732820dd istream-header-filter: Another assert crashfix.
Timo Sirainen <tss@iki.fi>
parents: 11957
diff changeset
51
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
52 static void i_stream_header_filter_destroy(struct iostream_private *stream)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
57 if (mstream->hdr_ctx != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
58 message_parse_header_deinit(&mstream->hdr_ctx);
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
59 i_stream_unref(&mstream->istream.parent);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
60 if (array_is_created(&mstream->match_change_lines))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
61 array_free(&mstream->match_change_lines);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
62 pool_unref(&mstream->pool);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
65 static ssize_t
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
66 read_mixed(struct header_filter_istream *mstream, size_t body_highwater_size)
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
67 {
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
68 const unsigned char *data;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
69 size_t pos;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
70 ssize_t ret;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
71
6571
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
72 if (mstream->hide_body) {
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
73 mstream->istream.istream.eof = TRUE;
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
74 return -1;
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
75 }
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
76
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
77 data = i_stream_get_data(mstream->istream.parent, &pos);
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
78 if (pos <= body_highwater_size) {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
79 i_assert(pos == body_highwater_size ||
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
80 (mstream->end_body_with_lf &&
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
81 pos+1 == body_highwater_size));
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
82
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
83 ret = i_stream_read(mstream->istream.parent);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
84 mstream->istream.istream.stream_errno =
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
85 mstream->istream.parent->stream_errno;
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
86 mstream->istream.istream.eof = mstream->istream.parent->eof;
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
87
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
88 if (ret <= 0) {
11957
dd3e70c85d43 istream-header-filter: Fixed assert
Timo Sirainen <tss@iki.fi>
parents: 11908
diff changeset
89 data = mstream->hdr_buf->data;
dd3e70c85d43 istream-header-filter: Fixed assert
Timo Sirainen <tss@iki.fi>
parents: 11908
diff changeset
90 pos = mstream->hdr_buf->used;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
91 i_assert(pos > 0);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
92
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
93 if (mstream->end_body_with_lf && data[pos-1] != '\n' &&
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
94 ret == -1 && mstream->istream.istream.eof) {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
95 /* add missing trailing LF to body */
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
96 if (mstream->crlf)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
97 buffer_append_c(mstream->hdr_buf, '\r');
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
98 buffer_append_c(mstream->hdr_buf, '\n');
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
99 mstream->istream.buffer =
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
100 buffer_get_data(mstream->hdr_buf,
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
101 &mstream->istream.pos);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
102 return mstream->hdr_buf->used - pos;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
103 }
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
104 return ret;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
105 }
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
106
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
107 data = i_stream_get_data(mstream->istream.parent, &pos);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
108 }
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
109 buffer_append(mstream->hdr_buf, data + body_highwater_size,
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
110 pos - body_highwater_size);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
111
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
112 mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
113 ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
114 i_assert(ret > 0);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
115 mstream->istream.pos = pos;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
116 return ret;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
117 }
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
118
9609
d404d34097f2 Use array_bsearch*().
Timo Sirainen <tss@iki.fi>
parents: 9540
diff changeset
119 static int cmp_uint(const unsigned int *i1, const unsigned int *i2)
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
120 {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
121 return *i1 < *i2 ? -1 :
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
122 (*i1 > *i2 ? 1 : 0);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
123 }
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
124
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
125 static bool match_line_changed(struct header_filter_istream *mstream)
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
126 {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
127 if (!array_is_created(&mstream->match_change_lines))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
128 return FALSE;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
129
9609
d404d34097f2 Use array_bsearch*().
Timo Sirainen <tss@iki.fi>
parents: 9540
diff changeset
130 return array_bsearch(&mstream->match_change_lines, &mstream->cur_line,
d404d34097f2 Use array_bsearch*().
Timo Sirainen <tss@iki.fi>
parents: 9540
diff changeset
131 cmp_uint) != NULL;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
132 }
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
133
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
134 static void add_eol(struct header_filter_istream *mstream, bool orig_crlf)
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
135 {
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
136 if (mstream->crlf || (orig_crlf && mstream->crlf_preserve))
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
137 buffer_append(mstream->hdr_buf, "\r\n", 2);
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
138 else
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
139 buffer_append_c(mstream->hdr_buf, '\n');
20134
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
140 mstream->last_orig_crlf = orig_crlf;
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
141 mstream->last_added_newline = TRUE;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
142 }
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
143
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
144 static ssize_t hdr_stream_update_pos(struct header_filter_istream *mstream)
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
145 {
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
146 ssize_t ret;
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
147 size_t pos;
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
148
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
149 mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
150 ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
151 i_assert(ret >= 0);
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
152 mstream->istream.pos = pos;
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
153 return ret;
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
154 }
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
155
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
156 static ssize_t read_header(struct header_filter_istream *mstream)
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
157 {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
158 struct message_header_line *hdr;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
159 uoff_t highwater_offset;
20245
57078d325d01 global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20190
diff changeset
160 size_t max_buffer_size;
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
161 ssize_t ret, ret2;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3799
diff changeset
162 int hdr_ret;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
163
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
164 if (mstream->hdr_ctx == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
165 mstream->hdr_ctx =
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
166 message_parse_header_init(mstream->istream.parent,
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
167 NULL, 0);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
168 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
169
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
170 /* remove skipped data from hdr_buf */
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
171 buffer_copy(mstream->hdr_buf, 0,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
172 mstream->hdr_buf, mstream->istream.skip, (size_t)-1);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
173
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
174 mstream->istream.pos -= mstream->istream.skip;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
175 mstream->istream.skip = 0;
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
176 buffer_set_used_size(mstream->hdr_buf, mstream->istream.pos);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
177
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
178 if (mstream->header_read) {
12293
794f09e5571d Removed some dead code.
Timo Sirainen <tss@iki.fi>
parents: 12286
diff changeset
179 i_assert(mstream->istream.skip == 0);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
180 highwater_offset = mstream->istream.istream.v_offset +
12293
794f09e5571d Removed some dead code.
Timo Sirainen <tss@iki.fi>
parents: 12286
diff changeset
181 mstream->istream.pos;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
182 if (highwater_offset >= mstream->header_size.virtual_size) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
183 /* we want to return mixed headers and body */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
184 size_t body_highwater_size = highwater_offset -
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
185 mstream->header_size.virtual_size;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
186 return read_mixed(mstream, body_highwater_size);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
187 }
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
188 }
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
189
20245
57078d325d01 global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20190
diff changeset
190 max_buffer_size = i_stream_get_max_buffer_size(&mstream->istream.istream);
57078d325d01 global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20190
diff changeset
191 if (mstream->hdr_buf->used >= max_buffer_size)
20076
36ee3868968c lib-mail: istream-header-filter didn't limit memory usage.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19710
diff changeset
192 return -2;
36ee3868968c lib-mail: istream-header-filter didn't limit memory usage.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19710
diff changeset
193
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
194 while ((hdr_ret = message_parse_header_next(mstream->hdr_ctx,
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
195 &hdr)) > 0) {
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
196 bool matched;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
197
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
198 if (!hdr->continued)
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
199 mstream->cur_line++;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
200 if (hdr->eoh) {
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
201 mstream->seen_eoh = TRUE;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
202 matched = TRUE;
20136
7a8fb7312069 lib-mail: istream-header-filter - fixed adding headers at eoh
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20135
diff changeset
203 if (mstream->header_parsed && !mstream->headers_edited) {
19710
25ea1b5c514b lib-mail: Reading from istream-header-filter second time reverted callback's eoh change.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
204 if (mstream->eoh_not_matched)
25ea1b5c514b lib-mail: Reading from istream-header-filter second time reverted callback's eoh change.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
205 matched = !matched;
25ea1b5c514b lib-mail: Reading from istream-header-filter second time reverted callback's eoh change.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
206 } else if (mstream->callback != NULL) {
14852
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
207 mstream->callback(mstream, hdr, &matched,
2443
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
208 mstream->context);
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
209 mstream->callbacks_called = TRUE;
2443
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
210 }
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
211
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
212 if (!matched) {
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
213 mstream->seen_eoh = FALSE;
19710
25ea1b5c514b lib-mail: Reading from istream-header-filter second time reverted callback's eoh change.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
214 mstream->eoh_not_matched = TRUE;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
215 continue;
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
216 }
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
217
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
218 add_eol(mstream, hdr->crlf_newline);
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
219 continue;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
220 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
221
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
222 if (hdr->continued) {
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
223 /* Header line continued - use only the first line's
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
224 matched-result. Otherwise multiline headers might
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
225 end up being only partially picked, which wouldn't
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
226 be very good. However, allow callbacks to modify
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
227 the headers in any way they want. */
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
228 matched = mstream->prev_matched;
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
229 } else if (mstream->headers_count == 0) {
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
230 /* no include/exclude headers - default matching */
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
231 matched = FALSE;
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
232 } else {
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
233 matched = i_bsearch(hdr->name, mstream->headers,
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
234 mstream->headers_count,
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
235 sizeof(*mstream->headers),
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
236 bsearch_strcasecmp) != NULL;
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
237 }
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
238 if (mstream->callback == NULL) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
239 /* nothing gets excluded */
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
240 } else if (!mstream->header_parsed || mstream->headers_edited) {
18488
aa8786771490 lib-mail: Fixed modifying headers with i_stream_header_filter_add()
Timo Sirainen <tss@iki.fi>
parents: 18343
diff changeset
241 /* first time in this line or we have actually modified
aa8786771490 lib-mail: Fixed modifying headers with i_stream_header_filter_add()
Timo Sirainen <tss@iki.fi>
parents: 18343
diff changeset
242 the header so we always want to call the callbacks */
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
243 bool orig_matched = matched;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
244
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
245 mstream->parsed_lines = mstream->cur_line;
14852
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
246 mstream->callback(mstream, hdr, &matched,
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
247 mstream->context);
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
248 mstream->callbacks_called = TRUE;
18488
aa8786771490 lib-mail: Fixed modifying headers with i_stream_header_filter_add()
Timo Sirainen <tss@iki.fi>
parents: 18343
diff changeset
249 if (matched != orig_matched &&
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
250 !hdr->continued && !mstream->headers_edited) {
19369
1146e005bd75 lib-mail: Fixed istream-header-filter when callback excluded multiple headers.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
251 if (!array_is_created(&mstream->match_change_lines))
1146e005bd75 lib-mail: Fixed istream-header-filter when callback excluded multiple headers.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
252 i_array_init(&mstream->match_change_lines, 8);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
253 array_append(&mstream->match_change_lines,
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
254 &mstream->cur_line, 1);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
255 }
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
256 } else if (!hdr->continued) {
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
257 /* second time in this line. was it excluded by the
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
258 callback the first time? */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
259 if (match_line_changed(mstream))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
260 matched = !matched;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
261 }
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
262 mstream->prev_matched = matched;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
263
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
264 if (matched == mstream->exclude) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
265 /* ignore */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
266 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
267 if (!hdr->continued) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
268 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
269 hdr->name, hdr->name_len);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
270 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
271 hdr->middle, hdr->middle_len);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
272 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
273 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
274 hdr->value, hdr->value_len);
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
275 if (!hdr->no_newline)
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
276 add_eol(mstream, hdr->crlf_newline);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
277
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
278 if (mstream->skip_count >= mstream->hdr_buf->used) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
279 /* we need more */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
280 mstream->skip_count -= mstream->hdr_buf->used;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
281 buffer_set_used_size(mstream->hdr_buf, 0);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
282 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
283 if (mstream->skip_count > 0) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
284 mstream->istream.skip =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
285 mstream->skip_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
286 mstream->skip_count = 0;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
287 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
288 break;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
289 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
290 }
20245
57078d325d01 global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20190
diff changeset
291 if (mstream->hdr_buf->used >= max_buffer_size)
20076
36ee3868968c lib-mail: istream-header-filter didn't limit memory usage.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19710
diff changeset
292 break;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
293 }
20134
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
294 if (mstream->hdr_buf->used > 0) {
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
295 const unsigned char *data = mstream->hdr_buf->data;
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
296 mstream->last_added_newline =
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
297 data[mstream->hdr_buf->used-1] == '\n';
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
298 }
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
299
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
300 if (hdr_ret < 0) {
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
301 if (mstream->istream.parent->stream_errno != 0) {
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
302 mstream->istream.istream.stream_errno =
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
303 mstream->istream.parent->stream_errno;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
304 mstream->istream.istream.eof =
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
305 mstream->istream.parent->eof;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
306 return -1;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
307 }
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
308 if (!mstream->seen_eoh && mstream->add_missing_eoh) {
21610
50c907a9d31b lib-mail: Fix matched-parameter in HEADER_FILTER_ADD_MISSING_EOH callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21556
diff changeset
309 bool matched = TRUE;
21361
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
310
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
311 mstream->seen_eoh = TRUE;
21361
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
312
20134
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
313 if (!mstream->last_added_newline)
861866abb960 lib-mail: istream-header-filter HEADER_FILTER_ADD_MISSING_EOH fixes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20133
diff changeset
314 add_eol(mstream, mstream->last_orig_crlf);
21361
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
315
21556
bf07e3be3f6a lib-mail: Fix duplicate HEADER_FILTER_ADD_MISSING_EOH callback call
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
316 if (mstream->header_parsed && !mstream->headers_edited) {
bf07e3be3f6a lib-mail: Fix duplicate HEADER_FILTER_ADD_MISSING_EOH callback call
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
317 if (mstream->eoh_not_matched)
bf07e3be3f6a lib-mail: Fix duplicate HEADER_FILTER_ADD_MISSING_EOH callback call
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
318 matched = !matched;
bf07e3be3f6a lib-mail: Fix duplicate HEADER_FILTER_ADD_MISSING_EOH callback call
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
319 } else if (mstream->callback != NULL) {
21361
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
320 struct message_header_line fake_eoh_hdr = {
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
321 .eoh = TRUE,
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
322 .name = "",
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
323 };
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
324 mstream->callback(mstream, &fake_eoh_hdr,
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
325 &matched, mstream->context);
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
326 mstream->callbacks_called = TRUE;
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
327 }
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
328
21610
50c907a9d31b lib-mail: Fix matched-parameter in HEADER_FILTER_ADD_MISSING_EOH callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21556
diff changeset
329 if (!matched) {
21361
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
330 mstream->seen_eoh = FALSE;
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
331 } else {
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
332 add_eol(mstream, mstream->last_orig_crlf);
8902229240d5 lib-mail: header filter should call callback for added EOH
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 20245
diff changeset
333 }
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
334 }
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
335 }
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
336
3440
2280ed0a9812 EOF change fix. Should finally properly fix APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
337 /* don't copy eof here because we're only returning headers here.
2280ed0a9812 EOF change fix. Should finally properly fix APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
338 the body will be returned in separate read() call. */
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
339 ret = hdr_stream_update_pos(mstream);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
340
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
341 if (hdr_ret == 0) {
8201
979ce2cb7517 header filter istream: Fixed previosly added assert.
Timo Sirainen <tss@iki.fi>
parents: 8196
diff changeset
342 /* need more data to finish parsing headers. we may have some
979ce2cb7517 header filter istream: Fixed previosly added assert.
Timo Sirainen <tss@iki.fi>
parents: 8196
diff changeset
343 data already available though. */
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
344 return ret;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
345 }
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
346
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
347 if (hdr == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
348 /* finished */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
349 message_parse_header_deinit(&mstream->hdr_ctx);
2437
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
350 mstream->hdr_ctx = NULL;
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
351
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
352 if ((!mstream->header_parsed || mstream->headers_edited ||
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
353 mstream->callbacks_called) &&
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
354 mstream->callback != NULL) {
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
355 bool matched = FALSE;
14852
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
356 mstream->callback(mstream, NULL,
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
357 &matched, mstream->context);
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
358 /* check if the callback added more headers.
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
359 this is allowed only if EOH wasn't added yet. */
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
360 ret2 = hdr_stream_update_pos(mstream);
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
361 if (!mstream->seen_eoh)
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
362 ret += ret2;
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
363 else {
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
364 i_assert(ret2 == 0);
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
365 }
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
366 }
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
367 mstream->header_parsed = TRUE;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
368 mstream->header_read = TRUE;
20190
a5b494e2a3ef lib-mail: Fixed istream-header-filter calling callback(hdr=NULL)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20187
diff changeset
369 mstream->callbacks_called = FALSE;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
370
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
371 mstream->header_size.physical_size =
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
372 mstream->istream.parent->v_offset;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
373 mstream->header_size.virtual_size =
14869
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
374 mstream->istream.istream.v_offset +
f329d7e1dad7 istream-header-filter: Allow adding more headers at the end of headers callback.
Timo Sirainen <tss@iki.fi>
parents: 14852
diff changeset
375 mstream->istream.pos;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
376 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
377
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
378 if (ret == 0) {
5660
6533e11eda80 If there's no message body, the final read() should return -1, not -2
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
379 /* we're at the end of headers. */
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
380 i_assert(hdr == NULL);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
381 i_assert(mstream->istream.istream.v_offset +
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
382 mstream->istream.pos ==
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
383 mstream->header_size.virtual_size);
5660
6533e11eda80 If there's no message body, the final read() should return -1, not -2
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
384
11959
f7b5732820dd istream-header-filter: Another assert crashfix.
Timo Sirainen <tss@iki.fi>
parents: 11957
diff changeset
385 return i_stream_header_filter_read(&mstream->istream);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
386 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
387
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
388 return ret;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
389 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
390
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
391 static ssize_t
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
392 handle_end_body_with_lf(struct header_filter_istream *mstream, ssize_t ret)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
393 {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
394 struct istream_private *stream = &mstream->istream;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
395 const unsigned char *data;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
396 size_t size, last_offset;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
397 bool last_lf;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
398
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
399 data = i_stream_get_data(stream->parent, &size);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
400 last_offset = stream->parent->v_offset + size-1;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
401
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
402 if (mstream->last_lf_offset == last_offset)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
403 last_lf = TRUE;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
404 else if (size > 0)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
405 last_lf = data[size-1] == '\n';
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
406 else
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
407 last_lf = FALSE;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
408
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
409 if (ret == -1 && stream->parent->eof && !last_lf) {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
410 /* missing LF, need to add it */
12728
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
411 i_assert(!mstream->last_lf_added);
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
412 i_assert(size == 0 || data[size-1] != '\n');
12728
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
413
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
414 buffer_reset(mstream->hdr_buf);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
415 buffer_append(mstream->hdr_buf, data, size);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
416 if (mstream->crlf)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
417 buffer_append_c(mstream->hdr_buf, '\r');
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
418 buffer_append_c(mstream->hdr_buf, '\n');
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
419 mstream->last_lf_offset = last_offset;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
420 mstream->last_lf_added = TRUE;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
421
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
422 stream->skip = 0;
12728
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
423 stream->pos = mstream->hdr_buf->used;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
424 stream->buffer = mstream->hdr_buf->data;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
425 return mstream->crlf ? 2 : 1;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
426 } else {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
427 mstream->last_lf_offset = last_lf ? last_offset : (uoff_t)-1;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
428 }
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
429 return ret;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
430 }
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
431
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
432 static ssize_t i_stream_header_filter_read(struct istream_private *stream)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 (struct header_filter_istream *)stream;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
436 uoff_t v_offset;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 ssize_t ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
439 if (mstream->last_lf_added) {
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
440 stream->istream.eof = TRUE;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
441 return -1;
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
442 }
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
443
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
444 if (!mstream->header_read ||
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
445 stream->istream.v_offset < mstream->header_size.virtual_size) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
446 ret = read_header(mstream);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
447 if (ret != -2 || stream->pos != stream->skip)
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
448 return ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
451 if (mstream->hide_body) {
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
452 stream->istream.eof = TRUE;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
453 return -1;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
454 }
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
455
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
456 v_offset = stream->parent_start_offset + stream->istream.v_offset -
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
457 mstream->header_size.virtual_size +
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
458 mstream->header_size.physical_size;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
459 i_stream_seek(stream->parent, v_offset);
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
460 ret = i_stream_read_copy_from_parent(&stream->istream);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
461 if (mstream->end_body_with_lf)
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
462 ret = handle_end_body_with_lf(mstream, ret);
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
463 return ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
466 static void
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
467 i_stream_header_filter_seek_to_header(struct header_filter_istream *mstream,
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
468 uoff_t v_offset)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
469 {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
470 i_stream_seek(mstream->istream.parent,
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
471 mstream->istream.parent_start_offset);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
472 mstream->istream.parent_expected_offset =
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
473 mstream->istream.parent_start_offset;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
474 mstream->istream.access_counter =
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
475 mstream->istream.parent->real_stream->access_counter;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
476
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
477 if (mstream->hdr_ctx != NULL)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
478 message_parse_header_deinit(&mstream->hdr_ctx);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
479 mstream->skip_count = v_offset;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
480 mstream->cur_line = 0;
20078
776abe15fd59 lib-mail: More fixes to istream-header-filter with large input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20076
diff changeset
481 mstream->prev_matched = FALSE;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
482 mstream->header_read = FALSE;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
483 mstream->seen_eoh = FALSE;
22225
e3ebc1be3d49 lib-mail: istream-header-filter - Fix HEADER_FILTER_ADD_MISSING_EOH with empty input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21610
diff changeset
484 mstream->last_added_newline = TRUE;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
485 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
486
20132
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
487 static int skip_header(struct header_filter_istream *mstream)
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
488 {
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
489 size_t pos;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
490
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
491 if (mstream->header_read)
20132
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
492 return 0;
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
493
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
494 if (mstream->istream.access_counter !=
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
495 mstream->istream.parent->real_stream->access_counter) {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
496 /* need to re-parse headers */
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
497 i_stream_header_filter_seek_to_header(mstream, 0);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
498 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
499
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
500 while (!mstream->header_read &&
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
501 i_stream_read(&mstream->istream.istream) != -1) {
14683
9646f80ac3e9 Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
502 pos = i_stream_get_data_size(&mstream->istream.istream);
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
503 i_stream_skip(&mstream->istream.istream, pos);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
504 }
20132
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
505 return mstream->istream.istream.stream_errno != 0 ? -1 : 0;
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
506 }
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
507
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
508 static void
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
509 stream_reset_to(struct header_filter_istream *mstream, uoff_t v_offset)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
510 {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
511 mstream->istream.istream.v_offset = v_offset;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
512 mstream->istream.skip = mstream->istream.pos = 0;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
513 mstream->istream.buffer = NULL;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
514 buffer_set_used_size(mstream->hdr_buf, 0);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
515 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
516
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
517 static void i_stream_header_filter_seek(struct istream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
518 uoff_t v_offset, bool mark ATTR_UNUSED)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522
11440
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
523 if (stream->istream.v_offset == v_offset) {
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
524 /* just reset the input buffer */
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
525 stream_reset_to(mstream, v_offset);
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
526 i_stream_seek(mstream->istream.parent,
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
527 mstream->istream.parent_expected_offset);
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
528 return;
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
529 }
12728
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
530 /* if last_lf_added=TRUE, we're currently at EOF. So reset it only if
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
531 we're seeking backwards, otherwise we would just add a duplicate */
079a81fb5117 istream-header-filter: Fixes handling HEADER_FILTER_END_BODY_WITH_LF correctly.
Timo Sirainen <tss@iki.fi>
parents: 12437
diff changeset
532 mstream->last_lf_added = FALSE;
11440
941608f8b3fb header filter istream: Avoid seeking backwards when caller just wants to reset the stream buffers.
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
533
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
534 if (v_offset == 0) {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
535 /* seeking to beginning of headers. */
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
536 stream_reset_to(mstream, 0);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
537 i_stream_header_filter_seek_to_header(mstream, 0);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
538 return;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
539 }
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
540
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
541 /* if we haven't parsed the whole header yet, we don't know if we
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
542 want to seek inside header or body. so make sure we've parsed the
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
543 header. */
20132
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
544 if (skip_header(mstream) < 0)
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
545 return;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
546 stream_reset_to(mstream, v_offset);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
547
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 if (v_offset < mstream->header_size.virtual_size) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
549 /* seek into headers. we'll have to re-parse them, use
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
550 skip_count to set the wanted position */
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
551 i_stream_header_filter_seek_to_header(mstream, v_offset);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 } else {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
553 /* body */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 v_offset += mstream->header_size.physical_size -
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 mstream->header_size.virtual_size;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
556 i_stream_seek(stream->parent,
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
557 stream->parent_start_offset + v_offset);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
561 static void ATTR_NORETURN
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
562 i_stream_header_filter_sync(struct istream_private *stream ATTR_UNUSED)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
563 {
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
564 i_panic("istream-header-filter sync() not implemented");
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
565 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
566
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
567 static int
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
568 i_stream_header_filter_stat(struct istream_private *stream, bool exact)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
569 {
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
570 struct header_filter_istream *mstream =
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
571 (struct header_filter_istream *)stream;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
572 const struct stat *st;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
573 uoff_t old_offset;
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
574
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18488
diff changeset
575 if (i_stream_stat(stream->parent, exact, &st) < 0) {
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18488
diff changeset
576 stream->istream.stream_errno = stream->parent->stream_errno;
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
577 return -1;
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18488
diff changeset
578 }
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
579 stream->statbuf = *st;
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
580 if (stream->statbuf.st_size == -1 || !exact)
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
581 return 0;
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
582
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
583 /* fix the filtered header size */
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
584 old_offset = stream->istream.v_offset;
20132
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
585 if (skip_header(mstream) < 0)
384f33adcce6 lib-mail: istream-header-filter - Check errors reading header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20078
diff changeset
586 return -1;
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
587
20135
91b5133b8238 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_HIDE_BODY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20134
diff changeset
588 if (mstream->hide_body) {
91b5133b8238 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_HIDE_BODY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20134
diff changeset
589 /* no body */
91b5133b8238 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_HIDE_BODY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20134
diff changeset
590 stream->statbuf.st_size = mstream->header_size.physical_size;
91b5133b8238 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_HIDE_BODY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20134
diff changeset
591 } else if (!mstream->end_body_with_lf) {
20133
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
592 /* no last-LF */
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
593 } else if (mstream->last_lf_added) {
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
594 /* yes, we have added LF */
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
595 stream->statbuf.st_size += mstream->crlf ? 2 : 1;
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
596 } else if (mstream->last_lf_offset != (uoff_t)-1) {
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
597 /* no, we didn't need to add LF */
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
598 } else {
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
599 /* check if we need to add LF */
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
600 i_stream_seek(stream->parent, st->st_size - 1);
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
601 (void)i_stream_read(stream->parent);
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
602 if (stream->parent->stream_errno != 0) {
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
603 stream->istream.stream_errno =
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
604 stream->parent->stream_errno;
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
605 return -1;
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
606 }
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
607 i_assert(stream->parent->eof);
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
608 ssize_t ret = handle_end_body_with_lf(mstream, -1);
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
609 if (ret > 0)
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
610 stream->statbuf.st_size += ret;
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
611 }
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
612
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
613 stream->statbuf.st_size -=
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
614 (off_t)mstream->header_size.physical_size -
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
615 (off_t)mstream->header_size.virtual_size;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
616 i_stream_seek(&stream->istream, old_offset);
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
617 return 0;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
618 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
619
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
620 #undef i_stream_create_header_filter
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 struct istream *
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
622 i_stream_create_header_filter(struct istream *input,
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
623 enum header_filter_flags flags,
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
624 const char *const *headers,
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
625 unsigned int headers_count,
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2295
diff changeset
626 header_filter_callback *callback, void *context)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 struct header_filter_istream *mstream;
12306
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
629 unsigned int i, j;
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
630 int ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
632 i_assert((flags & (HEADER_FILTER_INCLUDE|HEADER_FILTER_EXCLUDE)) != 0);
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
633
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
634 mstream = i_new(struct header_filter_istream, 1);
7485
8bed019c834d Memory pool allocation tweaks.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
635 mstream->pool = pool_alloconly_create(MEMPOOL_GROWING
8bed019c834d Memory pool allocation tweaks.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
636 "header filter stream", 4096);
6559
15a9ce2cc0ab Always keep a usable value in stream->max_buffer_size.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
637 mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
638
2793
19a6ff9fed58 Don't crash if no headers are given (fixes FETCH BODY[n.MIME] crashing)
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
639 mstream->headers = headers_count == 0 ? NULL :
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
640 p_new(mstream->pool, const char *, headers_count);
12306
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
641 for (i = j = 0; i < headers_count; i++) {
12437
e7299f187938 istream-header-filter: Fixed header name validation to use case-insensitive comparison.
Timo Sirainen <tss@iki.fi>
parents: 12313
diff changeset
642 ret = j == 0 ? -1 :
e7299f187938 istream-header-filter: Fixed header name validation to use case-insensitive comparison.
Timo Sirainen <tss@iki.fi>
parents: 12313
diff changeset
643 strcasecmp(mstream->headers[j-1], headers[i]);
12306
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
644 if (ret == 0) {
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
645 /* drop duplicate */
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
646 continue;
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
647 }
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
648 i_assert(ret < 0);
d95510ee0c8f istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
Timo Sirainen <tss@iki.fi>
parents: 12293
diff changeset
649 mstream->headers[j++] = p_strdup(mstream->pool, headers[i]);
12286
0d689c112c6e istream-header-filter: Assert-crash if headers aren't given sorted.
Timo Sirainen <tss@iki.fi>
parents: 11959
diff changeset
650 }
12313
0ac9af7f7d5b istream-header-filter: Fix to previous change.
Timo Sirainen <tss@iki.fi>
parents: 12306
diff changeset
651 mstream->headers_count = j;
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
652 mstream->hdr_buf = buffer_create_dynamic(mstream->pool, 1024);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
654 mstream->callback = callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
655 mstream->context = context;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
656 mstream->exclude = (flags & HEADER_FILTER_EXCLUDE) != 0;
18343
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
657 if ((flags & HEADER_FILTER_CRLF_PRESERVE) != 0)
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
658 mstream->crlf_preserve = TRUE;
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
659 else if ((flags & HEADER_FILTER_NO_CR) != 0)
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
660 mstream->crlf = FALSE;
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
661 else
308a97126244 lib-mail: Added HEADER_FILTER_CRLF_PRESERVE flag to istream-header-filter.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
662 mstream->crlf = TRUE;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
663 mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
664 mstream->add_missing_eoh = (flags & HEADER_FILTER_ADD_MISSING_EOH) != 0;
11908
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
665 mstream->end_body_with_lf =
22e20ccc14bc istream-header-filter: Added HEADER_FILTER_END_BODY_WITH_LF flag.
Timo Sirainen <tss@iki.fi>
parents: 11440
diff changeset
666 (flags & HEADER_FILTER_END_BODY_WITH_LF) != 0;
20133
2d8f4b7b0561 lib-mail: istream-header-filter: Fixed stat() with HEADER_FILTER_END_BODY_WITH_LF
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20132
diff changeset
667 mstream->last_lf_offset = (uoff_t)-1;
22225
e3ebc1be3d49 lib-mail: istream-header-filter - Fix HEADER_FILTER_ADD_MISSING_EOH with empty input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21610
diff changeset
668 mstream->last_added_newline = TRUE;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
670 mstream->istream.iostream.destroy = i_stream_header_filter_destroy;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
671 mstream->istream.read = i_stream_header_filter_read;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
672 mstream->istream.seek = i_stream_header_filter_seek;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
673 mstream->istream.sync = i_stream_header_filter_sync;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
674 mstream->istream.stat = i_stream_header_filter_stat;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675
9540
622509c562e8 Added struct istream.readable_fd, which is used to determine if sendfile() can be used.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
676 mstream->istream.istream.readable_fd = FALSE;
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
677 mstream->istream.istream.blocking = input->blocking;
3239
904a268921af Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents: 2990
diff changeset
678 mstream->istream.istream.seekable = input->seekable;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
679
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
680 return i_stream_create(&mstream->istream, input, -1);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 }
14852
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
682
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
683 void i_stream_header_filter_add(struct header_filter_istream *input,
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
684 const void *data, size_t size)
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
685 {
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
686 buffer_append(input->hdr_buf, data, size);
18488
aa8786771490 lib-mail: Fixed modifying headers with i_stream_header_filter_add()
Timo Sirainen <tss@iki.fi>
parents: 18343
diff changeset
687 input->headers_edited = TRUE;
14852
04abd58abf7a istream-header-filter: Added i_stream_header_filter_add() to add extra headers.
Timo Sirainen <tss@iki.fi>
parents: 14683
diff changeset
688 }