Mercurial > hg > nginx
annotate src/mail/ngx_mail_pop3_module.c @ 6774:bcb107bb89cd
Mail: support SASL EXTERNAL (RFC 4422).
This is needed to allow TLS client certificate auth to work. With
ssl_verify_client configured, the auth daemon can choose to allow the
connection to proceed based on the certificate data.
This has been tested with Thunderbird for IMAP only. I've not yet found a
client that will do client certificate auth for POP3 or SMTP, and the method is
not really documented anywhere that I can find. That said, its simple enough
that the way I've done is probably right.
author | Rob N ★ <robn@fastmail.com> |
---|---|
date | Sat, 08 Oct 2016 18:05:00 +1100 |
parents | 73b451d304c0 |
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 } |