Mercurial > hg > nginx-mail
annotate src/mail/ngx_mail.h @ 571:5938746e70c2 PATCH_NGINX_MAIL_0_8
Mail: get rid of ugly protocol check in ngx_mail_auth_parse().
Instead, use index of argument which holds authentication mechanism name. For
IMAP and POP3 it's 0, for SMTP - 1 as SMTP preserves command in first argument
to allow pipelining support.
While here, add check that we actually have argument holding authentication
mechanism name. Currently IMAP has no appropriate checks before calling
ngx_mail_auth_parse() which results in possible access of uninitialized
memory.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 27 Sep 2009 00:52:15 +0400 |
parents | 9773720b845e |
children | 0b460e61bdcd |
rev | line source |
---|---|
290 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #ifndef _NGX_MAIL_H_INCLUDED_ | |
8 #define _NGX_MAIL_H_INCLUDED_ | |
9 | |
10 | |
11 #include <ngx_config.h> | |
12 #include <ngx_core.h> | |
13 #include <ngx_event.h> | |
14 #include <ngx_event_connect.h> | |
15 | |
16 #if (NGX_MAIL_SSL) | |
17 #include <ngx_mail_ssl_module.h> | |
18 #endif | |
19 | |
20 | |
21 | |
22 typedef struct { | |
23 void **main_conf; | |
24 void **srv_conf; | |
25 } ngx_mail_conf_ctx_t; | |
26 | |
27 | |
28 typedef struct { | |
532 | 29 u_char sockaddr[NGX_SOCKADDRLEN]; |
30 socklen_t socklen; | |
290 | 31 |
32 /* server ctx */ | |
33 ngx_mail_conf_ctx_t *ctx; | |
34 | |
35 unsigned bind:1; | |
532 | 36 unsigned wildcard:1; |
426 | 37 #if (NGX_MAIL_SSL) |
38 unsigned ssl:1; | |
39 #endif | |
532 | 40 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) |
41 unsigned ipv6only:2; | |
42 #endif | |
290 | 43 } ngx_mail_listen_t; |
44 | |
45 | |
46 typedef struct { | |
47 ngx_mail_conf_ctx_t *ctx; | |
48 ngx_str_t addr_text; | |
426 | 49 #if (NGX_MAIL_SSL) |
50 ngx_uint_t ssl; /* unsigned ssl:1; */ | |
51 #endif | |
532 | 52 } ngx_mail_addr_conf_t; |
53 | |
54 typedef struct { | |
55 in_addr_t addr; | |
56 ngx_mail_addr_conf_t conf; | |
290 | 57 } ngx_mail_in_addr_t; |
58 | |
59 | |
532 | 60 #if (NGX_HAVE_INET6) |
61 | |
290 | 62 typedef struct { |
532 | 63 struct in6_addr addr6; |
64 ngx_mail_addr_conf_t conf; | |
65 } ngx_mail_in6_addr_t; | |
66 | |
67 #endif | |
290 | 68 |
69 | |
70 typedef struct { | |
532 | 71 /* ngx_mail_in_addr_t or ngx_mail_in6_addr_t */ |
72 void *addrs; | |
73 ngx_uint_t naddrs; | |
74 } ngx_mail_port_t; | |
75 | |
76 | |
77 typedef struct { | |
78 int family; | |
290 | 79 in_port_t port; |
532 | 80 ngx_array_t addrs; /* array of ngx_mail_conf_addr_t */ |
81 } ngx_mail_conf_port_t; | |
290 | 82 |
83 | |
84 typedef struct { | |
532 | 85 struct sockaddr *sockaddr; |
86 socklen_t socklen; | |
87 | |
290 | 88 ngx_mail_conf_ctx_t *ctx; |
532 | 89 |
290 | 90 unsigned bind:1; |
532 | 91 unsigned wildcard:1; |
426 | 92 #if (NGX_MAIL_SSL) |
93 unsigned ssl:1; | |
94 #endif | |
532 | 95 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) |
96 unsigned ipv6only:2; | |
97 #endif | |
98 } ngx_mail_conf_addr_t; | |
290 | 99 |
100 | |
101 typedef struct { | |
102 ngx_array_t servers; /* ngx_mail_core_srv_conf_t */ | |
103 ngx_array_t listen; /* ngx_mail_listen_t */ | |
104 } ngx_mail_core_main_conf_t; | |
105 | |
106 | |
107 #define NGX_MAIL_POP3_PROTOCOL 0 | |
108 #define NGX_MAIL_IMAP_PROTOCOL 1 | |
109 #define NGX_MAIL_SMTP_PROTOCOL 2 | |
110 | |
336 | 111 |
112 typedef struct ngx_mail_protocol_s ngx_mail_protocol_t; | |
113 | |
290 | 114 |
336 | 115 typedef struct { |
116 ngx_mail_protocol_t *protocol; | |
290 | 117 |
336 | 118 ngx_msec_t timeout; |
366 | 119 ngx_msec_t resolver_timeout; |
290 | 120 |
121 ngx_flag_t so_keepalive; | |
122 | |
336 | 123 ngx_str_t server_name; |
290 | 124 |
336 | 125 u_char *file_name; |
126 ngx_int_t line; | |
290 | 127 |
366 | 128 ngx_resolver_t *resolver; |
129 | |
290 | 130 /* server ctx */ |
131 ngx_mail_conf_ctx_t *ctx; | |
132 } ngx_mail_core_srv_conf_t; | |
133 | |
134 | |
135 typedef enum { | |
136 ngx_pop3_start = 0, | |
137 ngx_pop3_user, | |
138 ngx_pop3_passwd, | |
139 ngx_pop3_auth_login_username, | |
140 ngx_pop3_auth_login_password, | |
141 ngx_pop3_auth_plain, | |
142 ngx_pop3_auth_cram_md5 | |
354 | 143 } ngx_pop3_state_e; |
290 | 144 |
145 | |
146 typedef enum { | |
147 ngx_imap_start = 0, | |
322 | 148 ngx_imap_auth_login_username, |
149 ngx_imap_auth_login_password, | |
150 ngx_imap_auth_plain, | |
151 ngx_imap_auth_cram_md5, | |
290 | 152 ngx_imap_login, |
153 ngx_imap_user, | |
154 ngx_imap_passwd | |
155 } ngx_imap_state_e; | |
156 | |
157 | |
158 typedef enum { | |
159 ngx_smtp_start = 0, | |
160 ngx_smtp_auth_login_username, | |
161 ngx_smtp_auth_login_password, | |
162 ngx_smtp_auth_plain, | |
163 ngx_smtp_auth_cram_md5, | |
164 ngx_smtp_helo, | |
449 | 165 ngx_smtp_helo_xclient, |
166 ngx_smtp_helo_from, | |
167 ngx_smtp_xclient, | |
168 ngx_smtp_xclient_from, | |
482 | 169 ngx_smtp_xclient_helo, |
449 | 170 ngx_smtp_from, |
171 ngx_smtp_to | |
290 | 172 } ngx_smtp_state_e; |
173 | |
174 | |
175 typedef struct { | |
176 ngx_peer_connection_t upstream; | |
177 ngx_buf_t *buffer; | |
178 } ngx_mail_proxy_ctx_t; | |
179 | |
180 | |
181 typedef struct { | |
182 uint32_t signature; /* "MAIL" */ | |
183 | |
184 ngx_connection_t *connection; | |
185 | |
186 ngx_str_t out; | |
187 ngx_buf_t *buffer; | |
188 | |
189 void **ctx; | |
190 void **main_conf; | |
191 void **srv_conf; | |
192 | |
366 | 193 ngx_resolver_ctx_t *resolver_ctx; |
194 | |
290 | 195 ngx_mail_proxy_ctx_t *proxy; |
196 | |
197 ngx_uint_t mail_state; | |
198 | |
336 | 199 unsigned protocol:3; |
290 | 200 unsigned blocked:1; |
201 unsigned quit:1; | |
202 unsigned quoted:1; | |
203 unsigned backslash:1; | |
204 unsigned no_sync_literal:1; | |
205 unsigned starttls:1; | |
206 unsigned esmtp:1; | |
449 | 207 unsigned auth_method:3; |
290 | 208 unsigned auth_wait:1; |
209 | |
210 ngx_str_t login; | |
211 ngx_str_t passwd; | |
212 | |
213 ngx_str_t salt; | |
214 ngx_str_t tag; | |
215 ngx_str_t tagged_line; | |
336 | 216 ngx_str_t text; |
290 | 217 |
218 ngx_str_t *addr_text; | |
366 | 219 ngx_str_t host; |
290 | 220 ngx_str_t smtp_helo; |
449 | 221 ngx_str_t smtp_from; |
222 ngx_str_t smtp_to; | |
290 | 223 |
224 ngx_uint_t command; | |
225 ngx_array_t args; | |
226 | |
227 ngx_uint_t login_attempt; | |
228 | |
336 | 229 /* used to parse POP3/IMAP/SMTP command */ |
290 | 230 |
231 ngx_uint_t state; | |
232 u_char *cmd_start; | |
233 u_char *arg_start; | |
234 u_char *arg_end; | |
235 ngx_uint_t literal_len; | |
236 } ngx_mail_session_t; | |
237 | |
238 | |
239 typedef struct { | |
240 ngx_str_t *client; | |
241 ngx_mail_session_t *session; | |
242 } ngx_mail_log_ctx_t; | |
243 | |
244 | |
322 | 245 #define NGX_POP3_USER 1 |
246 #define NGX_POP3_PASS 2 | |
247 #define NGX_POP3_CAPA 3 | |
248 #define NGX_POP3_QUIT 4 | |
249 #define NGX_POP3_NOOP 5 | |
250 #define NGX_POP3_STLS 6 | |
251 #define NGX_POP3_APOP 7 | |
252 #define NGX_POP3_AUTH 8 | |
253 #define NGX_POP3_STAT 9 | |
254 #define NGX_POP3_LIST 10 | |
255 #define NGX_POP3_RETR 11 | |
256 #define NGX_POP3_DELE 12 | |
257 #define NGX_POP3_RSET 13 | |
258 #define NGX_POP3_TOP 14 | |
259 #define NGX_POP3_UIDL 15 | |
290 | 260 |
261 | |
322 | 262 #define NGX_IMAP_LOGIN 1 |
263 #define NGX_IMAP_LOGOUT 2 | |
264 #define NGX_IMAP_CAPABILITY 3 | |
265 #define NGX_IMAP_NOOP 4 | |
266 #define NGX_IMAP_STARTTLS 5 | |
290 | 267 |
322 | 268 #define NGX_IMAP_NEXT 6 |
269 | |
270 #define NGX_IMAP_AUTHENTICATE 7 | |
290 | 271 |
272 | |
322 | 273 #define NGX_SMTP_HELO 1 |
274 #define NGX_SMTP_EHLO 2 | |
275 #define NGX_SMTP_AUTH 3 | |
276 #define NGX_SMTP_QUIT 4 | |
277 #define NGX_SMTP_NOOP 5 | |
278 #define NGX_SMTP_MAIL 6 | |
279 #define NGX_SMTP_RSET 7 | |
280 #define NGX_SMTP_RCPT 8 | |
281 #define NGX_SMTP_DATA 9 | |
282 #define NGX_SMTP_VRFY 10 | |
283 #define NGX_SMTP_EXPN 11 | |
284 #define NGX_SMTP_HELP 12 | |
285 #define NGX_SMTP_STARTTLS 13 | |
290 | 286 |
287 | |
482 | 288 #define NGX_MAIL_AUTH_PLAIN 0 |
289 #define NGX_MAIL_AUTH_LOGIN 1 | |
290 #define NGX_MAIL_AUTH_LOGIN_USERNAME 2 | |
291 #define NGX_MAIL_AUTH_APOP 3 | |
292 #define NGX_MAIL_AUTH_CRAM_MD5 4 | |
293 #define NGX_MAIL_AUTH_NONE 5 | |
290 | 294 |
295 | |
296 #define NGX_MAIL_AUTH_PLAIN_ENABLED 0x0002 | |
297 #define NGX_MAIL_AUTH_LOGIN_ENABLED 0x0004 | |
298 #define NGX_MAIL_AUTH_APOP_ENABLED 0x0008 | |
299 #define NGX_MAIL_AUTH_CRAM_MD5_ENABLED 0x0010 | |
449 | 300 #define NGX_MAIL_AUTH_NONE_ENABLED 0x0020 |
290 | 301 |
302 | |
303 #define NGX_MAIL_PARSE_INVALID_COMMAND 20 | |
304 | |
305 | |
336 | 306 typedef void (*ngx_mail_init_session_pt)(ngx_mail_session_t *s, |
307 ngx_connection_t *c); | |
308 typedef void (*ngx_mail_init_protocol_pt)(ngx_event_t *rev); | |
309 typedef void (*ngx_mail_auth_state_pt)(ngx_event_t *rev); | |
310 typedef ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s); | |
311 | |
312 | |
313 struct ngx_mail_protocol_s { | |
314 ngx_str_t name; | |
315 in_port_t port[4]; | |
316 ngx_uint_t type; | |
317 | |
318 ngx_mail_init_session_pt init_session; | |
319 ngx_mail_init_protocol_pt init_protocol; | |
320 ngx_mail_parse_command_pt parse_command; | |
321 ngx_mail_auth_state_pt auth_state; | |
290 | 322 |
336 | 323 ngx_str_t internal_server_error; |
324 }; | |
325 | |
326 | |
327 typedef struct { | |
328 ngx_mail_protocol_t *protocol; | |
329 | |
330 void *(*create_main_conf)(ngx_conf_t *cf); | |
331 char *(*init_main_conf)(ngx_conf_t *cf, void *conf); | |
332 | |
333 void *(*create_srv_conf)(ngx_conf_t *cf); | |
334 char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, | |
335 void *conf); | |
336 } ngx_mail_module_t; | |
337 | |
338 | |
339 #define NGX_MAIL_MODULE 0x4C49414D /* "MAIL" */ | |
340 | |
341 #define NGX_MAIL_MAIN_CONF 0x02000000 | |
342 #define NGX_MAIL_SRV_CONF 0x04000000 | |
290 | 343 |
344 | |
345 #define NGX_MAIL_MAIN_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, main_conf) | |
346 #define NGX_MAIL_SRV_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, srv_conf) | |
347 | |
348 | |
349 #define ngx_mail_get_module_ctx(s, module) (s)->ctx[module.ctx_index] | |
350 #define ngx_mail_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; | |
351 #define ngx_mail_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; | |
352 | |
353 | |
354 #define ngx_mail_get_module_main_conf(s, module) \ | |
355 (s)->main_conf[module.ctx_index] | |
356 #define ngx_mail_get_module_srv_conf(s, module) (s)->srv_conf[module.ctx_index] | |
357 | |
358 #define ngx_mail_conf_get_module_main_conf(cf, module) \ | |
359 ((ngx_mail_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] | |
322 | 360 #define ngx_mail_conf_get_module_srv_conf(cf, module) \ |
361 ((ngx_mail_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] | |
290 | 362 |
363 | |
336 | 364 #if (NGX_MAIL_SSL) |
365 void ngx_mail_starttls_handler(ngx_event_t *rev); | |
366 ngx_int_t ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c); | |
367 #endif | |
368 | |
369 | |
290 | 370 void ngx_mail_init_connection(ngx_connection_t *c); |
336 | 371 |
372 ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c, | |
373 ngx_mail_core_srv_conf_t *cscf); | |
374 ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, | |
375 ngx_uint_t n); | |
376 ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s, | |
482 | 377 ngx_connection_t *c, ngx_uint_t n); |
336 | 378 ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s, |
379 ngx_connection_t *c); | |
380 ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, | |
381 ngx_connection_t *c, char *prefix, size_t len); | |
382 ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c); | |
571
5938746e70c2
Mail: get rid of ugly protocol check in ngx_mail_auth_parse().
Maxim Dounin <mdounin@mdounin.ru>
parents:
570
diff
changeset
|
383 ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c, |
5938746e70c2
Mail: get rid of ugly protocol check in ngx_mail_auth_parse().
Maxim Dounin <mdounin@mdounin.ru>
parents:
570
diff
changeset
|
384 ngx_uint_t n); |
336 | 385 |
290 | 386 void ngx_mail_send(ngx_event_t *wev); |
336 | 387 ngx_int_t ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c); |
388 void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c); | |
290 | 389 void ngx_mail_close_connection(ngx_connection_t *c); |
390 void ngx_mail_session_internal_server_error(ngx_mail_session_t *s); | |
336 | 391 u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len); |
290 | 392 |
336 | 393 |
394 char *ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | |
290 | 395 |
396 | |
397 /* STUB */ | |
398 void ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_peer_addr_t *peer); | |
399 void ngx_mail_auth_http_init(ngx_mail_session_t *s); | |
400 /**/ | |
401 | |
402 | |
403 extern ngx_uint_t ngx_mail_max_module; | |
404 extern ngx_module_t ngx_mail_core_module; | |
405 | |
406 | |
407 #endif /* _NGX_MAIL_H_INCLUDED_ */ |