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