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