/src/dovecot/src/lib-smtp/smtp-params.h
Line | Count | Source |
1 | | #ifndef SMTP_PARAMS_H |
2 | | #define SMTP_PARAMS_H |
3 | | |
4 | | #include "array-decl.h" |
5 | | |
6 | | #include "smtp-common.h" |
7 | | |
8 | | struct smtp_param; |
9 | | |
10 | | ARRAY_DEFINE_TYPE(smtp_param, struct smtp_param); |
11 | | |
12 | | enum smtp_param_mail_body_type { |
13 | | SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED = 0, |
14 | | SMTP_PARAM_MAIL_BODY_TYPE_7BIT, |
15 | | SMTP_PARAM_MAIL_BODY_TYPE_8BITMIME, |
16 | | SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME, |
17 | | SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION |
18 | | }; |
19 | | |
20 | | enum smtp_param_mail_ret { |
21 | | SMTP_PARAM_MAIL_RET_UNSPECIFIED = 0, |
22 | | SMTP_PARAM_MAIL_RET_HDRS, |
23 | | SMTP_PARAM_MAIL_RET_FULL, |
24 | | }; |
25 | | |
26 | | enum smtp_param_rcpt_notify { |
27 | | SMTP_PARAM_RCPT_NOTIFY_UNSPECIFIED = 0x00, |
28 | | SMTP_PARAM_RCPT_NOTIFY_SUCCESS = 0x01, |
29 | | SMTP_PARAM_RCPT_NOTIFY_FAILURE = 0x02, |
30 | | SMTP_PARAM_RCPT_NOTIFY_DELAY = 0x04, |
31 | | SMTP_PARAM_RCPT_NOTIFY_NEVER = 0x80 |
32 | | }; |
33 | | |
34 | | struct smtp_param { |
35 | | const char *keyword; |
36 | | const char *value; |
37 | | }; |
38 | | |
39 | | struct smtp_params_mail { |
40 | | /* AUTH: RFC 4954 */ |
41 | | const struct smtp_address *auth; |
42 | | /* BODY: RFC 6152 */ |
43 | | struct { |
44 | | enum smtp_param_mail_body_type type; |
45 | | const char *ext; |
46 | | } body; |
47 | | /* ENVID: RFC 3461, Section 4.4 */ |
48 | | const char *envid; |
49 | | /* RET: RFC 3461, Section 4.3 */ |
50 | | enum smtp_param_mail_ret ret; |
51 | | /* SIZE: RFC 1870 */ |
52 | | uoff_t size; |
53 | | /* SMTPUTF8: RFC 6531 */ |
54 | | bool smtputf8; |
55 | | /* extra parameters */ |
56 | | ARRAY_TYPE(smtp_param) extra_params; |
57 | | }; |
58 | | |
59 | | struct smtp_params_rcpt { |
60 | | /* ORCPT: RFC 3461, Section 4.2 */ |
61 | | struct { |
62 | | const char *addr_type; |
63 | | /* addr_type=rfc822 */ |
64 | | const struct smtp_address *addr; |
65 | | /* raw value */ |
66 | | const char *addr_raw; |
67 | | } orcpt; |
68 | | /* NOTIFY: RFC 3461, Section 4.1 */ |
69 | | enum smtp_param_rcpt_notify notify; |
70 | | /* extra parameters */ |
71 | | ARRAY_TYPE(smtp_param) extra_params; |
72 | | }; |
73 | | |
74 | | enum smtp_param_parse_error { |
75 | | SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX = 0, |
76 | | SMTP_PARAM_PARSE_ERROR_NOT_SUPPORTED |
77 | | }; |
78 | | |
79 | | /* |
80 | | * Common |
81 | | */ |
82 | | |
83 | | /* parse */ |
84 | | |
85 | | int smtp_param_parse(pool_t pool, const char *text, |
86 | | struct smtp_param *param_r, const char **error_r); |
87 | | |
88 | | /* manipulate */ |
89 | | |
90 | | void smtp_params_copy(pool_t pool, ARRAY_TYPE(smtp_param) *dst, |
91 | | const ARRAY_TYPE(smtp_param) *src) ATTR_NULL(3); |
92 | | |
93 | | void smtp_params_add_one(ARRAY_TYPE(smtp_param) *params, pool_t pool, |
94 | | const char *keyword, const char *value); |
95 | | void smtp_params_add_encoded(ARRAY_TYPE(smtp_param) *params, pool_t pool, |
96 | | const char *keyword, const unsigned char *value, |
97 | | size_t value_len); |
98 | | |
99 | | bool smtp_params_drop_one(ARRAY_TYPE(smtp_param) *params, const char *keyword, |
100 | | const char **value_r); |
101 | | |
102 | | /* write */ |
103 | | |
104 | | void smtp_param_write(string_t *out, const struct smtp_param *param); |
105 | | |
106 | | /* evaluate */ |
107 | | |
108 | | const struct smtp_param * |
109 | | smtp_params_get_param(const ARRAY_TYPE(smtp_param) *params, |
110 | | const char *keyword); |
111 | | int smtp_params_decode_param(const ARRAY_TYPE(smtp_param) *params, |
112 | | const char *keyword, string_t **value_r, |
113 | | bool allow_nul, const char **error_r); |
114 | | |
115 | | bool smtp_params_equal(const ARRAY_TYPE(smtp_param) *params1, |
116 | | const ARRAY_TYPE(smtp_param) *params2); |
117 | | |
118 | | /* |
119 | | * MAIL parameters |
120 | | */ |
121 | | |
122 | | /* parse */ |
123 | | |
124 | | int smtp_params_mail_parse(pool_t pool, const char *args, |
125 | | enum smtp_capability caps, |
126 | | const char *const *param_extensions, |
127 | | const char *const *body_param_extensions, |
128 | | struct smtp_params_mail *params_r, |
129 | | enum smtp_param_parse_error *error_code_r, |
130 | | const char **error_r) ATTR_NULL(4, 5); |
131 | | |
132 | | /* manipulate */ |
133 | | |
134 | | void smtp_params_mail_copy(pool_t pool, struct smtp_params_mail *dst, |
135 | | const struct smtp_params_mail *src); |
136 | | |
137 | | void smtp_params_mail_add_extra(struct smtp_params_mail *params, pool_t pool, |
138 | | const char *keyword, const char *value) |
139 | | ATTR_NULL(4); |
140 | | void smtp_params_mail_encode_extra(struct smtp_params_mail *params, pool_t pool, |
141 | | const char *keyword, |
142 | | const unsigned char *value, |
143 | | size_t value_len); |
144 | | bool smtp_params_mail_drop_extra(struct smtp_params_mail *params, |
145 | | const char *keyword, const char **value_r) |
146 | | ATTR_NULL(3); |
147 | | |
148 | | /* write */ |
149 | | |
150 | | void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, |
151 | | const char *const *extra_params, |
152 | | const struct smtp_params_mail *params) ATTR_NULL(3); |
153 | | |
154 | | /* evaluate */ |
155 | | |
156 | | const struct smtp_param * |
157 | | smtp_params_mail_get_extra(const struct smtp_params_mail *params, |
158 | | const char *keyword); |
159 | | int smtp_params_mail_decode_extra(const struct smtp_params_mail *params, |
160 | | const char *keyword, string_t **value_r, |
161 | | bool allow_nul, const char **error_r); |
162 | | |
163 | | /* events */ |
164 | | |
165 | | void smtp_params_mail_add_to_event(const struct smtp_params_mail *params, |
166 | | struct event *event); |
167 | | |
168 | | /* |
169 | | * RCPT parameters |
170 | | */ |
171 | | |
172 | | /* parse */ |
173 | | |
174 | | enum smtp_param_rcpt_parse_flags { |
175 | | /* Allow address values without a domain part */ |
176 | | SMTP_PARAM_RCPT_FLAG_ORCPT_ALLOW_LOCALPART = BIT(0), |
177 | | }; |
178 | | |
179 | | int smtp_params_rcpt_parse(pool_t pool, const char *args, |
180 | | enum smtp_param_rcpt_parse_flags flags, |
181 | | enum smtp_capability caps, |
182 | | const char *const *param_extensions, |
183 | | struct smtp_params_rcpt *params_r, |
184 | | enum smtp_param_parse_error *error_code_r, |
185 | | const char **error_r) ATTR_NULL(4); |
186 | | |
187 | | /* manipulate */ |
188 | | |
189 | | void smtp_params_rcpt_copy(pool_t pool, struct smtp_params_rcpt *dst, |
190 | | const struct smtp_params_rcpt *src) ATTR_NULL(3); |
191 | | |
192 | | void smtp_params_rcpt_add_extra(struct smtp_params_rcpt *params, pool_t pool, |
193 | | const char *keyword, const char *value) |
194 | | ATTR_NULL(4); |
195 | | void smtp_params_rcpt_encode_extra(struct smtp_params_rcpt *params, pool_t pool, |
196 | | const char *keyword, |
197 | | const unsigned char *value, |
198 | | size_t value_len); |
199 | | bool smtp_params_rcpt_drop_extra(struct smtp_params_rcpt *params, |
200 | | const char *keyword, const char **value_r) |
201 | | ATTR_NULL(3); |
202 | | |
203 | | void smtp_params_rcpt_set_orcpt(struct smtp_params_rcpt *params, pool_t pool, |
204 | | struct smtp_address *rcpt); |
205 | | |
206 | | /* write */ |
207 | | |
208 | | void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, |
209 | | const char *const *extra_params, |
210 | | const struct smtp_params_rcpt *params) ATTR_NULL(3); |
211 | | |
212 | | /* evaluate */ |
213 | | |
214 | | const struct smtp_param * |
215 | | smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params, |
216 | | const char *keyword); |
217 | | int smtp_params_rcpt_decode_extra(const struct smtp_params_rcpt *params, |
218 | | const char *keyword, string_t **value_r, |
219 | | bool allow_nul, const char **error_r); |
220 | | |
221 | | bool smtp_params_rcpt_equal(const struct smtp_params_rcpt *params1, |
222 | | const struct smtp_params_rcpt *params2); |
223 | | |
224 | | static inline bool |
225 | | smtp_params_rcpt_has_orcpt(const struct smtp_params_rcpt *params) |
226 | 0 | { |
227 | 0 | return (params->orcpt.addr_type != NULL); |
228 | 0 | } Unexecuted instantiation: fuzz-smtp-server.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-data.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-reply.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-command.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-recipient.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-transaction.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-connection.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-params.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-helo.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-starttls.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-auth.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-mail.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-rcpt.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-rset.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-noop.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-quit.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-vrfy.c:smtp_params_rcpt_has_orcpt Unexecuted instantiation: smtp-server-cmd-xclient.c:smtp_params_rcpt_has_orcpt |
229 | | |
230 | | /* events */ |
231 | | |
232 | | void smtp_params_rcpt_add_to_event(const struct smtp_params_rcpt *params, |
233 | | struct event *event); |
234 | | |
235 | | #endif |