Mercurial > hg > nginx
comparison src/imap/ngx_imap_handler.c @ 800:887d8dec72dc
APOP
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 23 Oct 2006 13:10:10 +0000 |
parents | 5e8fb59c18c1 |
children | da9c1521319d |
comparison
equal
deleted
inserted
replaced
799:9737d6fb1ac6 | 800:887d8dec72dc |
---|---|
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); |