Mercurial > hg > nginx
annotate src/mail/ngx_mail_core_module.c @ 1481:b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 14 Sep 2007 13:58:49 +0000 |
parents | c4b2c893989d |
children | f69493e8faab |
rev | line source |
---|---|
521 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 #include <ngx_event.h> | |
1136 | 10 #include <ngx_mail.h> |
521 | 11 |
12 | |
1136 | 13 static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf); |
14 static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf); | |
15 static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, | |
521 | 16 void *child); |
1136 | 17 static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, |
521 | 18 void *conf); |
1136 | 19 static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, |
521 | 20 void *conf); |
1136 | 21 static char *ngx_mail_core_capability(ngx_conf_t *cf, ngx_command_t *cmd, |
527 | 22 void *conf); |
521 | 23 |
24 | |
1136 | 25 static ngx_conf_enum_t ngx_mail_core_procotol[] = { |
26 { ngx_string("pop3"), NGX_MAIL_POP3_PROTOCOL }, | |
27 { ngx_string("imap"), NGX_MAIL_IMAP_PROTOCOL }, | |
28 { ngx_string("smtp"), NGX_MAIL_SMTP_PROTOCOL }, | |
521 | 29 { ngx_null_string, 0 } |
30 }; | |
31 | |
32 | |
527 | 33 static ngx_str_t ngx_pop3_default_capabilities[] = { |
34 ngx_string("TOP"), | |
35 ngx_string("USER"), | |
36 ngx_string("UIDL"), | |
37 ngx_null_string | |
38 }; | |
39 | |
40 | |
41 static ngx_str_t ngx_imap_default_capabilities[] = { | |
42 ngx_string("IMAP4"), | |
43 ngx_string("IMAP4rev1"), | |
44 ngx_string("UIDPLUS"), | |
45 ngx_null_string | |
46 }; | |
47 | |
48 | |
1136 | 49 static ngx_conf_bitmask_t ngx_pop3_auth_methods[] = { |
50 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, | |
51 { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED }, | |
52 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, | |
800 | 53 { ngx_null_string, 0 } |
54 }; | |
55 | |
56 | |
1323 | 57 static ngx_conf_bitmask_t ngx_imap_auth_methods[] = { |
58 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, | |
59 { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, | |
60 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, | |
61 { ngx_null_string, 0 } | |
62 }; | |
63 | |
64 | |
1136 | 65 static ngx_conf_bitmask_t ngx_smtp_auth_methods[] = { |
66 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, | |
67 { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, | |
68 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, | |
69 { ngx_null_string, 0 } | |
70 }; | |
71 | |
72 | |
1323 | 73 static ngx_str_t ngx_imap_auth_methods_names[] = { |
74 ngx_string("AUTH=PLAIN"), | |
75 ngx_string("AUTH=LOGIN"), | |
76 ngx_null_string, /* APOP */ | |
77 ngx_string("AUTH=CRAM-MD5") | |
78 }; | |
79 | |
80 | |
1136 | 81 static ngx_str_t ngx_smtp_auth_methods_names[] = { |
1174
6be5ee17d80b
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1136
diff
changeset
|
82 ngx_string("PLAIN"), |
1136 | 83 ngx_string("LOGIN"), |
84 ngx_null_string, /* APOP */ | |
85 ngx_string("CRAM-MD5") | |
86 }; | |
87 | |
88 | |
809 | 89 static ngx_str_t ngx_pop3_auth_plain_capability = |
90 ngx_string("+OK methods supported:" CRLF | |
91 "LOGIN" CRLF | |
92 "PLAIN" CRLF | |
93 "." CRLF); | |
94 | |
95 | |
96 static ngx_str_t ngx_pop3_auth_cram_md5_capability = | |
97 ngx_string("+OK methods supported:" CRLF | |
98 "LOGIN" CRLF | |
99 "PLAIN" CRLF | |
100 "CRAM-MD5" CRLF | |
101 "." CRLF); | |
102 | |
103 | |
104 | |
1136 | 105 static ngx_command_t ngx_mail_core_commands[] = { |
521 | 106 |
107 { ngx_string("server"), | |
1136 | 108 NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, |
109 ngx_mail_core_server, | |
521 | 110 0, |
111 0, | |
112 NULL }, | |
113 | |
114 { ngx_string("listen"), | |
1136 | 115 NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12, |
116 ngx_mail_core_listen, | |
521 | 117 0, |
118 0, | |
119 NULL }, | |
120 | |
121 { ngx_string("protocol"), | |
1136 | 122 NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
521 | 123 ngx_conf_set_enum_slot, |
1136 | 124 NGX_MAIL_SRV_CONF_OFFSET, |
125 offsetof(ngx_mail_core_srv_conf_t, protocol), | |
126 &ngx_mail_core_procotol }, | |
521 | 127 |
128 { ngx_string("imap_client_buffer"), | |
1136 | 129 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
521 | 130 ngx_conf_set_size_slot, |
1136 | 131 NGX_MAIL_SRV_CONF_OFFSET, |
132 offsetof(ngx_mail_core_srv_conf_t, imap_client_buffer_size), | |
521 | 133 NULL }, |
134 | |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
135 { ngx_string("smtp_client_buffer"), |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
136 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
137 ngx_conf_set_size_slot, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
138 NGX_MAIL_SRV_CONF_OFFSET, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
139 offsetof(ngx_mail_core_srv_conf_t, smtp_client_buffer_size), |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
140 NULL }, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
141 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
142 { ngx_string("smtp_greeting_delay"), |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
143 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
144 ngx_conf_set_msec_slot, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
145 NGX_MAIL_SRV_CONF_OFFSET, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
146 offsetof(ngx_mail_core_srv_conf_t, smtp_greeting_delay), |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
147 NULL }, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
148 |
587 | 149 { ngx_string("so_keepalive"), |
1136 | 150 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, |
587 | 151 ngx_conf_set_flag_slot, |
1136 | 152 NGX_MAIL_SRV_CONF_OFFSET, |
153 offsetof(ngx_mail_core_srv_conf_t, so_keepalive), | |
587 | 154 NULL }, |
155 | |
521 | 156 { ngx_string("timeout"), |
1136 | 157 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
521 | 158 ngx_conf_set_msec_slot, |
1136 | 159 NGX_MAIL_SRV_CONF_OFFSET, |
160 offsetof(ngx_mail_core_srv_conf_t, timeout), | |
521 | 161 NULL }, |
162 | |
527 | 163 { ngx_string("pop3_capabilities"), |
1136 | 164 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, |
165 ngx_mail_core_capability, | |
166 NGX_MAIL_SRV_CONF_OFFSET, | |
167 offsetof(ngx_mail_core_srv_conf_t, pop3_capabilities), | |
527 | 168 NULL }, |
169 | |
170 { ngx_string("imap_capabilities"), | |
1136 | 171 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, |
172 ngx_mail_core_capability, | |
173 NGX_MAIL_SRV_CONF_OFFSET, | |
174 offsetof(ngx_mail_core_srv_conf_t, imap_capabilities), | |
175 NULL }, | |
176 | |
177 { ngx_string("smtp_capabilities"), | |
178 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, | |
179 ngx_mail_core_capability, | |
180 NGX_MAIL_SRV_CONF_OFFSET, | |
181 offsetof(ngx_mail_core_srv_conf_t, smtp_capabilities), | |
527 | 182 NULL }, |
183 | |
800 | 184 { ngx_string("server_name"), |
1136 | 185 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, |
800 | 186 ngx_conf_set_str_slot, |
1136 | 187 NGX_MAIL_SRV_CONF_OFFSET, |
188 offsetof(ngx_mail_core_srv_conf_t, server_name), | |
800 | 189 NULL }, |
190 | |
191 { ngx_string("auth"), | |
1136 | 192 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, |
193 ngx_conf_set_bitmask_slot, | |
194 NGX_MAIL_SRV_CONF_OFFSET, | |
195 offsetof(ngx_mail_core_srv_conf_t, pop3_auth_methods), | |
196 &ngx_pop3_auth_methods }, | |
197 | |
198 { ngx_string("pop3_auth"), | |
199 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, | |
800 | 200 ngx_conf_set_bitmask_slot, |
1136 | 201 NGX_MAIL_SRV_CONF_OFFSET, |
202 offsetof(ngx_mail_core_srv_conf_t, pop3_auth_methods), | |
203 &ngx_pop3_auth_methods }, | |
204 | |
1323 | 205 { ngx_string("imap_auth"), |
206 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, | |
207 ngx_conf_set_bitmask_slot, | |
208 NGX_MAIL_SRV_CONF_OFFSET, | |
209 offsetof(ngx_mail_core_srv_conf_t, imap_auth_methods), | |
210 &ngx_imap_auth_methods }, | |
211 | |
1136 | 212 { ngx_string("smtp_auth"), |
213 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, | |
214 ngx_conf_set_bitmask_slot, | |
215 NGX_MAIL_SRV_CONF_OFFSET, | |
216 offsetof(ngx_mail_core_srv_conf_t, smtp_auth_methods), | |
217 &ngx_smtp_auth_methods }, | |
800 | 218 |
521 | 219 ngx_null_command |
220 }; | |
221 | |
222 | |
1136 | 223 static ngx_mail_module_t ngx_mail_core_module_ctx = { |
224 ngx_mail_core_create_main_conf, /* create main configuration */ | |
521 | 225 NULL, /* init main configuration */ |
226 | |
1136 | 227 ngx_mail_core_create_srv_conf, /* create server configuration */ |
228 ngx_mail_core_merge_srv_conf /* merge server configuration */ | |
521 | 229 }; |
230 | |
231 | |
1136 | 232 ngx_module_t ngx_mail_core_module = { |
521 | 233 NGX_MODULE_V1, |
1136 | 234 &ngx_mail_core_module_ctx, /* module context */ |
235 ngx_mail_core_commands, /* module directives */ | |
236 NGX_MAIL_MODULE, /* module type */ | |
541 | 237 NULL, /* init master */ |
521 | 238 NULL, /* init module */ |
541 | 239 NULL, /* init process */ |
240 NULL, /* init thread */ | |
241 NULL, /* exit thread */ | |
242 NULL, /* exit process */ | |
243 NULL, /* exit master */ | |
244 NGX_MODULE_V1_PADDING | |
521 | 245 }; |
246 | |
247 | |
248 static void * | |
1136 | 249 ngx_mail_core_create_main_conf(ngx_conf_t *cf) |
577 | 250 { |
1136 | 251 ngx_mail_core_main_conf_t *cmcf; |
521 | 252 |
1136 | 253 cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t)); |
521 | 254 if (cmcf == NULL) { |
255 return NGX_CONF_ERROR; | |
256 } | |
257 | |
258 if (ngx_array_init(&cmcf->servers, cf->pool, 4, | |
1136 | 259 sizeof(ngx_mail_core_srv_conf_t *)) |
641 | 260 != NGX_OK) |
261 { | |
262 return NGX_CONF_ERROR; | |
263 } | |
264 | |
1136 | 265 if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t)) |
641 | 266 != NGX_OK) |
521 | 267 { |
268 return NGX_CONF_ERROR; | |
269 } | |
270 | |
271 return cmcf; | |
272 } | |
273 | |
274 | |
275 static void * | |
1136 | 276 ngx_mail_core_create_srv_conf(ngx_conf_t *cf) |
577 | 277 { |
1136 | 278 ngx_mail_core_srv_conf_t *cscf; |
577 | 279 |
1136 | 280 cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t)); |
521 | 281 if (cscf == NULL) { |
527 | 282 return NULL; |
521 | 283 } |
284 | |
285 cscf->imap_client_buffer_size = NGX_CONF_UNSET_SIZE; | |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
286 cscf->smtp_client_buffer_size = NGX_CONF_UNSET_SIZE; |
587 | 287 cscf->protocol = NGX_CONF_UNSET_UINT; |
521 | 288 cscf->timeout = NGX_CONF_UNSET_MSEC; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
289 cscf->smtp_greeting_delay = NGX_CONF_UNSET_MSEC; |
587 | 290 cscf->so_keepalive = NGX_CONF_UNSET; |
521 | 291 |
527 | 292 if (ngx_array_init(&cscf->pop3_capabilities, cf->pool, 4, sizeof(ngx_str_t)) |
293 != NGX_OK) | |
294 { | |
295 return NULL; | |
296 } | |
297 | |
298 if (ngx_array_init(&cscf->imap_capabilities, cf->pool, 4, sizeof(ngx_str_t)) | |
299 != NGX_OK) | |
300 { | |
301 return NULL; | |
302 } | |
303 | |
1136 | 304 if (ngx_array_init(&cscf->smtp_capabilities, cf->pool, 4, sizeof(ngx_str_t)) |
305 != NGX_OK) | |
306 { | |
307 return NULL; | |
308 } | |
309 | |
521 | 310 return cscf; |
311 } | |
312 | |
313 | |
314 static char * | |
1136 | 315 ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) |
521 | 316 { |
1136 | 317 ngx_mail_core_srv_conf_t *prev = parent; |
318 ngx_mail_core_srv_conf_t *conf = child; | |
521 | 319 |
1322 | 320 u_char *p, *auth; |
1136 | 321 size_t size, stls_only_size; |
527 | 322 ngx_str_t *c, *d; |
1136 | 323 ngx_uint_t i, m; |
527 | 324 |
521 | 325 ngx_conf_merge_size_value(conf->imap_client_buffer_size, |
326 prev->imap_client_buffer_size, | |
327 (size_t) ngx_pagesize); | |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
328 ngx_conf_merge_size_value(conf->smtp_client_buffer_size, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
329 prev->smtp_client_buffer_size, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
330 (size_t) ngx_pagesize); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
331 |
521 | 332 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
333 ngx_conf_merge_msec_value(conf->smtp_greeting_delay, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
334 prev->smtp_greeting_delay, 0); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
335 |
663 | 336 ngx_conf_merge_uint_value(conf->protocol, prev->protocol, |
1136 | 337 NGX_MAIL_IMAP_PROTOCOL); |
587 | 338 ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0); |
521 | 339 |
1136 | 340 ngx_conf_merge_bitmask_value(conf->pop3_auth_methods, |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
341 prev->pop3_auth_methods, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
342 (NGX_CONF_BITMASK_SET |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
343 |NGX_MAIL_AUTH_PLAIN_ENABLED)); |
1136 | 344 |
1323 | 345 ngx_conf_merge_bitmask_value(conf->imap_auth_methods, |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
346 prev->imap_auth_methods, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
347 (NGX_CONF_BITMASK_SET |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
348 |NGX_MAIL_AUTH_PLAIN_ENABLED)); |
1323 | 349 |
1136 | 350 ngx_conf_merge_bitmask_value(conf->smtp_auth_methods, |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
351 prev->smtp_auth_methods, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
352 (NGX_CONF_BITMASK_SET |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
353 |NGX_MAIL_AUTH_PLAIN_ENABLED |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
354 |NGX_MAIL_AUTH_LOGIN_ENABLED)); |
800 | 355 |
356 | |
357 ngx_conf_merge_str_value(conf->server_name, prev->server_name, ""); | |
358 | |
359 if (conf->server_name.len == 0) { | |
360 conf->server_name.data = ngx_palloc(cf->pool, NGX_MAXHOSTNAMELEN); | |
361 if (conf->server_name.data == NULL) { | |
362 return NGX_CONF_ERROR; | |
363 } | |
364 | |
365 if (gethostname((char *) conf->server_name.data, NGX_MAXHOSTNAMELEN) | |
366 == -1) | |
367 { | |
368 ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, | |
369 "gethostname() failed"); | |
370 return NGX_CONF_ERROR; | |
371 } | |
372 | |
373 conf->server_name.len = ngx_strlen(conf->server_name.data); | |
374 } | |
375 | |
376 | |
527 | 377 if (conf->pop3_capabilities.nelts == 0) { |
378 conf->pop3_capabilities = prev->pop3_capabilities; | |
379 } | |
380 | |
381 if (conf->pop3_capabilities.nelts == 0) { | |
382 | |
383 for (d = ngx_pop3_default_capabilities; d->len; d++) { | |
384 c = ngx_array_push(&conf->pop3_capabilities); | |
385 if (c == NULL) { | |
386 return NGX_CONF_ERROR; | |
387 } | |
388 | |
389 *c = *d; | |
390 } | |
391 } | |
392 | |
393 size = sizeof("+OK Capability list follows" CRLF) - 1 | |
394 + sizeof("." CRLF) - 1; | |
395 | |
1136 | 396 stls_only_size = size + sizeof("STLS" CRLF) - 1; |
397 | |
527 | 398 c = conf->pop3_capabilities.elts; |
399 for (i = 0; i < conf->pop3_capabilities.nelts; i++) { | |
400 size += c[i].len + sizeof(CRLF) - 1; | |
1136 | 401 |
402 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { | |
403 continue; | |
404 } | |
405 | |
406 stls_only_size += c[i].len + sizeof(CRLF) - 1; | |
527 | 407 } |
408 | |
1136 | 409 if (conf->pop3_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { |
809 | 410 size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1; |
411 | |
412 } else { | |
413 size += sizeof("SASL LOGIN PLAIN" CRLF) - 1; | |
414 } | |
415 | |
583 | 416 p = ngx_palloc(cf->pool, size); |
417 if (p == NULL) { | |
527 | 418 return NGX_CONF_ERROR; |
419 } | |
420 | |
583 | 421 conf->pop3_capability.len = size; |
422 conf->pop3_capability.data = p; | |
423 | |
424 p = ngx_cpymem(p, "+OK Capability list follows" CRLF, | |
425 sizeof("+OK Capability list follows" CRLF) - 1); | |
527 | 426 |
427 for (i = 0; i < conf->pop3_capabilities.nelts; i++) { | |
583 | 428 p = ngx_cpymem(p, c[i].data, c[i].len); |
429 *p++ = CR; *p++ = LF; | |
527 | 430 } |
431 | |
1136 | 432 if (conf->pop3_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { |
809 | 433 p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF, |
434 sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1); | |
435 | |
436 } else { | |
437 p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF, | |
438 sizeof("SASL LOGIN PLAIN" CRLF) - 1); | |
439 } | |
440 | |
583 | 441 *p++ = '.'; *p++ = CR; *p = LF; |
442 | |
443 | |
444 size += sizeof("STLS" CRLF) - 1; | |
527 | 445 |
583 | 446 p = ngx_palloc(cf->pool, size); |
447 if (p == NULL) { | |
448 return NGX_CONF_ERROR; | |
449 } | |
450 | |
451 conf->pop3_starttls_capability.len = size; | |
452 conf->pop3_starttls_capability.data = p; | |
453 | |
454 p = ngx_cpymem(p, conf->pop3_capability.data, | |
455 conf->pop3_capability.len - (sizeof("." CRLF) - 1)); | |
456 | |
457 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); | |
458 *p++ = '.'; *p++ = CR; *p = LF; | |
527 | 459 |
460 | |
1136 | 461 if (conf->pop3_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { |
809 | 462 conf->pop3_auth_capability = ngx_pop3_auth_cram_md5_capability; |
463 | |
464 } else { | |
465 conf->pop3_auth_capability = ngx_pop3_auth_plain_capability; | |
466 } | |
467 | |
468 | |
1136 | 469 p = ngx_palloc(cf->pool, stls_only_size); |
470 if (p == NULL) { | |
471 return NGX_CONF_ERROR; | |
472 } | |
473 | |
474 conf->pop3_starttls_only_capability.len = stls_only_size; | |
475 conf->pop3_starttls_only_capability.data = p; | |
476 | |
477 p = ngx_cpymem(p, "+OK Capability list follows" CRLF, | |
478 sizeof("+OK Capability list follows" CRLF) - 1); | |
479 | |
480 for (i = 0; i < conf->pop3_capabilities.nelts; i++) { | |
481 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { | |
482 continue; | |
483 } | |
484 | |
485 p = ngx_cpymem(p, c[i].data, c[i].len); | |
486 *p++ = CR; *p++ = LF; | |
487 } | |
488 | |
489 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); | |
490 *p++ = '.'; *p++ = CR; *p = LF; | |
491 | |
492 | |
527 | 493 if (conf->imap_capabilities.nelts == 0) { |
494 conf->imap_capabilities = prev->imap_capabilities; | |
495 } | |
496 | |
497 if (conf->imap_capabilities.nelts == 0) { | |
498 | |
499 for (d = ngx_imap_default_capabilities; d->len; d++) { | |
500 c = ngx_array_push(&conf->imap_capabilities); | |
501 if (c == NULL) { | |
502 return NGX_CONF_ERROR; | |
503 } | |
504 | |
505 *c = *d; | |
506 } | |
507 } | |
508 | |
1136 | 509 size = sizeof("* CAPABILITY" CRLF) - 1; |
527 | 510 |
511 c = conf->imap_capabilities.elts; | |
512 for (i = 0; i < conf->imap_capabilities.nelts; i++) { | |
513 size += 1 + c[i].len; | |
514 } | |
515 | |
1323 | 516 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; |
517 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; | |
518 m <<= 1, i++) | |
519 { | |
520 if (m & conf->imap_auth_methods) { | |
521 size += 1 + ngx_imap_auth_methods_names[i].len; | |
522 } | |
523 } | |
524 | |
583 | 525 p = ngx_palloc(cf->pool, size); |
526 if (p == NULL) { | |
527 return NGX_CONF_ERROR; | |
528 } | |
529 | |
530 conf->imap_capability.len = size; | |
531 conf->imap_capability.data = p; | |
532 | |
533 p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1); | |
534 | |
535 for (i = 0; i < conf->imap_capabilities.nelts; i++) { | |
536 *p++ = ' '; | |
537 p = ngx_cpymem(p, c[i].data, c[i].len); | |
538 } | |
539 | |
1323 | 540 auth = p; |
541 | |
542 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; | |
543 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; | |
544 m <<= 1, i++) | |
545 { | |
546 if (m & conf->imap_auth_methods) { | |
547 *p++ = ' '; | |
548 p = ngx_cpymem(p, ngx_imap_auth_methods_names[i].data, | |
549 ngx_imap_auth_methods_names[i].len); | |
550 } | |
551 } | |
552 | |
583 | 553 *p++ = CR; *p = LF; |
554 | |
555 | |
556 size += sizeof(" STARTTLS") - 1; | |
557 | |
558 p = ngx_palloc(cf->pool, size); | |
559 if (p == NULL) { | |
527 | 560 return NGX_CONF_ERROR; |
561 } | |
562 | |
583 | 563 conf->imap_starttls_capability.len = size; |
564 conf->imap_starttls_capability.data = p; | |
527 | 565 |
583 | 566 p = ngx_cpymem(p, conf->imap_capability.data, |
567 conf->imap_capability.len - (sizeof(CRLF) - 1)); | |
568 p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1); | |
569 *p++ = CR; *p = LF; | |
570 | |
571 | |
1323 | 572 size = (auth - conf->imap_capability.data) + sizeof(CRLF) - 1 |
573 + sizeof(" STARTTLS LOGINDISABLED") - 1; | |
583 | 574 |
575 p = ngx_palloc(cf->pool, size); | |
576 if (p == NULL) { | |
577 return NGX_CONF_ERROR; | |
527 | 578 } |
579 | |
583 | 580 conf->imap_starttls_only_capability.len = size; |
581 conf->imap_starttls_only_capability.data = p; | |
527 | 582 |
1323 | 583 p = ngx_cpymem(p, conf->imap_capability.data, |
584 auth - conf->imap_capability.data); | |
585 p = ngx_cpymem(p, " STARTTLS LOGINDISABLED", | |
586 sizeof(" STARTTLS LOGINDISABLED") - 1); | |
583 | 587 *p++ = CR; *p = LF; |
588 | |
527 | 589 |
1136 | 590 size = sizeof("220 ESMTP ready" CRLF) - 1 + conf->server_name.len; |
591 | |
592 p = ngx_palloc(cf->pool, size); | |
593 if (p == NULL) { | |
594 return NGX_CONF_ERROR; | |
595 } | |
596 | |
597 conf->smtp_greeting.len = size; | |
598 conf->smtp_greeting.data = p; | |
599 | |
600 *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' '; | |
601 p = ngx_cpymem(p, conf->server_name.data, conf->server_name.len); | |
602 ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1); | |
603 | |
604 | |
605 size = sizeof("250 " CRLF) - 1 + conf->server_name.len; | |
606 | |
607 p = ngx_palloc(cf->pool, size); | |
608 if (p == NULL) { | |
609 return NGX_CONF_ERROR; | |
610 } | |
611 | |
612 conf->smtp_server_name.len = size; | |
613 conf->smtp_server_name.data = p; | |
614 | |
615 *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; | |
616 p = ngx_cpymem(p, conf->server_name.data, conf->server_name.len); | |
617 *p++ = CR; *p = LF; | |
618 | |
619 | |
620 if (conf->smtp_capabilities.nelts == 0) { | |
621 conf->smtp_capabilities = prev->smtp_capabilities; | |
622 } | |
623 | |
624 size = sizeof("250-") - 1 + conf->server_name.len + sizeof(CRLF) - 1 | |
625 + sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1; | |
626 | |
627 c = conf->smtp_capabilities.elts; | |
628 for (i = 0; i < conf->smtp_capabilities.nelts; i++) { | |
629 size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1; | |
630 } | |
631 | |
632 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; | |
633 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; | |
634 m <<= 1, i++) | |
635 { | |
636 if (m & conf->smtp_auth_methods) { | |
637 size += 1 + ngx_smtp_auth_methods_names[i].len; | |
638 } | |
639 } | |
640 | |
641 p = ngx_palloc(cf->pool, size); | |
642 if (p == NULL) { | |
643 return NGX_CONF_ERROR; | |
644 } | |
645 | |
646 conf->smtp_capability.len = size; | |
647 conf->smtp_capability.data = p; | |
648 | |
649 *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; | |
650 p = ngx_cpymem(p, conf->server_name.data, conf->server_name.len); | |
651 *p++ = CR; *p++ = LF; | |
652 | |
653 for (i = 0; i < conf->smtp_capabilities.nelts; i++) { | |
654 *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; | |
655 p = ngx_cpymem(p, c[i].data, c[i].len); | |
656 *p++ = CR; *p++ = LF; | |
657 } | |
658 | |
1322 | 659 auth = p; |
660 | |
1136 | 661 *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; |
662 *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H'; | |
663 | |
664 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; | |
665 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; | |
666 m <<= 1, i++) | |
667 { | |
668 if (m & conf->smtp_auth_methods) { | |
669 *p++ = ' '; | |
670 p = ngx_cpymem(p, ngx_smtp_auth_methods_names[i].data, | |
671 ngx_smtp_auth_methods_names[i].len); | |
672 } | |
673 } | |
674 | |
675 *p++ = CR; *p = LF; | |
676 | |
1322 | 677 size += sizeof("250 STARTTLS" CRLF) - 1; |
678 | |
679 p = ngx_palloc(cf->pool, size); | |
680 if (p == NULL) { | |
681 return NGX_CONF_ERROR; | |
682 } | |
683 | |
684 conf->smtp_starttls_capability.len = size; | |
685 conf->smtp_starttls_capability.data = p; | |
686 | |
687 p = ngx_cpymem(p, conf->smtp_capability.data, | |
688 conf->smtp_capability.len); | |
689 | |
690 p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); | |
691 *p++ = CR; *p = LF; | |
692 | |
693 p = conf->smtp_starttls_capability.data | |
694 + (auth - conf->smtp_capability.data) + 3; | |
695 *p = '-'; | |
696 | |
697 size = (auth - conf->smtp_capability.data) | |
698 + sizeof("250 STARTTLS" CRLF) - 1; | |
699 | |
700 p = ngx_palloc(cf->pool, size); | |
701 if (p == NULL) { | |
702 return NGX_CONF_ERROR; | |
703 } | |
704 | |
705 conf->smtp_starttls_only_capability.len = size; | |
706 conf->smtp_starttls_only_capability.data = p; | |
707 | |
708 p = ngx_cpymem(p, conf->smtp_capability.data, | |
709 auth - conf->smtp_capability.data); | |
710 | |
711 ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); | |
712 | |
521 | 713 return NGX_CONF_OK; |
714 } | |
715 | |
716 | |
717 static char * | |
1136 | 718 ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
521 | 719 { |
720 char *rv; | |
721 void *mconf; | |
722 ngx_uint_t m; | |
723 ngx_conf_t pcf; | |
1136 | 724 ngx_mail_module_t *module; |
725 ngx_mail_conf_ctx_t *ctx, *mail_ctx; | |
726 ngx_mail_core_srv_conf_t *cscf, **cscfp; | |
727 ngx_mail_core_main_conf_t *cmcf; | |
521 | 728 |
729 | |
1136 | 730 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t)); |
521 | 731 if (ctx == NULL) { |
732 return NGX_CONF_ERROR; | |
733 } | |
734 | |
1136 | 735 mail_ctx = cf->ctx; |
736 ctx->main_conf = mail_ctx->main_conf; | |
577 | 737 |
521 | 738 /* the server{}'s srv_conf */ |
739 | |
1136 | 740 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module); |
521 | 741 if (ctx->srv_conf == NULL) { |
742 return NGX_CONF_ERROR; | |
743 } | |
744 | |
745 for (m = 0; ngx_modules[m]; m++) { | |
1136 | 746 if (ngx_modules[m]->type != NGX_MAIL_MODULE) { |
521 | 747 continue; |
748 } | |
749 | |
750 module = ngx_modules[m]->ctx; | |
751 | |
752 if (module->create_srv_conf) { | |
753 mconf = module->create_srv_conf(cf); | |
754 if (mconf == NULL) { | |
755 return NGX_CONF_ERROR; | |
756 } | |
757 | |
758 ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf; | |
759 } | |
760 } | |
761 | |
762 /* the server configuration context */ | |
763 | |
1136 | 764 cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index]; |
521 | 765 cscf->ctx = ctx; |
766 | |
1136 | 767 cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index]; |
521 | 768 |
769 cscfp = ngx_array_push(&cmcf->servers); | |
770 if (cscfp == NULL) { | |
771 return NGX_CONF_ERROR; | |
772 } | |
773 | |
774 *cscfp = cscf; | |
775 | |
776 | |
777 /* parse inside server{} */ | |
778 | |
779 pcf = *cf; | |
780 cf->ctx = ctx; | |
1136 | 781 cf->cmd_type = NGX_MAIL_SRV_CONF; |
521 | 782 |
783 rv = ngx_conf_parse(cf, NULL); | |
784 | |
785 *cf = pcf; | |
786 | |
787 return rv; | |
788 } | |
789 | |
790 | |
791 /* AF_INET only */ | |
792 | |
793 static char * | |
1136 | 794 ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
521 | 795 { |
641 | 796 ngx_str_t *value; |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
797 ngx_url_t u; |
641 | 798 ngx_uint_t i; |
1136 | 799 ngx_mail_listen_t *imls; |
800 ngx_mail_core_main_conf_t *cmcf; | |
521 | 801 |
802 value = cf->args->elts; | |
803 | |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
804 ngx_memzero(&u, sizeof(ngx_url_t)); |
521 | 805 |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
806 u.url = value[1]; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
807 u.listen = 1; |
619 | 808 |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
809 if (ngx_parse_url(cf, &u) != NGX_OK) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
810 if (u.err) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
811 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
812 "%s in \"%V\" of the \"listen\" directive", |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
813 u.err, &u.url); |
521 | 814 } |
815 | |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
816 return NGX_CONF_ERROR; |
521 | 817 } |
818 | |
1136 | 819 cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module); |
521 | 820 |
641 | 821 imls = cmcf->listen.elts; |
822 | |
823 for (i = 0; i < cmcf->listen.nelts; i++) { | |
824 | |
906 | 825 if (imls[i].addr != u.addr.in_addr || imls[i].port != u.port) { |
641 | 826 continue; |
827 } | |
828 | |
829 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
830 "duplicate \"%V\" address and port pair", &u.url); |
577 | 831 return NGX_CONF_ERROR; |
521 | 832 } |
833 | |
641 | 834 imls = ngx_array_push(&cmcf->listen); |
835 if (imls == NULL) { | |
836 return NGX_CONF_ERROR; | |
837 } | |
563 | 838 |
1136 | 839 ngx_memzero(imls, sizeof(ngx_mail_listen_t)); |
641 | 840 |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
800
diff
changeset
|
841 imls->addr = u.addr.in_addr; |
906 | 842 imls->port = u.port; |
641 | 843 imls->family = AF_INET; |
844 imls->ctx = cf->ctx; | |
521 | 845 |
641 | 846 if (cf->args->nelts == 2) { |
847 return NGX_CONF_OK; | |
848 } | |
521 | 849 |
641 | 850 if (ngx_strcmp(value[2].data, "bind") == 0) { |
851 imls->bind = 1; | |
852 return NGX_CONF_OK; | |
853 } | |
521 | 854 |
641 | 855 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
856 "the invalid \"%V\" parameter", &value[2]); | |
857 return NGX_CONF_ERROR; | |
521 | 858 } |
527 | 859 |
860 | |
861 static char * | |
1136 | 862 ngx_mail_core_capability(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
527 | 863 { |
864 char *p = conf; | |
865 | |
866 ngx_str_t *c, *value; | |
867 ngx_uint_t i; | |
868 ngx_array_t *a; | |
869 | |
870 a = (ngx_array_t *) (p + cmd->offset); | |
871 | |
872 value = cf->args->elts; | |
873 | |
874 for (i = 1; i < cf->args->nelts; i++) { | |
875 c = ngx_array_push(a); | |
876 if (c == NULL) { | |
877 return NGX_CONF_ERROR; | |
878 } | |
879 | |
880 *c = value[i]; | |
881 } | |
882 | |
883 return NGX_CONF_OK; | |
884 } |