comparison src/imap/ngx_imap_handler.c @ 250:fbf2b2f66c9f NGINX_0_4_10

nginx 0.4.10 *) Feature: the POP3 proxy supports the APOP command. *) Bugfix: if the select, poll or /dev/poll methods were used, then while waiting authentication server response the IMAP/POP3 proxy hogged CPU. *) Bugfix: a segmentation fault might occur if the $server_addr variable was used in the "map" directive. *) Bugfix: the ngx_http_flv_module did not support the byte ranges for full responses; bug appeared in 0.4.7. *) Bugfix: nginx could not be built on Debian amd64; bug appeared in 0.4.9.
author Igor Sysoev <http://sysoev.ru>
date Mon, 23 Oct 2006 00:00:00 +0400
parents 3689cd4e3228
children 644510700914
comparison
equal deleted inserted replaced
249:7a34085272cb 250:fbf2b2f66c9f
231 231
232 232
233 static void 233 static void
234 ngx_imap_init_session(ngx_connection_t *c) 234 ngx_imap_init_session(ngx_connection_t *c)
235 { 235 {
236 u_char *p;
236 ngx_imap_session_t *s; 237 ngx_imap_session_t *s;
237 ngx_imap_core_srv_conf_t *cscf; 238 ngx_imap_core_srv_conf_t *cscf;
238 239
239 c->read->handler = ngx_imap_init_protocol; 240 c->read->handler = ngx_imap_init_protocol;
240 c->write->handler = ngx_imap_send; 241 c->write->handler = ngx_imap_send;
250 ngx_imap_session_internal_server_error(s); 251 ngx_imap_session_internal_server_error(s);
251 return; 252 return;
252 } 253 }
253 254
254 s->out = greetings[s->protocol]; 255 s->out = greetings[s->protocol];
256
257 if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED)
258 && s->protocol == NGX_IMAP_POP3_PROTOCOL)
259 {
260 s->salt.data = ngx_palloc(c->pool,
261 sizeof(" <18446744073709551616.@>" CRLF) - 1
262 + NGX_TIME_T_LEN
263 + cscf->server_name.len);
264 if (s->salt.data == NULL) {
265 ngx_imap_session_internal_server_error(s);
266 return;
267 }
268
269 s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF,
270 ngx_random(), ngx_time(), &cscf->server_name)
271 - s->salt.data;
272
273 s->out.data = ngx_palloc(c->pool, greetings[0].len + 1 + s->salt.len);
274 if (s->out.data == NULL) {
275 ngx_imap_session_internal_server_error(s);
276 return;
277 }
278
279 p = ngx_cpymem(s->out.data, greetings[0].data, greetings[0].len - 2);
280 *p++ = ' ';
281 p = ngx_cpymem(p, s->salt.data, s->salt.len);
282
283 s->out.len = p - s->out.data;
284 }
255 285
256 ngx_add_timer(c->read, cscf->timeout); 286 ngx_add_timer(c->read, cscf->timeout);
257 287
258 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { 288 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {
259 ngx_imap_close_connection(c); 289 ngx_imap_close_connection(c);
724 754
725 size = cscf->pop3_capability.len; 755 size = cscf->pop3_capability.len;
726 text = cscf->pop3_capability.data; 756 text = cscf->pop3_capability.data;
727 break; 757 break;
728 758
759 case NGX_POP3_APOP:
760 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module);
761
762 if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED)
763 && s->args.nelts == 2)
764 {
765 arg = s->args.elts;
766
767 s->login.len = arg[0].len;
768 s->login.data = ngx_palloc(c->pool, s->login.len);
769 if (s->login.data == NULL) {
770 ngx_imap_session_internal_server_error(s);
771 return;
772 }
773
774 ngx_memcpy(s->login.data, arg[0].data, s->login.len);
775
776 s->passwd.len = arg[1].len;
777 s->passwd.data = ngx_palloc(c->pool, s->passwd.len);
778 if (s->passwd.data == NULL) {
779 ngx_imap_session_internal_server_error(s);
780 return;
781 }
782
783 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);
784
785 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0,
786 "pop3 apop: \"%V\" \"%V\"",
787 &s->login, &s->passwd);
788
789 s->auth_method = NGX_IMAP_AUTH_APOP;
790
791 s->args.nelts = 0;
792 s->buffer->pos = s->buffer->start;
793 s->buffer->last = s->buffer->start;
794
795 if (rev->timer_set) {
796 ngx_del_timer(rev);
797 }
798
799 ngx_imap_auth_http_init(s);
800
801 return;
802
803 } else {
804 rc = NGX_IMAP_PARSE_INVALID_COMMAND;
805 }
806
807 break;
808
729 case NGX_POP3_QUIT: 809 case NGX_POP3_QUIT:
730 s->quit = 1; 810 s->quit = 1;
731 break; 811 break;
732 812
733 case NGX_POP3_NOOP: 813 case NGX_POP3_NOOP:
761 841
762 switch (s->command) { 842 switch (s->command) {
763 843
764 case NGX_POP3_PASS: 844 case NGX_POP3_PASS:
765 if (s->args.nelts == 1) { 845 if (s->args.nelts == 1) {
766 /* STUB */ s->imap_state = ngx_pop3_start;
767
768 arg = s->args.elts; 846 arg = s->args.elts;
769 s->passwd.len = arg[0].len; 847 s->passwd.len = arg[0].len;
770 s->passwd.data = ngx_palloc(c->pool, s->passwd.len); 848 s->passwd.data = ngx_palloc(c->pool, s->passwd.len);
771 if (s->passwd.data == NULL) { 849 if (s->passwd.data == NULL) {
772 ngx_imap_session_internal_server_error(s); 850 ngx_imap_session_internal_server_error(s);