Mercurial > hg > nginx
annotate src/imap/ngx_imap_handler.c @ 1107:db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 14 Feb 2007 18:51:19 +0000 |
parents | f88651afad40 |
children | 109e8c7d7cc1 |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
5 |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
6 |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_core.h> |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_event.h> |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
10 #include <ngx_imap.h> |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
11 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
12 |
547 | 13 static void ngx_imap_init_session(ngx_connection_t *c); |
541 | 14 static void ngx_imap_init_protocol(ngx_event_t *rev); |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
15 static ngx_int_t ngx_imap_decode_auth_plain(ngx_imap_session_t *s, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
16 ngx_str_t *encoded); |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
17 static void ngx_imap_do_auth(ngx_imap_session_t *s); |
527 | 18 static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s); |
541 | 19 static u_char *ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len); |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
20 |
539 | 21 #if (NGX_IMAP_SSL) |
583 | 22 static void ngx_imap_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c); |
547 | 23 static void ngx_imap_ssl_handshake_handler(ngx_connection_t *c); |
539 | 24 #endif |
25 | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
26 |
521 | 27 static ngx_str_t greetings[] = { |
527 | 28 ngx_string("+OK POP3 ready" CRLF), |
529 | 29 ngx_string("* OK IMAP4 ready" CRLF) |
521 | 30 }; |
31 | |
525 | 32 static ngx_str_t internal_server_errors[] = { |
33 ngx_string("-ERR internal server error" CRLF), | |
34 ngx_string("* BAD internal server error" CRLF), | |
35 }; | |
36 | |
521 | 37 static u_char pop3_ok[] = "+OK" CRLF; |
809 | 38 static u_char pop3_next[] = "+ " CRLF; |
39 static u_char pop3_username[] = "+ VXNlcm5hbWU6" CRLF; | |
40 static u_char pop3_password[] = "+ UGFzc3dvcmQ6" CRLF; | |
521 | 41 static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF; |
42 | |
543 | 43 static u_char imap_star[] = "* "; |
529 | 44 static u_char imap_ok[] = "OK completed" CRLF; |
527 | 45 static u_char imap_next[] = "+ OK" CRLF; |
46 static u_char imap_bye[] = "* BYE" CRLF; | |
47 static u_char imap_invalid_command[] = "BAD invalid command" CRLF; | |
48 | |
521 | 49 |
50 void | |
51 ngx_imap_init_connection(ngx_connection_t *c) | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
52 { |
641 | 53 in_addr_t in_addr; |
54 socklen_t len; | |
55 ngx_uint_t i; | |
56 struct sockaddr_in sin; | |
57 ngx_imap_log_ctx_t *ctx; | |
58 ngx_imap_in_port_t *imip; | |
59 ngx_imap_in_addr_t *imia; | |
60 ngx_imap_session_t *s; | |
543 | 61 #if (NGX_IMAP_SSL) |
583 | 62 ngx_imap_ssl_conf_t *sslcf; |
543 | 63 #endif |
541 | 64 |
641 | 65 |
66 /* find the server configuration for the address:port */ | |
67 | |
68 /* AF_INET only */ | |
69 | |
70 imip = c->listening->servers; | |
71 imia = imip->addrs; | |
72 | |
73 i = 0; | |
74 | |
75 if (imip->naddrs > 1) { | |
76 | |
77 /* | |
78 * There are several addresses on this port and one of them | |
79 * is the "*:port" wildcard so getsockname() is needed to determine | |
80 * the server address. | |
81 * | |
82 * AcceptEx() already gave this address. | |
83 */ | |
84 | |
85 #if (NGX_WIN32) | |
86 if (c->local_sockaddr) { | |
87 in_addr = | |
88 ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr; | |
541 | 89 |
641 | 90 } else |
91 #endif | |
92 { | |
93 len = sizeof(struct sockaddr_in); | |
94 if (getsockname(c->fd, (struct sockaddr *) &sin, &len) == -1) { | |
95 ngx_connection_error(c, ngx_socket_errno, | |
96 "getsockname() failed"); | |
97 ngx_imap_close_connection(c); | |
98 return; | |
99 } | |
100 | |
101 in_addr = sin.sin_addr.s_addr; | |
102 } | |
103 | |
104 /* the last address is "*" */ | |
105 | |
106 for ( /* void */ ; i < imip->naddrs - 1; i++) { | |
107 if (in_addr == imia[i].addr) { | |
108 break; | |
109 } | |
110 } | |
111 } | |
112 | |
113 | |
114 s = ngx_pcalloc(c->pool, sizeof(ngx_imap_session_t)); | |
115 if (s == NULL) { | |
541 | 116 ngx_imap_close_connection(c); |
117 return; | |
577 | 118 } |
541 | 119 |
641 | 120 s->main_conf = imia[i].ctx->main_conf; |
121 s->srv_conf = imia[i].ctx->srv_conf; | |
122 | |
123 s->addr_text = &imia[i].addr_text; | |
124 | |
125 c->data = s; | |
126 s->connection = c; | |
127 | |
128 ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V", | |
129 c->number, &c->addr_text, s->addr_text); | |
130 | |
131 ctx = ngx_palloc(c->pool, sizeof(ngx_imap_log_ctx_t)); | |
132 if (ctx == NULL) { | |
133 ngx_imap_close_connection(c); | |
134 return; | |
135 } | |
136 | |
137 ctx->client = &c->addr_text; | |
138 ctx->session = s; | |
541 | 139 |
140 c->log->connection = c->number; | |
141 c->log->handler = ngx_imap_log_error; | |
641 | 142 c->log->data = ctx; |
541 | 143 c->log->action = "sending client greeting line"; |
144 | |
145 c->log_error = NGX_ERROR_INFO; | |
146 | |
543 | 147 #if (NGX_IMAP_SSL) |
148 | |
641 | 149 sslcf = ngx_imap_get_module_srv_conf(s, ngx_imap_ssl_module); |
543 | 150 |
151 if (sslcf->enable) { | |
583 | 152 ngx_imap_ssl_init_connection(&sslcf->ssl, c); |
547 | 153 return; |
543 | 154 } |
155 | |
156 #endif | |
157 | |
547 | 158 ngx_imap_init_session(c); |
541 | 159 } |
160 | |
161 | |
547 | 162 #if (NGX_IMAP_SSL) |
163 | |
541 | 164 static void |
583 | 165 ngx_imap_starttls_handler(ngx_event_t *rev) |
166 { | |
167 ngx_connection_t *c; | |
168 ngx_imap_session_t *s; | |
169 ngx_imap_ssl_conf_t *sslcf; | |
170 | |
171 c = rev->data; | |
172 s = c->data; | |
641 | 173 s->starttls = 1; |
583 | 174 |
175 c->log->action = "in starttls state"; | |
176 | |
177 sslcf = ngx_imap_get_module_srv_conf(s, ngx_imap_ssl_module); | |
178 | |
179 ngx_imap_ssl_init_connection(&sslcf->ssl, c); | |
180 } | |
181 | |
182 | |
183 static void | |
184 ngx_imap_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c) | |
185 { | |
641 | 186 ngx_imap_session_t *s; |
583 | 187 ngx_imap_core_srv_conf_t *cscf; |
188 | |
189 if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) { | |
190 ngx_imap_close_connection(c); | |
191 return; | |
192 } | |
193 | |
194 if (ngx_ssl_handshake(c) == NGX_AGAIN) { | |
195 | |
641 | 196 s = c->data; |
197 | |
198 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
583 | 199 |
200 ngx_add_timer(c->read, cscf->timeout); | |
201 | |
202 c->ssl->handler = ngx_imap_ssl_handshake_handler; | |
203 | |
204 return; | |
205 } | |
206 | |
207 ngx_imap_ssl_handshake_handler(c); | |
208 } | |
209 | |
210 | |
211 static void | |
547 | 212 ngx_imap_ssl_handshake_handler(ngx_connection_t *c) |
577 | 213 { |
641 | 214 ngx_imap_session_t *s; |
215 | |
547 | 216 if (c->ssl->handshaked) { |
583 | 217 |
641 | 218 s = c->data; |
219 | |
220 if (s->starttls) { | |
583 | 221 c->read->handler = ngx_imap_init_protocol; |
222 c->write->handler = ngx_imap_send; | |
223 | |
224 ngx_imap_init_protocol(c->read); | |
225 | |
226 return; | |
227 } | |
228 | |
547 | 229 ngx_imap_init_session(c); |
230 return; | |
231 } | |
232 | |
233 ngx_imap_close_connection(c); | |
234 } | |
235 | |
236 #endif | |
237 | |
238 | |
239 static void | |
240 ngx_imap_init_session(ngx_connection_t *c) | |
541 | 241 { |
800 | 242 u_char *p; |
539 | 243 ngx_imap_session_t *s; |
541 | 244 ngx_imap_core_srv_conf_t *cscf; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
245 |
547 | 246 c->read->handler = ngx_imap_init_protocol; |
247 c->write->handler = ngx_imap_send; | |
539 | 248 |
641 | 249 s = c->data; |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
250 |
641 | 251 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
539 | 252 |
253 s->protocol = cscf->protocol; | |
254 | |
255 s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_imap_max_module); | |
256 if (s->ctx == NULL) { | |
257 ngx_imap_session_internal_server_error(s); | |
258 return; | |
259 } | |
260 | |
261 s->out = greetings[s->protocol]; | |
262 | |
800 | 263 if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED) |
264 && s->protocol == NGX_IMAP_POP3_PROTOCOL) | |
265 { | |
266 s->salt.data = ngx_palloc(c->pool, | |
267 sizeof(" <18446744073709551616.@>" CRLF) - 1 | |
268 + NGX_TIME_T_LEN | |
269 + cscf->server_name.len); | |
270 if (s->salt.data == NULL) { | |
271 ngx_imap_session_internal_server_error(s); | |
272 return; | |
273 } | |
274 | |
275 s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF, | |
276 ngx_random(), ngx_time(), &cscf->server_name) | |
277 - s->salt.data; | |
278 | |
279 s->out.data = ngx_palloc(c->pool, greetings[0].len + 1 + s->salt.len); | |
280 if (s->out.data == NULL) { | |
281 ngx_imap_session_internal_server_error(s); | |
282 return; | |
283 } | |
284 | |
285 p = ngx_cpymem(s->out.data, greetings[0].data, greetings[0].len - 2); | |
286 *p++ = ' '; | |
287 p = ngx_cpymem(p, s->salt.data, s->salt.len); | |
288 | |
289 s->out.len = p - s->out.data; | |
290 } | |
291 | |
547 | 292 ngx_add_timer(c->read, cscf->timeout); |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
293 |
547 | 294 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
295 ngx_imap_close_connection(c); |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
296 } |
539 | 297 |
298 ngx_imap_send(c->write); | |
299 } | |
300 | |
301 | |
302 void | |
303 ngx_imap_send(ngx_event_t *wev) | |
304 { | |
541 | 305 ngx_int_t n; |
306 ngx_connection_t *c; | |
307 ngx_imap_session_t *s; | |
308 ngx_imap_core_srv_conf_t *cscf; | |
539 | 309 |
310 c = wev->data; | |
311 s = c->data; | |
312 | |
313 if (wev->timedout) { | |
314 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); | |
577 | 315 c->timedout = 1; |
539 | 316 ngx_imap_close_connection(c); |
317 return; | |
318 } | |
319 | |
320 if (s->out.len == 0) { | |
321 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { | |
322 ngx_imap_close_connection(c); | |
323 } | |
324 | |
325 return; | |
326 } | |
327 | |
328 n = c->send(c, s->out.data, s->out.len); | |
329 | |
330 if (n > 0) { | |
331 s->out.len -= n; | |
332 | |
541 | 333 if (wev->timer_set) { |
334 ngx_del_timer(wev); | |
335 } | |
336 | |
539 | 337 if (s->quit) { |
338 ngx_imap_close_connection(c); | |
339 return; | |
340 } | |
341 | |
342 if (s->blocked) { | |
343 c->read->handler(c->read); | |
344 } | |
345 | |
346 return; | |
347 } | |
348 | |
349 if (n == NGX_ERROR) { | |
350 ngx_imap_close_connection(c); | |
351 return; | |
352 } | |
353 | |
354 /* n == NGX_AGAIN */ | |
355 | |
541 | 356 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
357 | |
358 ngx_add_timer(c->write, cscf->timeout); | |
359 | |
539 | 360 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { |
361 ngx_imap_close_connection(c); | |
362 return; | |
363 } | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
364 } |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
365 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
366 |
521 | 367 static void |
541 | 368 ngx_imap_init_protocol(ngx_event_t *rev) |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
369 { |
521 | 370 size_t size; |
371 ngx_connection_t *c; | |
372 ngx_imap_session_t *s; | |
373 ngx_imap_core_srv_conf_t *cscf; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
374 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
375 c = rev->data; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
376 |
541 | 377 c->log->action = "in auth state"; |
378 | |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
379 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
380 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
577 | 381 c->timedout = 1; |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
382 ngx_imap_close_connection(c); |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
383 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
384 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
385 |
539 | 386 s = c->data; |
521 | 387 |
539 | 388 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) { |
521 | 389 size = 128; |
527 | 390 s->imap_state = ngx_pop3_start; |
521 | 391 c->read->handler = ngx_pop3_auth_state; |
392 | |
393 } else { | |
539 | 394 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
521 | 395 size = cscf->imap_client_buffer_size; |
527 | 396 s->imap_state = ngx_imap_start; |
521 | 397 c->read->handler = ngx_imap_auth_state; |
398 } | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
399 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
400 if (s->buffer == NULL) { |
583 | 401 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) |
402 == NGX_ERROR) | |
403 { | |
404 ngx_imap_session_internal_server_error(s); | |
405 return; | |
406 } | |
407 | |
408 s->buffer = ngx_create_temp_buf(c->pool, size); | |
409 if (s->buffer == NULL) { | |
410 ngx_imap_session_internal_server_error(s); | |
411 return; | |
412 } | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
413 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
414 |
521 | 415 c->read->handler(rev); |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
416 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
417 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
418 |
527 | 419 void |
521 | 420 ngx_imap_auth_state(ngx_event_t *rev) |
421 { | |
543 | 422 u_char *text, *last, *p, *dst, *src, *end; |
539 | 423 ssize_t text_len, last_len; |
527 | 424 ngx_str_t *arg; |
425 ngx_int_t rc; | |
543 | 426 ngx_uint_t tag, i; |
527 | 427 ngx_connection_t *c; |
428 ngx_imap_session_t *s; | |
429 ngx_imap_core_srv_conf_t *cscf; | |
583 | 430 #if (NGX_IMAP_SSL) |
431 ngx_imap_ssl_conf_t *sslcf; | |
432 #endif | |
521 | 433 |
434 c = rev->data; | |
527 | 435 s = c->data; |
521 | 436 |
527 | 437 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth state"); |
438 | |
439 if (rev->timedout) { | |
440 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); | |
577 | 441 c->timedout = 1; |
527 | 442 ngx_imap_close_connection(c); |
443 return; | |
444 } | |
445 | |
539 | 446 if (s->out.len) { |
447 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap send handler busy"); | |
448 s->blocked = 1; | |
449 return; | |
450 } | |
451 | |
452 s->blocked = 0; | |
453 | |
527 | 454 rc = ngx_imap_read_command(s); |
455 | |
456 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth: %i", rc); | |
457 | |
458 if (rc == NGX_AGAIN || rc == NGX_ERROR) { | |
459 return; | |
460 } | |
461 | |
462 tag = 1; | |
463 | |
464 text = NULL; | |
465 text_len = 0; | |
466 | |
467 last = imap_ok; | |
468 last_len = sizeof(imap_ok) - 1; | |
469 | |
470 if (rc == NGX_OK) { | |
471 | |
472 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth command: %i", | |
473 s->command); | |
474 | |
543 | 475 if (s->backslash) { |
476 | |
477 arg = s->args.elts; | |
478 | |
479 for (i = 0; i < s->args.nelts; i++) { | |
480 dst = arg[i].data; | |
481 end = dst + arg[i].len; | |
482 | |
483 for (src = dst; src < end; dst++) { | |
484 *dst = *src; | |
485 if (*src++ == '\\') { | |
486 *dst = *src++; | |
487 } | |
488 } | |
489 | |
490 arg[i].len = dst - arg[i].data; | |
491 } | |
492 | |
493 s->backslash = 0; | |
494 } | |
495 | |
527 | 496 switch (s->command) { |
497 | |
498 case NGX_IMAP_LOGIN: | |
583 | 499 |
500 #if (NGX_IMAP_SSL) | |
501 | |
502 if (c->ssl == NULL) { | |
503 sslcf = ngx_imap_get_module_srv_conf(s, ngx_imap_ssl_module); | |
504 | |
505 if (sslcf->starttls == NGX_IMAP_STARTTLS_ONLY) { | |
506 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
507 break; | |
508 } | |
509 } | |
510 #endif | |
511 | |
569 | 512 arg = s->args.elts; |
527 | 513 |
569 | 514 if (s->args.nelts == 2 && arg[0].len) { |
527 | 515 |
516 s->login.len = arg[0].len; | |
517 s->login.data = ngx_palloc(c->pool, s->login.len); | |
518 if (s->login.data == NULL) { | |
519 ngx_imap_session_internal_server_error(s); | |
520 return; | |
521 } | |
522 | |
523 ngx_memcpy(s->login.data, arg[0].data, s->login.len); | |
524 | |
525 s->passwd.len = arg[1].len; | |
526 s->passwd.data = ngx_palloc(c->pool, s->passwd.len); | |
527 if (s->passwd.data == NULL) { | |
528 ngx_imap_session_internal_server_error(s); | |
529 return; | |
530 } | |
531 | |
532 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); | |
533 | |
547 | 534 #if (NGX_DEBUG_IMAP_PASSWD) |
527 | 535 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, |
536 "imap login:\"%V\" passwd:\"%V\"", | |
537 &s->login, &s->passwd); | |
547 | 538 #else |
539 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
540 "imap login:\"%V\"", &s->login); | |
541 #endif | |
527 | 542 |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
543 ngx_imap_do_auth(s); |
527 | 544 return; |
545 } | |
546 | |
809 | 547 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
527 | 548 break; |
549 | |
550 case NGX_IMAP_CAPABILITY: | |
551 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
583 | 552 |
553 #if (NGX_IMAP_SSL) | |
554 | |
555 if (c->ssl == NULL) { | |
556 sslcf = ngx_imap_get_module_srv_conf(s, ngx_imap_ssl_module); | |
557 | |
558 if (sslcf->starttls == NGX_IMAP_STARTTLS_ON) { | |
559 text_len = cscf->imap_starttls_capability.len; | |
560 text = cscf->imap_starttls_capability.data; | |
561 break; | |
562 } | |
563 | |
564 if (sslcf->starttls == NGX_IMAP_STARTTLS_ONLY) { | |
565 text_len = cscf->imap_starttls_only_capability.len; | |
566 text = cscf->imap_starttls_only_capability.data; | |
567 break; | |
568 } | |
569 } | |
570 #endif | |
571 | |
572 text_len = cscf->imap_capability.len; | |
573 text = cscf->imap_capability.data; | |
527 | 574 break; |
575 | |
576 case NGX_IMAP_LOGOUT: | |
539 | 577 s->quit = 1; |
527 | 578 text = imap_bye; |
579 text_len = sizeof(imap_bye) - 1; | |
580 break; | |
581 | |
582 case NGX_IMAP_NOOP: | |
583 break; | |
584 | |
583 | 585 #if (NGX_IMAP_SSL) |
586 | |
587 case NGX_IMAP_STARTTLS: | |
588 if (c->ssl == NULL) { | |
589 sslcf = ngx_imap_get_module_srv_conf(s, ngx_imap_ssl_module); | |
590 if (sslcf->starttls) { | |
591 c->read->handler = ngx_imap_starttls_handler; | |
592 break; | |
593 } | |
594 } | |
595 | |
596 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
597 break; | |
598 #endif | |
599 | |
527 | 600 default: |
601 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
602 break; | |
603 } | |
604 | |
605 } else if (rc == NGX_IMAP_NEXT) { | |
606 last = imap_next; | |
607 last_len = sizeof(imap_next) - 1; | |
608 tag = 0; | |
609 } | |
610 | |
611 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { | |
612 last = imap_invalid_command; | |
613 last_len = sizeof(imap_invalid_command) - 1; | |
614 } | |
615 | |
616 if (tag) { | |
543 | 617 if (s->tag.len == 0) { |
618 s->tag.len = sizeof(imap_star) - 1; | |
619 s->tag.data = (u_char *) imap_star; | |
620 } | |
621 | |
539 | 622 if (s->tagged_line.len < s->tag.len + text_len + last_len) { |
623 s->tagged_line.len = s->tag.len + text_len + last_len; | |
624 s->tagged_line.data = ngx_palloc(c->pool, s->tagged_line.len); | |
625 if (s->tagged_line.data == NULL) { | |
527 | 626 ngx_imap_close_connection(c); |
627 return; | |
628 } | |
629 } | |
630 | |
539 | 631 s->out.data = s->tagged_line.data; |
632 s->out.len = s->tag.len + text_len + last_len; | |
633 | |
634 p = s->out.data; | |
527 | 635 |
636 if (text) { | |
637 p = ngx_cpymem(p, text, text_len); | |
638 } | |
639 p = ngx_cpymem(p, s->tag.data, s->tag.len); | |
640 ngx_memcpy(p, last, last_len); | |
641 | |
642 | |
643 } else { | |
539 | 644 s->out.data = last; |
645 s->out.len = last_len; | |
527 | 646 } |
647 | |
539 | 648 if (rc != NGX_IMAP_NEXT) { |
649 s->args.nelts = 0; | |
650 s->buffer->pos = s->buffer->start; | |
651 s->buffer->last = s->buffer->start; | |
652 s->tag.len = 0; | |
527 | 653 } |
654 | |
539 | 655 ngx_imap_send(c->write); |
521 | 656 } |
657 | |
658 | |
527 | 659 void |
521 | 660 ngx_pop3_auth_state(ngx_event_t *rev) |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
661 { |
809 | 662 u_char *text, *p, *last; |
527 | 663 ssize_t size; |
664 ngx_int_t rc; | |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
665 ngx_str_t *arg, salt; |
527 | 666 ngx_connection_t *c; |
667 ngx_imap_session_t *s; | |
668 ngx_imap_core_srv_conf_t *cscf; | |
583 | 669 #if (NGX_IMAP_SSL) |
670 ngx_imap_ssl_conf_t *sslcf; | |
671 #endif | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
672 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
673 c = rev->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
674 s = c->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
675 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
676 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "pop3 auth state"); |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
677 |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
678 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
679 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
577 | 680 c->timedout = 1; |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
681 ngx_imap_close_connection(c); |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
682 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
683 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
684 |
539 | 685 if (s->out.len) { |
686 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap send handler busy"); | |
687 s->blocked = 1; | |
688 return; | |
689 } | |
690 | |
691 s->blocked = 0; | |
692 | |
527 | 693 rc = ngx_imap_read_command(s); |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
694 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
695 if (rc == NGX_AGAIN || rc == NGX_ERROR) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
696 return; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
697 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
698 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
699 text = pop3_ok; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
700 size = sizeof(pop3_ok) - 1; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
701 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
702 if (rc == NGX_OK) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
703 switch (s->imap_state) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
704 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
705 case ngx_pop3_start: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
706 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
707 switch (s->command) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
708 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
709 case NGX_POP3_USER: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
710 if (s->args.nelts == 1) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
711 s->imap_state = ngx_pop3_user; |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
712 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
713 arg = s->args.elts; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
714 s->login.len = arg[0].len; |
527 | 715 s->login.data = ngx_palloc(c->pool, s->login.len); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
716 if (s->login.data == NULL) { |
527 | 717 ngx_imap_session_internal_server_error(s); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
718 return; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
719 } |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
720 |
527 | 721 ngx_memcpy(s->login.data, arg[0].data, s->login.len); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
722 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
723 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
527 | 724 "pop3 login: \"%V\"", &s->login); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
725 |
809 | 726 break; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
727 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
728 |
809 | 729 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
730 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
731 |
527 | 732 case NGX_POP3_CAPA: |
733 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
583 | 734 |
735 #if (NGX_IMAP_SSL) | |
736 | |
737 if (c->ssl == NULL) { | |
738 sslcf = ngx_imap_get_module_srv_conf(s, | |
739 ngx_imap_ssl_module); | |
740 if (sslcf->starttls) { | |
741 size = cscf->pop3_starttls_capability.len; | |
742 text = cscf->pop3_starttls_capability.data; | |
743 break; | |
744 } | |
745 } | |
746 #endif | |
747 | |
748 size = cscf->pop3_capability.len; | |
749 text = cscf->pop3_capability.data; | |
527 | 750 break; |
751 | |
800 | 752 case NGX_POP3_APOP: |
753 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
754 | |
755 if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED) | |
756 && s->args.nelts == 2) | |
757 { | |
758 arg = s->args.elts; | |
759 | |
760 s->login.len = arg[0].len; | |
761 s->login.data = ngx_palloc(c->pool, s->login.len); | |
762 if (s->login.data == NULL) { | |
763 ngx_imap_session_internal_server_error(s); | |
764 return; | |
765 } | |
766 | |
767 ngx_memcpy(s->login.data, arg[0].data, s->login.len); | |
768 | |
769 s->passwd.len = arg[1].len; | |
770 s->passwd.data = ngx_palloc(c->pool, s->passwd.len); | |
771 if (s->passwd.data == NULL) { | |
772 ngx_imap_session_internal_server_error(s); | |
773 return; | |
774 } | |
775 | |
776 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); | |
777 | |
778 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
779 "pop3 apop: \"%V\" \"%V\"", | |
780 &s->login, &s->passwd); | |
781 | |
782 s->auth_method = NGX_IMAP_AUTH_APOP; | |
783 | |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
784 ngx_imap_do_auth(s); |
800 | 785 return; |
809 | 786 } |
800 | 787 |
809 | 788 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
789 break; | |
790 | |
791 case NGX_POP3_AUTH: | |
792 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
793 | |
794 if (s->args.nelts == 0) { | |
795 size = cscf->pop3_auth_capability.len; | |
796 text = cscf->pop3_auth_capability.data; | |
810 | 797 s->state = 0; |
809 | 798 break; |
799 } | |
800 | |
801 arg = s->args.elts; | |
802 | |
803 if (arg[0].len == 5) { | |
804 | |
1107
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
805 if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
806 == 0) |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
807 { |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
808 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
809 if (s->args.nelts != 1) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
810 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
811 break; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
812 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
813 |
809 | 814 s->imap_state = ngx_pop3_auth_login_username; |
815 | |
816 size = sizeof(pop3_username) - 1; | |
817 text = pop3_username; | |
818 | |
819 break; | |
820 | |
1107
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
821 } else if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
822 5) |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
823 == 0) |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
824 { |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
825 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
826 if (s->args.nelts == 1) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
827 s->imap_state = ngx_pop3_auth_plain; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
828 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
829 size = sizeof(pop3_next) - 1; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
830 text = pop3_next; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
831 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
832 break; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
833 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
834 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
835 if (s->args.nelts == 2) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
836 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
837 /* |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
838 * workaround for Eudora for Mac: it sends |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
839 * AUTH PLAIN [base64 encoded] |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
840 */ |
809 | 841 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
842 rc = ngx_imap_decode_auth_plain(s, &arg[1]); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
843 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
844 if (rc == NGX_OK) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
845 ngx_imap_do_auth(s); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
846 return; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
847 } |
809 | 848 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
849 if (rc == NGX_ERROR) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
850 ngx_imap_session_internal_server_error(s); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
851 return; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
852 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
853 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
854 /* rc == NGX_IMAP_PARSE_INVALID_COMMAND */ |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
855 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
856 break; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
857 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
858 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
859 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
809 | 860 break; |
861 } | |
862 | |
863 } else if (arg[0].len == 8 | |
1107
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
864 && ngx_strncasecmp(arg[0].data, |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
865 (u_char *) "CRAM-MD5", 8) |
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
1025
diff
changeset
|
866 == 0) |
809 | 867 { |
868 s->imap_state = ngx_pop3_auth_cram_md5; | |
869 | |
870 text = ngx_palloc(c->pool, | |
871 sizeof("+ " CRLF) - 1 | |
872 + ngx_base64_encoded_length(s->salt.len)); | |
873 if (text == NULL) { | |
874 ngx_imap_session_internal_server_error(s); | |
875 return; | |
876 } | |
877 | |
878 text[0] = '+'; text[1]= ' '; | |
879 salt.data = &text[2]; | |
880 s->salt.len -= 2; | |
881 | |
882 ngx_encode_base64(&salt, &s->salt); | |
883 | |
884 s->salt.len += 2; | |
885 size = 2 + salt.len; | |
886 text[size++] = CR; text[size++] = LF; | |
887 | |
888 break; | |
889 } | |
890 | |
891 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
800 | 892 break; |
893 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
894 case NGX_POP3_QUIT: |
539 | 895 s->quit = 1; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
896 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
897 |
527 | 898 case NGX_POP3_NOOP: |
899 break; | |
900 | |
583 | 901 #if (NGX_IMAP_SSL) |
902 | |
903 case NGX_POP3_STLS: | |
904 if (c->ssl == NULL) { | |
905 sslcf = ngx_imap_get_module_srv_conf(s, | |
906 ngx_imap_ssl_module); | |
907 if (sslcf->starttls) { | |
908 c->read->handler = ngx_imap_starttls_handler; | |
909 break; | |
910 } | |
911 } | |
912 | |
913 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
914 break; | |
915 #endif | |
916 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
917 default: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
918 s->imap_state = ngx_pop3_start; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
919 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
920 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
921 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
922 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
923 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
924 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
925 case ngx_pop3_user: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
926 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
927 switch (s->command) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
928 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
929 case NGX_POP3_PASS: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
930 if (s->args.nelts == 1) { |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
931 arg = s->args.elts; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
932 s->passwd.len = arg[0].len; |
527 | 933 s->passwd.data = ngx_palloc(c->pool, s->passwd.len); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
934 if (s->passwd.data == NULL) { |
527 | 935 ngx_imap_session_internal_server_error(s); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
936 return; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
937 } |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
938 |
527 | 939 ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
940 |
547 | 941 #if (NGX_DEBUG_IMAP_PASSWD) |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
942 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
527 | 943 "pop3 passwd: \"%V\"", &s->passwd); |
547 | 944 #endif |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
945 |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
946 ngx_imap_do_auth(s); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
947 return; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
948 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
949 |
809 | 950 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
951 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
952 |
527 | 953 case NGX_POP3_CAPA: |
954 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
583 | 955 size = cscf->pop3_capability.len; |
956 text = cscf->pop3_capability.data; | |
527 | 957 break; |
958 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
959 case NGX_POP3_QUIT: |
539 | 960 s->quit = 1; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
961 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
962 |
527 | 963 case NGX_POP3_NOOP: |
964 break; | |
965 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
966 default: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
967 s->imap_state = ngx_pop3_start; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
968 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
969 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
970 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
971 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
972 break; |
527 | 973 |
974 /* suppress warinings */ | |
975 case ngx_pop3_passwd: | |
976 break; | |
809 | 977 |
978 case ngx_pop3_auth_login_username: | |
979 arg = s->args.elts; | |
980 s->imap_state = ngx_pop3_auth_login_password; | |
981 | |
982 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
983 "pop3 auth login username: \"%V\"", &arg[0]); | |
984 | |
985 s->login.data = ngx_palloc(c->pool, | |
986 ngx_base64_decoded_length(arg[0].len)); | |
987 if (s->login.data == NULL){ | |
988 ngx_imap_session_internal_server_error(s); | |
989 return; | |
990 } | |
991 | |
992 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { | |
993 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
994 "client sent invalid base64 encoding " | |
995 "in AUTH LOGIN command"); | |
810 | 996 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
997 break; | |
809 | 998 } |
999 | |
1000 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
1001 "pop3 auth login username: \"%V\"", &s->login); | |
1002 | |
1003 size = sizeof(pop3_password) - 1; | |
1004 text = pop3_password; | |
1005 | |
1006 break; | |
1007 | |
1008 case ngx_pop3_auth_login_password: | |
1009 arg = s->args.elts; | |
1010 | |
1011 #if (NGX_DEBUG_IMAP_PASSWD) | |
1012 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
1013 "pop3 auth login password: \"%V\"", &arg[0]); | |
1014 #endif | |
1015 | |
1016 s->passwd.data = ngx_palloc(c->pool, | |
1017 ngx_base64_decoded_length(arg[0].len)); | |
1018 if (s->passwd.data == NULL){ | |
1019 ngx_imap_session_internal_server_error(s); | |
1020 return; | |
1021 } | |
1022 | |
1023 if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) { | |
1024 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1025 "client sent invalid base64 encoding " | |
1026 "in AUTH LOGIN command"); | |
810 | 1027 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
1028 break; | |
809 | 1029 } |
1030 | |
1031 #if (NGX_DEBUG_IMAP_PASSWD) | |
1032 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
1033 "pop3 auth login password: \"%V\"", &s->passwd); | |
1034 #endif | |
1035 | |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1036 ngx_imap_do_auth(s); |
809 | 1037 return; |
1038 | |
1039 case ngx_pop3_auth_plain: | |
1040 arg = s->args.elts; | |
1041 | |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1042 rc = ngx_imap_decode_auth_plain(s, &arg[0]); |
809 | 1043 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1044 if (rc == NGX_OK) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1045 ngx_imap_do_auth(s); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1046 return; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1047 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1048 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1049 if (rc == NGX_ERROR) { |
809 | 1050 ngx_imap_session_internal_server_error(s); |
1051 return; | |
1052 } | |
1053 | |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1054 /* rc == NGX_IMAP_PARSE_INVALID_COMMAND */ |
809 | 1055 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1056 break; |
809 | 1057 |
1058 case ngx_pop3_auth_cram_md5: | |
1059 arg = s->args.elts; | |
1060 | |
1061 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
1062 "pop3 auth cram-md5: \"%V\"", &arg[0]); | |
1063 | |
1064 s->login.data = ngx_palloc(c->pool, | |
1065 ngx_base64_decoded_length(arg[0].len)); | |
1066 if (s->login.data == NULL){ | |
1067 ngx_imap_session_internal_server_error(s); | |
1068 return; | |
1069 } | |
1070 | |
1071 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { | |
1072 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1073 "client sent invalid base64 encoding " | |
810 | 1074 "in AUTH CRAM-MD5 command"); |
1075 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
1076 break; | |
809 | 1077 } |
1078 | |
1079 p = s->login.data; | |
1080 last = p + s->login.len; | |
1081 | |
1082 while (p < last) { | |
1083 if (*p++ == ' ') { | |
1084 s->login.len = p - s->login.data - 1; | |
1085 s->passwd.len = last - p; | |
1086 s->passwd.data = p; | |
1087 break; | |
1088 } | |
1089 } | |
1090 | |
810 | 1091 if (s->passwd.len != 32) { |
1092 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1093 "client sent invalid CRAM-MD5 hash " | |
1094 "in AUTH CRAM-MD5 command"); | |
1095 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
1096 break; | |
1097 } | |
1098 | |
809 | 1099 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, |
1100 "pop3 auth cram-md5: \"%V\" \"%V\"", | |
1101 &s->login, &s->passwd); | |
1102 | |
1103 s->auth_method = NGX_IMAP_AUTH_CRAM_MD5; | |
1104 | |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1105 ngx_imap_do_auth(s); |
809 | 1106 return; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
1107 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
1108 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1109 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1110 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { |
810 | 1111 s->imap_state = ngx_pop3_start; |
1112 s->state = 0; | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1113 text = pop3_invalid_command; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1114 size = sizeof(pop3_invalid_command) - 1; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1115 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1116 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
1117 s->args.nelts = 0; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
1118 s->buffer->pos = s->buffer->start; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
1119 s->buffer->last = s->buffer->start; |
539 | 1120 |
810 | 1121 if (s->state) { |
1122 s->arg_start = s->buffer->start; | |
1123 } | |
1124 | |
539 | 1125 s->out.data = text; |
1126 s->out.len = size; | |
1127 | |
1128 ngx_imap_send(c->write); | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1129 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1130 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1131 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1132 static ngx_int_t |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1133 ngx_imap_decode_auth_plain(ngx_imap_session_t *s, ngx_str_t *encoded) |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1134 { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1135 u_char *p, *last; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1136 ngx_str_t plain; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1137 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1138 #if (NGX_DEBUG_IMAP_PASSWD) |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1139 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, s->connection->log, 0, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1140 "pop3 auth plain: \"%V\"", encoded); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1141 #endif |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1142 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1143 plain.data = ngx_palloc(s->connection->pool, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1144 ngx_base64_decoded_length(encoded->len)); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1145 if (plain.data == NULL){ |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1146 return NGX_ERROR; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1147 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1148 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1149 if (ngx_decode_base64(&plain, encoded) != NGX_OK) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1150 ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1151 "client sent invalid base64 encoding " |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1152 "in AUTH PLAIN command"); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1153 return NGX_IMAP_PARSE_INVALID_COMMAND; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1154 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1155 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1156 p = plain.data; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1157 last = p + plain.len; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1158 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1159 while (p < last && *p++) { /* void */ } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1160 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1161 if (p == last) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1162 ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1163 "client sent invalid login in AUTH PLAIN command"); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1164 return NGX_IMAP_PARSE_INVALID_COMMAND; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1165 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1166 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1167 s->login.data = p; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1168 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1169 while (p < last && *p) { p++; } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1170 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1171 if (p == last) { |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1172 ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1173 "client sent invalid password in AUTH PLAIN command"); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1174 return NGX_IMAP_PARSE_INVALID_COMMAND; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1175 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1176 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1177 s->login.len = p++ - s->login.data; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1178 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1179 s->passwd.len = last - p; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1180 s->passwd.data = p; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1181 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1182 #if (NGX_DEBUG_IMAP_PASSWD) |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1183 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, s->connection->log, 0, |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1184 "pop3 auth plain: \"%V\" \"%V\"", |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1185 &s->login, &s->passwd); |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1186 #endif |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1187 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1188 return NGX_OK; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1189 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1190 |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
1191 |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1192 static void |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1193 ngx_imap_do_auth(ngx_imap_session_t *s) |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1194 { |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1195 s->args.nelts = 0; |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1196 s->buffer->pos = s->buffer->start; |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1197 s->buffer->last = s->buffer->start; |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1198 s->state = 0; |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1199 |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1200 if (s->connection->read->timer_set) { |
1025 | 1201 ngx_del_timer(s->connection->read); |
855
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1202 } |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1203 |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1204 s->login_attempt++; |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1205 |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1206 ngx_imap_auth_http_init(s); |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1207 } |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1208 |
b006f30d6a2f
count s->login_attempt for POP3, minimize code
Igor Sysoev <igor@sysoev.ru>
parents:
851
diff
changeset
|
1209 |
521 | 1210 static ngx_int_t |
527 | 1211 ngx_imap_read_command(ngx_imap_session_t *s) |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1212 { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1213 ssize_t n; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1214 ngx_int_t rc; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1215 |
539 | 1216 n = s->connection->recv(s->connection, s->buffer->last, |
1217 s->buffer->end - s->buffer->last); | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1218 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1219 if (n == NGX_ERROR || n == 0) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1220 ngx_imap_close_connection(s->connection); |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1221 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1222 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1223 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1224 if (n > 0) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1225 s->buffer->last += n; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1226 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1227 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1228 if (n == NGX_AGAIN) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1229 if (ngx_handle_read_event(s->connection->read, 0) == NGX_ERROR) { |
527 | 1230 ngx_imap_session_internal_server_error(s); |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1231 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1232 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1233 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1234 return NGX_AGAIN; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1235 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1236 |
527 | 1237 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) { |
1238 rc = ngx_pop3_parse_command(s); | |
1239 } else { | |
1240 rc = ngx_imap_parse_command(s); | |
1241 } | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1242 |
527 | 1243 if (rc == NGX_AGAIN |
1244 || rc == NGX_IMAP_NEXT | |
1245 || rc == NGX_IMAP_PARSE_INVALID_COMMAND) | |
1246 { | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1247 return rc; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1248 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1249 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1250 if (rc == NGX_ERROR) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1251 ngx_imap_close_connection(s->connection); |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1252 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1253 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1254 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1255 return NGX_OK; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1256 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1257 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
1258 |
521 | 1259 void |
525 | 1260 ngx_imap_session_internal_server_error(ngx_imap_session_t *s) |
1261 { | |
539 | 1262 s->out = internal_server_errors[s->protocol]; |
1263 s->quit = 1; | |
525 | 1264 |
539 | 1265 ngx_imap_send(s->connection->write); |
525 | 1266 } |
1267 | |
1268 | |
1269 void | |
521 | 1270 ngx_imap_close_connection(ngx_connection_t *c) |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1271 { |
479 | 1272 ngx_pool_t *pool; |
1273 | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1274 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1275 "close imap connection: %d", c->fd); |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1276 |
539 | 1277 #if (NGX_IMAP_SSL) |
1278 | |
1279 if (c->ssl) { | |
1280 if (ngx_ssl_shutdown(c) == NGX_AGAIN) { | |
577 | 1281 c->ssl->handler = ngx_imap_close_connection; |
539 | 1282 return; |
1283 } | |
1284 } | |
1285 | |
1286 #endif | |
1287 | |
583 | 1288 c->destroyed = 1; |
543 | 1289 |
479 | 1290 pool = c->pool; |
1291 | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1292 ngx_close_connection(c); |
479 | 1293 |
501 | 1294 ngx_destroy_pool(pool); |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
1295 } |
539 | 1296 |
1297 | |
541 | 1298 static u_char * |
1299 ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len) | |
1300 { | |
567 | 1301 u_char *p; |
1302 ngx_imap_session_t *s; | |
1303 ngx_imap_log_ctx_t *ctx; | |
541 | 1304 |
1305 if (log->action) { | |
1306 p = ngx_snprintf(buf, len, " while %s", log->action); | |
1307 len -= p - buf; | |
1308 buf = p; | |
1309 } | |
577 | 1310 |
541 | 1311 ctx = log->data; |
1312 | |
1313 p = ngx_snprintf(buf, len, ", client: %V", ctx->client); | |
1314 len -= p - buf; | |
1315 buf = p; | |
1316 | |
1317 s = ctx->session; | |
1318 | |
1319 if (s == NULL) { | |
1320 return p; | |
1321 } | |
1322 | |
641 | 1323 p = ngx_snprintf(buf, len, ", server: %V", s->addr_text); |
541 | 1324 len -= p - buf; |
1325 buf = p; | |
1326 | |
1327 if (s->login.len == 0) { | |
1328 return p; | |
1329 } | |
1330 | |
1331 p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login); | |
1332 len -= p - buf; | |
1333 buf = p; | |
1334 | |
1335 if (s->proxy == NULL) { | |
1336 return p; | |
1337 } | |
1338 | |
884 | 1339 p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name); |
541 | 1340 |
1341 return p; | |
1342 } |