Mercurial > dovecot > core-2.2
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 |
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 | 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 | 130 return array_bsearch(&mstream->match_change_lines, &mstream->cur_line, |
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 | 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 | 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 | 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 | 210 } |
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 | 488 { |
489 size_t pos; | |
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 | 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 | 503 i_stream_skip(&mstream->istream.istream, pos); |
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 | 506 } |
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 | 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 | 570 struct header_filter_istream *mstream = |
571 (struct header_filter_istream *)stream; | |
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 | 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 | 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 | 579 stream->statbuf = *st; |
580 if (stream->statbuf.st_size == -1 || !exact) | |
581 return 0; | |
4327 | 582 |
14964 | 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 | 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 | 613 stream->statbuf.st_size -= |
614 (off_t)mstream->header_size.physical_size - | |
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 | 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 | 635 mstream->pool = pool_alloconly_create(MEMPOOL_GROWING |
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 } |