Mercurial > hg > nginx-quic
annotate src/imap/ngx_imap_handler.c @ 569:174f1e853e1e release-0.3.6
nginx-0.3.6-RELEASE import
*) Change: now the IMAP/POP3 proxy do not send the empty login to
authorization server.
*) Feature: the "log_format" supports the variables in the $name form.
*) Bugfix: if at least in one server was no the "listen" directive,
then nginx did not listen on the 80 port; the bug had appeared in
0.3.3.
*) Bugfix: if the URI part is omitted in "proxy_pass" directive, the
the 80 port was always used.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 24 Oct 2005 15:09:41 +0000 |
parents | 1af2fcb3be8a |
children | 4d9ea73a627a |
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); |
527 | 15 static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s); |
541 | 16 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
|
17 |
539 | 18 #if (NGX_IMAP_SSL) |
547 | 19 static void ngx_imap_ssl_handshake_handler(ngx_connection_t *c); |
539 | 20 static void ngx_imap_ssl_close_handler(ngx_event_t *ev); |
21 #endif | |
22 | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
23 |
521 | 24 static ngx_str_t greetings[] = { |
527 | 25 ngx_string("+OK POP3 ready" CRLF), |
529 | 26 ngx_string("* OK IMAP4 ready" CRLF) |
521 | 27 }; |
28 | |
525 | 29 static ngx_str_t internal_server_errors[] = { |
30 ngx_string("-ERR internal server error" CRLF), | |
31 ngx_string("* BAD internal server error" CRLF), | |
32 }; | |
33 | |
521 | 34 static u_char pop3_ok[] = "+OK" CRLF; |
35 static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF; | |
36 | |
543 | 37 static u_char imap_star[] = "* "; |
529 | 38 static u_char imap_ok[] = "OK completed" CRLF; |
527 | 39 static u_char imap_next[] = "+ OK" CRLF; |
40 static u_char imap_bye[] = "* BYE" CRLF; | |
41 static u_char imap_invalid_command[] = "BAD invalid command" CRLF; | |
42 | |
521 | 43 |
44 void | |
45 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
|
46 { |
547 | 47 ngx_imap_log_ctx_t *lctx; |
543 | 48 #if (NGX_IMAP_SSL) |
547 | 49 ngx_imap_conf_ctx_t *ctx; |
50 ngx_imap_ssl_conf_t *sslcf; | |
51 ngx_imap_core_srv_conf_t *cscf; | |
543 | 52 #endif |
541 | 53 |
547 | 54 ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V", |
55 c->number, &c->addr_text, &c->listening->addr_text); | |
541 | 56 |
543 | 57 lctx = ngx_palloc(c->pool, sizeof(ngx_imap_log_ctx_t)); |
58 if (lctx == NULL) { | |
541 | 59 ngx_imap_close_connection(c); |
60 return; | |
61 } | |
62 | |
543 | 63 lctx->client = &c->addr_text; |
64 lctx->session = NULL; | |
541 | 65 |
66 c->log->connection = c->number; | |
67 c->log->handler = ngx_imap_log_error; | |
543 | 68 c->log->data = lctx; |
541 | 69 c->log->action = "sending client greeting line"; |
70 | |
71 c->log_error = NGX_ERROR_INFO; | |
72 | |
543 | 73 #if (NGX_IMAP_SSL) |
74 | |
75 ctx = c->ctx; | |
76 sslcf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_ssl_module); | |
77 | |
78 if (sslcf->enable) { | |
547 | 79 if (ngx_ssl_create_connection(&sslcf->ssl, c, 0) == NGX_ERROR) { |
543 | 80 ngx_imap_close_connection(c); |
81 return; | |
82 } | |
83 | |
547 | 84 if (ngx_ssl_handshake(c) == NGX_AGAIN) { |
85 | |
86 cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module); | |
87 | |
88 ngx_add_timer(c->read, cscf->timeout); | |
89 | |
90 c->ssl->handler = ngx_imap_ssl_handshake_handler; | |
91 | |
92 return; | |
93 } | |
94 | |
95 ngx_imap_ssl_handshake_handler(c); | |
96 return; | |
543 | 97 } |
98 | |
99 #endif | |
100 | |
547 | 101 ngx_imap_init_session(c); |
541 | 102 } |
103 | |
104 | |
547 | 105 #if (NGX_IMAP_SSL) |
106 | |
541 | 107 static void |
547 | 108 ngx_imap_ssl_handshake_handler(ngx_connection_t *c) |
109 { | |
110 if (c->ssl->handshaked) { | |
111 ngx_imap_init_session(c); | |
112 return; | |
113 } | |
114 | |
115 ngx_imap_close_connection(c); | |
116 return; | |
117 } | |
118 | |
119 #endif | |
120 | |
121 | |
122 static void | |
123 ngx_imap_init_session(ngx_connection_t *c) | |
541 | 124 { |
539 | 125 ngx_imap_session_t *s; |
541 | 126 ngx_imap_log_ctx_t *lctx; |
521 | 127 ngx_imap_conf_ctx_t *ctx; |
541 | 128 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
|
129 |
547 | 130 c->read->handler = ngx_imap_init_protocol; |
131 c->write->handler = ngx_imap_send; | |
539 | 132 |
133 s = ngx_pcalloc(c->pool, sizeof(ngx_imap_session_t)); | |
134 if (s == NULL) { | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
135 ngx_imap_close_connection(c); |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
136 return; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
137 } |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
138 |
547 | 139 ctx = c->ctx; |
140 cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module); | |
141 | |
539 | 142 c->data = s; |
143 s->connection = c; | |
144 | |
145 s->protocol = cscf->protocol; | |
146 | |
147 s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_imap_max_module); | |
148 if (s->ctx == NULL) { | |
149 ngx_imap_session_internal_server_error(s); | |
150 return; | |
151 } | |
152 | |
153 s->main_conf = ctx->main_conf; | |
154 s->srv_conf = ctx->srv_conf; | |
155 | |
156 s->out = greetings[s->protocol]; | |
157 | |
541 | 158 lctx = c->log->data; |
159 lctx->session = s; | |
160 | |
547 | 161 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
|
162 |
547 | 163 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
|
164 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
|
165 } |
539 | 166 |
167 ngx_imap_send(c->write); | |
168 } | |
169 | |
170 | |
171 void | |
172 ngx_imap_send(ngx_event_t *wev) | |
173 { | |
541 | 174 ngx_int_t n; |
175 ngx_connection_t *c; | |
176 ngx_imap_session_t *s; | |
177 ngx_imap_core_srv_conf_t *cscf; | |
539 | 178 |
179 c = wev->data; | |
180 s = c->data; | |
181 | |
182 if (wev->timedout) { | |
183 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); | |
184 ngx_imap_close_connection(c); | |
185 return; | |
186 } | |
187 | |
188 if (s->out.len == 0) { | |
189 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { | |
190 ngx_imap_close_connection(c); | |
191 } | |
192 | |
193 return; | |
194 } | |
195 | |
196 n = c->send(c, s->out.data, s->out.len); | |
197 | |
198 if (n > 0) { | |
199 s->out.len -= n; | |
200 | |
541 | 201 if (wev->timer_set) { |
202 ngx_del_timer(wev); | |
203 } | |
204 | |
539 | 205 if (s->quit) { |
206 ngx_imap_close_connection(c); | |
207 return; | |
208 } | |
209 | |
210 if (s->blocked) { | |
211 c->read->handler(c->read); | |
212 } | |
213 | |
214 return; | |
215 } | |
216 | |
217 if (n == NGX_ERROR) { | |
218 ngx_imap_close_connection(c); | |
219 return; | |
220 } | |
221 | |
222 /* n == NGX_AGAIN */ | |
223 | |
541 | 224 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
225 | |
226 ngx_add_timer(c->write, cscf->timeout); | |
227 | |
539 | 228 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { |
229 ngx_imap_close_connection(c); | |
230 return; | |
231 } | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
232 } |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
233 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
234 |
521 | 235 static void |
541 | 236 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
|
237 { |
521 | 238 size_t size; |
239 ngx_connection_t *c; | |
240 ngx_imap_session_t *s; | |
241 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
|
242 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
243 c = rev->data; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
244 |
541 | 245 c->log->action = "in auth state"; |
246 | |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
247 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
248 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
249 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
|
250 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
251 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
252 |
539 | 253 s = c->data; |
521 | 254 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
255 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) { |
527 | 256 ngx_imap_session_internal_server_error(s); |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
257 return; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
258 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
259 |
539 | 260 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) { |
521 | 261 size = 128; |
527 | 262 s->imap_state = ngx_pop3_start; |
521 | 263 c->read->handler = ngx_pop3_auth_state; |
264 | |
265 } else { | |
539 | 266 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
521 | 267 size = cscf->imap_client_buffer_size; |
527 | 268 s->imap_state = ngx_imap_start; |
521 | 269 c->read->handler = ngx_imap_auth_state; |
270 } | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
271 |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
272 s->buffer = ngx_create_temp_buf(c->pool, size); |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
273 if (s->buffer == NULL) { |
527 | 274 ngx_imap_session_internal_server_error(s); |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
275 return; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
276 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
418
diff
changeset
|
277 |
521 | 278 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
|
279 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
280 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
281 |
527 | 282 void |
521 | 283 ngx_imap_auth_state(ngx_event_t *rev) |
284 { | |
543 | 285 u_char *text, *last, *p, *dst, *src, *end; |
539 | 286 ssize_t text_len, last_len; |
527 | 287 ngx_str_t *arg; |
288 ngx_int_t rc; | |
543 | 289 ngx_uint_t tag, i; |
527 | 290 ngx_connection_t *c; |
291 ngx_imap_session_t *s; | |
292 ngx_imap_core_srv_conf_t *cscf; | |
521 | 293 |
294 c = rev->data; | |
527 | 295 s = c->data; |
521 | 296 |
527 | 297 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth state"); |
298 | |
299 if (rev->timedout) { | |
300 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); | |
301 ngx_imap_close_connection(c); | |
302 return; | |
303 } | |
304 | |
539 | 305 if (s->out.len) { |
306 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap send handler busy"); | |
307 s->blocked = 1; | |
308 return; | |
309 } | |
310 | |
311 s->blocked = 0; | |
312 | |
527 | 313 rc = ngx_imap_read_command(s); |
314 | |
315 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth: %i", rc); | |
316 | |
317 if (rc == NGX_AGAIN || rc == NGX_ERROR) { | |
318 return; | |
319 } | |
320 | |
321 tag = 1; | |
322 | |
323 text = NULL; | |
324 text_len = 0; | |
325 | |
326 last = imap_ok; | |
327 last_len = sizeof(imap_ok) - 1; | |
328 | |
329 if (rc == NGX_OK) { | |
330 | |
331 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap auth command: %i", | |
332 s->command); | |
333 | |
543 | 334 if (s->backslash) { |
335 | |
336 arg = s->args.elts; | |
337 | |
338 for (i = 0; i < s->args.nelts; i++) { | |
339 dst = arg[i].data; | |
340 end = dst + arg[i].len; | |
341 | |
342 for (src = dst; src < end; dst++) { | |
343 *dst = *src; | |
344 if (*src++ == '\\') { | |
345 *dst = *src++; | |
346 } | |
347 } | |
348 | |
349 arg[i].len = dst - arg[i].data; | |
350 } | |
351 | |
352 s->backslash = 0; | |
353 } | |
354 | |
527 | 355 switch (s->command) { |
356 | |
357 case NGX_IMAP_LOGIN: | |
569 | 358 arg = s->args.elts; |
527 | 359 |
569 | 360 if (s->args.nelts == 2 && arg[0].len) { |
527 | 361 |
362 s->login.len = arg[0].len; | |
363 s->login.data = ngx_palloc(c->pool, s->login.len); | |
364 if (s->login.data == NULL) { | |
365 ngx_imap_session_internal_server_error(s); | |
366 return; | |
367 } | |
368 | |
369 ngx_memcpy(s->login.data, arg[0].data, s->login.len); | |
370 | |
371 s->passwd.len = arg[1].len; | |
372 s->passwd.data = ngx_palloc(c->pool, s->passwd.len); | |
373 if (s->passwd.data == NULL) { | |
374 ngx_imap_session_internal_server_error(s); | |
375 return; | |
376 } | |
377 | |
378 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); | |
379 | |
547 | 380 #if (NGX_DEBUG_IMAP_PASSWD) |
527 | 381 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, |
382 "imap login:\"%V\" passwd:\"%V\"", | |
383 &s->login, &s->passwd); | |
547 | 384 #else |
385 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | |
386 "imap login:\"%V\"", &s->login); | |
387 #endif | |
527 | 388 |
389 s->args.nelts = 0; | |
390 s->buffer->pos = s->buffer->start; | |
391 s->buffer->last = s->buffer->start; | |
392 | |
393 if (rev->timer_set) { | |
394 ngx_del_timer(rev); | |
395 } | |
396 | |
397 s->login_attempt++; | |
398 | |
399 ngx_imap_auth_http_init(s); | |
400 | |
401 return; | |
402 | |
403 } else { | |
404 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
405 } | |
406 | |
407 break; | |
408 | |
409 case NGX_IMAP_CAPABILITY: | |
410 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
411 text = cscf->imap_capability->pos; | |
412 text_len = cscf->imap_capability->last - cscf->imap_capability->pos; | |
413 break; | |
414 | |
415 case NGX_IMAP_LOGOUT: | |
539 | 416 s->quit = 1; |
527 | 417 text = imap_bye; |
418 text_len = sizeof(imap_bye) - 1; | |
419 break; | |
420 | |
421 case NGX_IMAP_NOOP: | |
422 break; | |
423 | |
424 default: | |
425 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
426 break; | |
427 } | |
428 | |
429 } else if (rc == NGX_IMAP_NEXT) { | |
430 last = imap_next; | |
431 last_len = sizeof(imap_next) - 1; | |
432 tag = 0; | |
433 } | |
434 | |
435 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { | |
436 last = imap_invalid_command; | |
437 last_len = sizeof(imap_invalid_command) - 1; | |
438 } | |
439 | |
440 if (tag) { | |
543 | 441 if (s->tag.len == 0) { |
442 s->tag.len = sizeof(imap_star) - 1; | |
443 s->tag.data = (u_char *) imap_star; | |
444 } | |
445 | |
539 | 446 if (s->tagged_line.len < s->tag.len + text_len + last_len) { |
447 s->tagged_line.len = s->tag.len + text_len + last_len; | |
448 s->tagged_line.data = ngx_palloc(c->pool, s->tagged_line.len); | |
449 if (s->tagged_line.data == NULL) { | |
527 | 450 ngx_imap_close_connection(c); |
451 return; | |
452 } | |
453 } | |
454 | |
539 | 455 s->out.data = s->tagged_line.data; |
456 s->out.len = s->tag.len + text_len + last_len; | |
457 | |
458 p = s->out.data; | |
527 | 459 |
460 if (text) { | |
461 p = ngx_cpymem(p, text, text_len); | |
462 } | |
463 p = ngx_cpymem(p, s->tag.data, s->tag.len); | |
464 ngx_memcpy(p, last, last_len); | |
465 | |
466 | |
467 } else { | |
539 | 468 s->out.data = last; |
469 s->out.len = last_len; | |
527 | 470 } |
471 | |
539 | 472 if (rc != NGX_IMAP_NEXT) { |
473 s->args.nelts = 0; | |
474 s->buffer->pos = s->buffer->start; | |
475 s->buffer->last = s->buffer->start; | |
476 s->tag.len = 0; | |
527 | 477 } |
478 | |
539 | 479 ngx_imap_send(c->write); |
521 | 480 } |
481 | |
482 | |
527 | 483 void |
521 | 484 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
|
485 { |
527 | 486 u_char *text; |
487 ssize_t size; | |
488 ngx_int_t rc; | |
489 ngx_str_t *arg; | |
490 ngx_connection_t *c; | |
491 ngx_imap_session_t *s; | |
492 ngx_imap_core_srv_conf_t *cscf; | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
493 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
494 c = rev->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
495 s = c->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
496 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
497 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
|
498 |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
499 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
500 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
501 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
|
502 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
503 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
504 |
539 | 505 if (s->out.len) { |
506 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap send handler busy"); | |
507 s->blocked = 1; | |
508 return; | |
509 } | |
510 | |
511 s->blocked = 0; | |
512 | |
527 | 513 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
|
514 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
515 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
|
516 return; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
517 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
518 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
519 text = pop3_ok; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
520 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
|
521 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
522 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
|
523 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
|
524 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
525 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
|
526 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
527 switch (s->command) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
528 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
529 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
|
530 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
|
531 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
|
532 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
533 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
|
534 s->login.len = arg[0].len; |
527 | 535 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
|
536 if (s->login.data == NULL) { |
527 | 537 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
|
538 return; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
539 } |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
540 |
527 | 541 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
|
542 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
543 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
527 | 544 "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
|
545 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
546 } else { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
547 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
|
548 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
549 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
550 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
551 |
527 | 552 case NGX_POP3_CAPA: |
553 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
554 text = cscf->pop3_capability->pos; | |
555 size = cscf->pop3_capability->last - cscf->pop3_capability->pos; | |
556 break; | |
557 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
558 case NGX_POP3_QUIT: |
539 | 559 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
|
560 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
561 |
527 | 562 case NGX_POP3_NOOP: |
563 break; | |
564 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
565 default: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
566 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
|
567 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
|
568 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
569 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
570 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
571 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
572 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
573 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
|
574 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
575 switch (s->command) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
576 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
577 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
|
578 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
|
579 /* STUB */ s->imap_state = ngx_pop3_start; |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
580 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
581 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
|
582 s->passwd.len = arg[0].len; |
527 | 583 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
|
584 if (s->passwd.data == NULL) { |
527 | 585 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
|
586 return; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
587 } |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
588 |
527 | 589 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
|
590 |
547 | 591 #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
|
592 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
527 | 593 "pop3 passwd: \"%V\"", &s->passwd); |
547 | 594 #endif |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
595 |
527 | 596 s->args.nelts = 0; |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
597 s->buffer->pos = s->buffer->start; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
598 s->buffer->last = s->buffer->start; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
599 |
527 | 600 if (rev->timer_set) { |
601 ngx_del_timer(rev); | |
602 } | |
603 | |
521 | 604 ngx_imap_auth_http_init(s); |
422
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
605 |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
606 return; |
edaefb2a20fc
nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
421
diff
changeset
|
607 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
608 } else { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
609 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
|
610 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
611 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
612 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
613 |
527 | 614 case NGX_POP3_CAPA: |
615 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | |
616 text = cscf->pop3_capability->pos; | |
617 size = cscf->pop3_capability->last - cscf->pop3_capability->pos; | |
618 break; | |
619 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
620 case NGX_POP3_QUIT: |
539 | 621 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
|
622 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
623 |
527 | 624 case NGX_POP3_NOOP: |
625 break; | |
626 | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
627 default: |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
628 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
|
629 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
|
630 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
631 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
632 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
633 break; |
527 | 634 |
635 /* suppress warinings */ | |
636 case ngx_pop3_passwd: | |
637 break; | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
638 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
639 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
640 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
641 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
642 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
|
643 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
|
644 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
645 |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
646 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
|
647 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
|
648 s->buffer->last = s->buffer->start; |
539 | 649 |
650 s->out.data = text; | |
651 s->out.len = size; | |
652 | |
653 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
|
654 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
655 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
656 |
521 | 657 static ngx_int_t |
527 | 658 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
|
659 { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
660 ssize_t n; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
661 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
|
662 |
539 | 663 n = s->connection->recv(s->connection, s->buffer->last, |
664 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
|
665 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
666 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
|
667 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
|
668 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
669 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
670 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
671 if (n > 0) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
672 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
|
673 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
674 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
675 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
|
676 if (ngx_handle_read_event(s->connection->read, 0) == NGX_ERROR) { |
527 | 677 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
|
678 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
679 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
680 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
681 return NGX_AGAIN; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
682 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
683 |
527 | 684 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) { |
685 rc = ngx_pop3_parse_command(s); | |
686 } else { | |
687 rc = ngx_imap_parse_command(s); | |
688 } | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
689 |
527 | 690 if (rc == NGX_AGAIN |
691 || rc == NGX_IMAP_NEXT | |
692 || rc == NGX_IMAP_PARSE_INVALID_COMMAND) | |
693 { | |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
694 return rc; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
695 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
696 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
697 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
|
698 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
|
699 return NGX_ERROR; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
700 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
701 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
702 return NGX_OK; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
703 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
704 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
705 |
521 | 706 void |
525 | 707 ngx_imap_session_internal_server_error(ngx_imap_session_t *s) |
708 { | |
539 | 709 s->out = internal_server_errors[s->protocol]; |
710 s->quit = 1; | |
525 | 711 |
539 | 712 ngx_imap_send(s->connection->write); |
525 | 713 } |
714 | |
715 | |
716 void | |
521 | 717 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
|
718 { |
479 | 719 ngx_pool_t *pool; |
720 | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
721 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
|
722 "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
|
723 |
539 | 724 #if (NGX_IMAP_SSL) |
725 | |
726 if (c->ssl) { | |
727 if (ngx_ssl_shutdown(c) == NGX_AGAIN) { | |
728 c->read->handler = ngx_imap_ssl_close_handler; | |
729 c->write->handler = ngx_imap_ssl_close_handler; | |
730 return; | |
731 } | |
732 } | |
733 | |
734 #endif | |
735 | |
543 | 736 c->closed = 1; |
737 | |
479 | 738 pool = c->pool; |
739 | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
740 ngx_close_connection(c); |
479 | 741 |
501 | 742 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
|
743 } |
539 | 744 |
745 | |
746 #if (NGX_IMAP_SSL) | |
747 | |
748 static void | |
749 ngx_imap_ssl_close_handler(ngx_event_t *ev) | |
750 { | |
751 ngx_connection_t *c; | |
752 | |
753 c = ev->data; | |
754 | |
755 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, ev->log, 0, "http ssl close handler"); | |
756 | |
757 if (ngx_ssl_shutdown(c) == NGX_AGAIN) { | |
758 return; | |
759 } | |
760 | |
761 ngx_imap_close_connection(c); | |
762 } | |
763 | |
764 #endif | |
541 | 765 |
766 | |
767 static u_char * | |
768 ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len) | |
769 { | |
567 | 770 u_char *p; |
771 ngx_imap_session_t *s; | |
772 ngx_imap_log_ctx_t *ctx; | |
541 | 773 |
774 if (log->action) { | |
775 p = ngx_snprintf(buf, len, " while %s", log->action); | |
776 len -= p - buf; | |
777 buf = p; | |
778 } | |
779 | |
780 ctx = log->data; | |
781 | |
782 p = ngx_snprintf(buf, len, ", client: %V", ctx->client); | |
783 len -= p - buf; | |
784 buf = p; | |
785 | |
786 s = ctx->session; | |
787 | |
788 if (s == NULL) { | |
789 return p; | |
790 } | |
791 | |
792 p = ngx_snprintf(buf, len, ", server: %V", | |
793 &s->connection->listening->addr_text); | |
794 len -= p - buf; | |
795 buf = p; | |
796 | |
797 if (s->login.len == 0) { | |
798 return p; | |
799 } | |
800 | |
801 p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login); | |
802 len -= p - buf; | |
803 buf = p; | |
804 | |
805 if (s->proxy == NULL) { | |
806 return p; | |
807 } | |
808 | |
809 p = ngx_snprintf(buf, len, ", upstream: %V", | |
810 &s->proxy->upstream.peers->peer[0].name); | |
811 | |
812 return p; | |
813 } |