Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-parser.h @ 3879:928229f8b3e6 HEAD
deinit, unref, destroy, close, free, etc. functions now take a pointer to
their data pointer, and set it to NULL. This makes double-frees less likely
to cause security holes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 14 Jan 2006 20:47:20 +0200 |
parents | 55df57c028d4 |
children | fd315deac28f |
rev | line source |
---|---|
0 | 1 #ifndef __MESSAGE_PARSER_H |
2 #define __MESSAGE_PARSER_H | |
3 | |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
953
diff
changeset
|
4 #include "message-size.h" |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
953
diff
changeset
|
5 |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
6 #define IS_LWSP(c) \ |
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
7 ((c) == ' ' || (c) == '\t') |
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
8 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
9 enum message_part_flags { |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
10 MESSAGE_PART_FLAG_MULTIPART = 0x01, |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
11 MESSAGE_PART_FLAG_MULTIPART_DIGEST = 0x02, |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
12 MESSAGE_PART_FLAG_MESSAGE_RFC822 = 0x04, |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
13 |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
14 /* content-type: text/... */ |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
15 MESSAGE_PART_FLAG_TEXT = 0x08, |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
16 |
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
17 /* content-transfer-encoding: binary */ |
1534
676995d7c0ca
IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents:
1322
diff
changeset
|
18 MESSAGE_PART_FLAG_BINARY = 0x10, |
676995d7c0ca
IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents:
1322
diff
changeset
|
19 |
676995d7c0ca
IMAP protocol doesn't allow server to send NULs to client. Send ascii #128
Timo Sirainen <tss@iki.fi>
parents:
1322
diff
changeset
|
20 /* message part header or body contains NULs */ |
1618
149ade487f48
Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents:
1534
diff
changeset
|
21 MESSAGE_PART_FLAG_HAS_NULS = 0x20, |
149ade487f48
Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents:
1534
diff
changeset
|
22 |
149ade487f48
Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents:
1534
diff
changeset
|
23 /* Mime-Version header exists. */ |
149ade487f48
Ignore Content-* headers if there's no MIME-Version header. Note that this
Timo Sirainen <tss@iki.fi>
parents:
1534
diff
changeset
|
24 MESSAGE_PART_FLAG_IS_MIME = 0x40 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
25 }; |
106
5fe3e04ca8d9
Added support for caching of MessagePart data. This is useful for fetching
Timo Sirainen <tss@iki.fi>
parents:
105
diff
changeset
|
26 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
27 struct message_part { |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
28 struct message_part *parent; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
29 struct message_part *next; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
30 struct message_part *children; |
0 | 31 |
105
31034993473c
there was no need for MessagePart->pos.virtual_pos, so removed it.
Timo Sirainen <tss@iki.fi>
parents:
50
diff
changeset
|
32 uoff_t physical_pos; /* absolute position from beginning of message */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
33 struct message_size header_size; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
34 struct message_size body_size; |
0 | 35 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
36 enum message_part_flags flags; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
9
diff
changeset
|
37 void *context; |
0 | 38 }; |
39 | |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
40 struct message_parser_ctx; |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
41 struct message_header_parser_ctx; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
42 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
43 struct message_header_line { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
44 const char *name; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
45 size_t name_len; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
46 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
47 const unsigned char *value; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
48 size_t value_len; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
49 |
2150
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
50 const unsigned char *full_value; |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
51 size_t full_value_len; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
52 |
2404
8ef002a26f1c
Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents:
2150
diff
changeset
|
53 const unsigned char *middle; |
8ef002a26f1c
Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents:
2150
diff
changeset
|
54 size_t middle_len; |
8ef002a26f1c
Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents:
2150
diff
changeset
|
55 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1697
diff
changeset
|
56 uoff_t name_offset, full_value_offset; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1697
diff
changeset
|
57 |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
58 unsigned int continues:1; /* multiline header, continues in next line */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
59 unsigned int continued:1; /* multiline header, continues */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
60 unsigned int eoh:1; /* "end of headers" line */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
61 unsigned int no_newline:1; /* no \n after this line */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
62 unsigned int use_full_value:1; /* set if you want full_value */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
63 }; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
64 |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
65 /* called once with hdr = NULL at the end of headers */ |
1038
60646878858e
Function typedefs now define them as functions, not function pointers.
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
66 typedef void message_header_callback_t(struct message_part *part, |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
67 struct message_header_line *hdr, |
1038
60646878858e
Function typedefs now define them as functions, not function pointers.
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
68 void *context); |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
69 /* called once with size = 0 at the end of message part */ |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
70 typedef void message_body_callback_t(struct message_part *part, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
71 const unsigned char *data, size_t size, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
72 void *context); |
0 | 73 |
953
411006be3c66
Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
74 /* callback is called for each field in message header. */ |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
75 void message_parse_from_parts(struct message_part *part, struct istream *input, |
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
76 message_header_callback_t *callback, |
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1618
diff
changeset
|
77 void *context); |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
78 void message_parse_header(struct message_part *part, struct istream *input, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
79 struct message_size *hdr_size, |
1038
60646878858e
Function typedefs now define them as functions, not function pointers.
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
80 message_header_callback_t *callback, void *context); |
0 | 81 |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
82 |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
83 /* Initialize message parser. part_spool specifies where struct message_parts |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
84 are allocated from. */ |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
85 struct message_parser_ctx * |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
86 message_parser_init(pool_t part_pool, struct istream *input); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
87 struct message_part *message_parser_deinit(struct message_parser_ctx **ctx); |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
88 |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
89 /* Read and parse header. */ |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
90 void message_parser_parse_header(struct message_parser_ctx *ctx, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
91 struct message_size *hdr_size, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
92 message_header_callback_t *callback, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
93 void *context); |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
94 /* Read and parse body. If message is a MIME multipart or message/rfc822 |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
95 message, hdr_callback is called for all headers. body_callback is called |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
96 for the body content. */ |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
97 void message_parser_parse_body(struct message_parser_ctx *ctx, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
98 message_header_callback_t *hdr_callback, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
99 message_body_callback_t *body_callback, |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
100 void *context); |
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
101 |
2150
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
102 /* skip_initial_lwsp controls if we should skip LWSP after "header: ". |
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
103 Note that there may not be the single whitespace after "header:", and that |
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
104 "header : " is also possible. These two conditions can't be determined from |
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
105 struct message_header_line. */ |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
106 struct message_header_parser_ctx * |
2150
347ca1cf6372
Added skip_initial_lwsp parameter to message_parse_header_init().
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
107 message_parse_header_init(struct istream *input, struct message_size *hdr_size, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
108 bool skip_initial_lwsp); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
109 void message_parse_header_deinit(struct message_header_parser_ctx **ctx); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
110 |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2404
diff
changeset
|
111 /* Read and return next header line. Returns 1 if header is returned, 0 if |
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2404
diff
changeset
|
112 input stream is non-blocking and more data needs to be read, -1 when all is |
3520 | 113 done or error occurred (see stream's error status). */ |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2404
diff
changeset
|
114 int message_parse_header_next(struct message_header_parser_ctx *ctx, |
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2404
diff
changeset
|
115 struct message_header_line **hdr_r); |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1038
diff
changeset
|
116 |
0 | 117 #endif |