Mercurial > hg > nginx-quic
annotate src/mail/ngx_mail_pop3_module.c @ 6806:75dbab4ea930
Events: improved error event handling for UDP sockets.
Normally, the epoll module calls the read and write handlers depending
on whether EPOLLIN and EPOLLOUT are reported by epoll_wait(). No error
processing is done in the module, the handlers are expected to get an
error when doing I/O.
If an error event is reported without EPOLLIN and EPOLLOUT, the module
set both EPOLLIN and EPOLLOUT to ensure the error event is handled at
least in one active handler.
This works well unless the error is delivered along with only one of
EPOLLIN or EPOLLOUT, and the corresponding handler does not do any I/O.
For example, it happened when getting EPOLLERR|EPOLLOUT from
epoll_wait() upon receiving "ICMP port unreachable" while proxying UDP.
As the write handler had nothing to send it was not able to detect and
log an error, and did not switch to the next upstream.
The fix is to unconditionally set EPOLLIN and EPOLLOUT in case of an
error event. In the aforementioned case, this causes the read handler
to be called which does recv() and detects an error.
In addition to the epoll module, analogous changes were made in
devpoll/eventport/poll.
author | Dmitry Volyntsev <xeioex@nginx.com> |
---|---|
date | Mon, 21 Nov 2016 16:03:42 +0300 |
parents | bcb107bb89cd |
children | 03735fef08da |
rev | line source |
---|---|
521 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
521 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_event.h> | |
1136 | 11 #include <ngx_mail.h> |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
12 #include <ngx_mail_pop3_module.h> |
521 | 13 |
14 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
15 static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf); |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
16 static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, |
521 | 17 void *child); |
18 | |
19 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
20 static ngx_str_t ngx_mail_pop3_default_capabilities[] = { |
527 | 21 ngx_string("TOP"), |
22 ngx_string("USER"), | |
23 ngx_string("UIDL"), | |
24 ngx_null_string | |
25 }; | |
26 | |
27 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
28 static ngx_conf_bitmask_t ngx_mail_pop3_auth_methods[] = { |
1136 | 29 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, |
30 { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED }, | |
31 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, | |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
32 { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, |
800 | 33 { ngx_null_string, 0 } |
34 }; | |
35 | |
36 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
37 static ngx_str_t ngx_mail_pop3_auth_methods_names[] = { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
38 ngx_string("PLAIN"), |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
39 ngx_string("LOGIN"), |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
40 ngx_null_string, /* APOP */ |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
41 ngx_string("CRAM-MD5"), |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
42 ngx_string("EXTERNAL"), |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
43 ngx_null_string /* NONE */ |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
44 }; |
809 | 45 |
46 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
47 static ngx_mail_protocol_t ngx_mail_pop3_protocol = { |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
48 ngx_string("pop3"), |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
49 { 110, 995, 0, 0 }, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
50 NGX_MAIL_POP3_PROTOCOL, |
521 | 51 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
52 ngx_mail_pop3_init_session, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
53 ngx_mail_pop3_init_protocol, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
54 ngx_mail_pop3_parse_command, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
55 ngx_mail_pop3_auth_state, |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
56 |
5989
ec01b1d1fff1
Mail: client SSL certificates support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
57 ngx_string("-ERR internal server error" CRLF), |
ec01b1d1fff1
Mail: client SSL certificates support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
58 ngx_string("-ERR SSL certificate error" CRLF), |
ec01b1d1fff1
Mail: client SSL certificates support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
59 ngx_string("-ERR No required SSL certificate" CRLF) |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
60 }; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
61 |
587 | 62 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
63 static ngx_command_t ngx_mail_pop3_commands[] = { |
521 | 64 |
527 | 65 { ngx_string("pop3_capabilities"), |
1136 | 66 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
67 ngx_mail_capabilities, |
1136 | 68 NGX_MAIL_SRV_CONF_OFFSET, |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
69 offsetof(ngx_mail_pop3_srv_conf_t, capabilities), |
527 | 70 NULL }, |
71 | |
1136 | 72 { ngx_string("pop3_auth"), |
73 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, | |
800 | 74 ngx_conf_set_bitmask_slot, |
1136 | 75 NGX_MAIL_SRV_CONF_OFFSET, |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
76 offsetof(ngx_mail_pop3_srv_conf_t, auth_methods), |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
77 &ngx_mail_pop3_auth_methods }, |
800 | 78 |
521 | 79 ngx_null_command |
80 }; | |
81 | |
82 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
83 static ngx_mail_module_t ngx_mail_pop3_module_ctx = { |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
84 &ngx_mail_pop3_protocol, /* protocol */ |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
85 |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
86 NULL, /* create main configuration */ |
521 | 87 NULL, /* init main configuration */ |
88 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
89 ngx_mail_pop3_create_srv_conf, /* create server configuration */ |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
90 ngx_mail_pop3_merge_srv_conf /* merge server configuration */ |
521 | 91 }; |
92 | |
93 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
94 ngx_module_t ngx_mail_pop3_module = { |
521 | 95 NGX_MODULE_V1, |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
96 &ngx_mail_pop3_module_ctx, /* module context */ |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
97 ngx_mail_pop3_commands, /* module directives */ |
1136 | 98 NGX_MAIL_MODULE, /* module type */ |
541 | 99 NULL, /* init master */ |
521 | 100 NULL, /* init module */ |
541 | 101 NULL, /* init process */ |
102 NULL, /* init thread */ | |
103 NULL, /* exit thread */ | |
104 NULL, /* exit process */ | |
105 NULL, /* exit master */ | |
106 NGX_MODULE_V1_PADDING | |
521 | 107 }; |
108 | |
109 | |
110 static void * | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
111 ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf) |
577 | 112 { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
113 ngx_mail_pop3_srv_conf_t *pscf; |
641 | 114 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
115 pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t)); |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
116 if (pscf == NULL) { |
527 | 117 return NULL; |
521 | 118 } |
119 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
120 if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) |
1136 | 121 != NGX_OK) |
122 { | |
123 return NULL; | |
124 } | |
125 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
126 return pscf; |
521 | 127 } |
128 | |
129 | |
130 static char * | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
131 ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) |
521 | 132 { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
133 ngx_mail_pop3_srv_conf_t *prev = parent; |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
134 ngx_mail_pop3_srv_conf_t *conf = child; |
521 | 135 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
136 u_char *p; |
1136 | 137 size_t size, stls_only_size; |
527 | 138 ngx_str_t *c, *d; |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
139 ngx_uint_t i, m; |
1136 | 140 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
141 ngx_conf_merge_bitmask_value(conf->auth_methods, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
142 prev->auth_methods, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
143 (NGX_CONF_BITMASK_SET |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
144 |NGX_MAIL_AUTH_PLAIN_ENABLED)); |
800 | 145 |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
146 if (conf->auth_methods & NGX_MAIL_AUTH_PLAIN_ENABLED) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
147 conf->auth_methods |= NGX_MAIL_AUTH_LOGIN_ENABLED; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
148 } |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
149 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
150 if (conf->capabilities.nelts == 0) { |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
151 conf->capabilities = prev->capabilities; |
800 | 152 } |
153 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
154 if (conf->capabilities.nelts == 0) { |
527 | 155 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
156 for (d = ngx_mail_pop3_default_capabilities; d->len; d++) { |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
157 c = ngx_array_push(&conf->capabilities); |
527 | 158 if (c == NULL) { |
159 return NGX_CONF_ERROR; | |
160 } | |
161 | |
162 *c = *d; | |
163 } | |
164 } | |
165 | |
166 size = sizeof("+OK Capability list follows" CRLF) - 1 | |
167 + sizeof("." CRLF) - 1; | |
168 | |
1136 | 169 stls_only_size = size + sizeof("STLS" CRLF) - 1; |
170 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
171 c = conf->capabilities.elts; |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
172 for (i = 0; i < conf->capabilities.nelts; i++) { |
527 | 173 size += c[i].len + sizeof(CRLF) - 1; |
1136 | 174 |
175 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { | |
176 continue; | |
177 } | |
178 | |
179 stls_only_size += c[i].len + sizeof(CRLF) - 1; | |
527 | 180 } |
181 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
182 size += sizeof("SASL") - 1 + sizeof(CRLF) - 1; |
809 | 183 |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
184 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
185 m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
186 m <<= 1, i++) |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
187 { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
188 if (m & conf->auth_methods) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
189 size += 1 + ngx_mail_pop3_auth_methods_names[i].len; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
190 } |
809 | 191 } |
192 | |
2049 | 193 p = ngx_pnalloc(cf->pool, size); |
583 | 194 if (p == NULL) { |
527 | 195 return NGX_CONF_ERROR; |
196 } | |
197 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
198 conf->capability.len = size; |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
199 conf->capability.data = p; |
583 | 200 |
201 p = ngx_cpymem(p, "+OK Capability list follows" CRLF, | |
202 sizeof("+OK Capability list follows" CRLF) - 1); | |
527 | 203 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
204 for (i = 0; i < conf->capabilities.nelts; i++) { |
583 | 205 p = ngx_cpymem(p, c[i].data, c[i].len); |
206 *p++ = CR; *p++ = LF; | |
527 | 207 } |
208 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
209 p = ngx_cpymem(p, "SASL", sizeof("SASL") - 1); |
809 | 210 |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
211 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
212 m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
213 m <<= 1, i++) |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
214 { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
215 if (m & conf->auth_methods) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
216 *p++ = ' '; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
217 p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
218 ngx_mail_pop3_auth_methods_names[i].len); |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
219 } |
809 | 220 } |
221 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
222 *p++ = CR; *p++ = LF; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
223 |
583 | 224 *p++ = '.'; *p++ = CR; *p = LF; |
225 | |
226 | |
227 size += sizeof("STLS" CRLF) - 1; | |
527 | 228 |
2049 | 229 p = ngx_pnalloc(cf->pool, size); |
583 | 230 if (p == NULL) { |
231 return NGX_CONF_ERROR; | |
232 } | |
233 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
234 conf->starttls_capability.len = size; |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
235 conf->starttls_capability.data = p; |
583 | 236 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
237 p = ngx_cpymem(p, conf->capability.data, |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
238 conf->capability.len - (sizeof("." CRLF) - 1)); |
583 | 239 |
240 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); | |
241 *p++ = '.'; *p++ = CR; *p = LF; | |
527 | 242 |
243 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
244 size = sizeof("+OK methods supported:" CRLF) - 1 |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
245 + sizeof("." CRLF) - 1; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
246 |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
247 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
248 m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
249 m <<= 1, i++) |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
250 { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
251 if (m & conf->auth_methods) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
252 size += ngx_mail_pop3_auth_methods_names[i].len |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
253 + sizeof(CRLF) - 1; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
254 } |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
255 } |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
256 |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
257 p = ngx_pnalloc(cf->pool, size); |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
258 if (p == NULL) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
259 return NGX_CONF_ERROR; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
260 } |
809 | 261 |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
262 conf->auth_capability.data = p; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
263 conf->auth_capability.len = size; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
264 |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
265 p = ngx_cpymem(p, "+OK methods supported:" CRLF, |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
266 sizeof("+OK methods supported:" CRLF) - 1); |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
267 |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
268 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; |
6774
bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents:
6773
diff
changeset
|
269 m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
270 m <<= 1, i++) |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
271 { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
272 if (m & conf->auth_methods) { |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
273 p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
274 ngx_mail_pop3_auth_methods_names[i].len); |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
275 *p++ = CR; *p++ = LF; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
276 } |
809 | 277 } |
278 | |
6773
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
279 *p++ = '.'; *p++ = CR; *p = LF; |
73b451d304c0
Mail: extensible auth methods in pop3 module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5989
diff
changeset
|
280 |
809 | 281 |
2049 | 282 p = ngx_pnalloc(cf->pool, stls_only_size); |
1136 | 283 if (p == NULL) { |
284 return NGX_CONF_ERROR; | |
285 } | |
286 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
287 conf->starttls_only_capability.len = stls_only_size; |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
288 conf->starttls_only_capability.data = p; |
1136 | 289 |
290 p = ngx_cpymem(p, "+OK Capability list follows" CRLF, | |
291 sizeof("+OK Capability list follows" CRLF) - 1); | |
292 | |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1481
diff
changeset
|
293 for (i = 0; i < conf->capabilities.nelts; i++) { |
1136 | 294 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { |
295 continue; | |
296 } | |
297 | |
298 p = ngx_cpymem(p, c[i].data, c[i].len); | |
299 *p++ = CR; *p++ = LF; | |
300 } | |
301 | |
302 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); | |
303 *p++ = '.'; *p++ = CR; *p = LF; | |
304 | |
521 | 305 return NGX_CONF_OK; |
306 } |