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