diff options
Diffstat (limited to 'src/imap/ngx_imap_handler.c')
-rw-r--r-- | src/imap/ngx_imap_handler.c | 104 |
1 files changed, 55 insertions, 49 deletions
diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c index 6497ced0b..4fe124871 100644 --- a/src/imap/ngx_imap_handler.c +++ b/src/imap/ngx_imap_handler.c @@ -10,12 +10,13 @@ #include <ngx_imap.h> -static void ngx_imap_init_session(ngx_event_t *rev); +static void ngx_imap_init_session(ngx_connection_t *c); static void ngx_imap_init_protocol(ngx_event_t *rev); static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s); static u_char *ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len); #if (NGX_IMAP_SSL) +static void ngx_imap_ssl_handshake_handler(ngx_connection_t *c); static void ngx_imap_ssl_close_handler(ngx_event_t *ev); #endif @@ -43,13 +44,15 @@ static u_char imap_invalid_command[] = "BAD invalid command" CRLF; void ngx_imap_init_connection(ngx_connection_t *c) { - ngx_imap_log_ctx_t *lctx; + ngx_imap_log_ctx_t *lctx; #if (NGX_IMAP_SSL) - ngx_imap_conf_ctx_t *ctx; - ngx_imap_ssl_conf_t *sslcf; + ngx_imap_conf_ctx_t *ctx; + ngx_imap_ssl_conf_t *sslcf; + ngx_imap_core_srv_conf_t *cscf; #endif - ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap init connection"); + ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V", + c->number, &c->addr_text, &c->listening->addr_text); lctx = ngx_palloc(c->pool, sizeof(ngx_imap_log_ctx_t)); if (lctx == NULL) { @@ -73,63 +76,59 @@ ngx_imap_init_connection(ngx_connection_t *c) sslcf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_ssl_module); if (sslcf->enable) { - if (ngx_ssl_create_connection(sslcf->ssl_ctx, c, 0) == NGX_ERROR) { + if (ngx_ssl_create_connection(&sslcf->ssl, c, 0) == NGX_ERROR) { ngx_imap_close_connection(c); return; } - c->recv = ngx_ssl_recv; - c->send = ngx_ssl_write; - c->send_chain = ngx_ssl_send_chain; - } + if (ngx_ssl_handshake(c) == NGX_AGAIN) { -#endif + cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module); - ngx_imap_init_session(c->read); -} + ngx_add_timer(c->read, cscf->timeout); + c->ssl->handler = ngx_imap_ssl_handshake_handler; -static void -ngx_imap_init_session(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_imap_session_t *s; - ngx_imap_log_ctx_t *lctx; - ngx_imap_conf_ctx_t *ctx; - ngx_imap_core_srv_conf_t *cscf; -#if (NGX_IMAP_SSL) - ngx_int_t rc; -#endif + return; + } - c = rev->data; - ctx = c->ctx; - cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module); + ngx_imap_ssl_handshake_handler(c); + return; + } -#if (NGX_IMAP_SSL) +#endif - if (c->ssl) { + ngx_imap_init_session(c); +} - rc = ngx_ssl_handshake(c); - if (rc == NGX_ERROR) { - ngx_imap_close_connection(c); - return; - } +#if (NGX_IMAP_SSL) - if (rc == NGX_AGAIN) { - ngx_add_timer(rev, cscf->timeout); - c->read->handler = ngx_imap_init_session; +static void +ngx_imap_ssl_handshake_handler(ngx_connection_t *c) +{ + if (c->ssl->handshaked) { + ngx_imap_init_session(c); + return; + } - if (ngx_handle_read_event(rev, 0) == NGX_ERROR) { - ngx_imap_close_connection(c); - } + ngx_imap_close_connection(c); + return; +} - return; - } +#endif - } -#endif +static void +ngx_imap_init_session(ngx_connection_t *c) +{ + ngx_imap_session_t *s; + ngx_imap_log_ctx_t *lctx; + ngx_imap_conf_ctx_t *ctx; + ngx_imap_core_srv_conf_t *cscf; + + c->read->handler = ngx_imap_init_protocol; + c->write->handler = ngx_imap_send; s = ngx_pcalloc(c->pool, sizeof(ngx_imap_session_t)); if (s == NULL) { @@ -137,6 +136,9 @@ ngx_imap_init_session(ngx_event_t *rev) return; } + ctx = c->ctx; + cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module); + c->data = s; s->connection = c; @@ -156,12 +158,9 @@ ngx_imap_init_session(ngx_event_t *rev) lctx = c->log->data; lctx->session = s; - c->read->handler = ngx_imap_init_protocol; - c->write->handler = ngx_imap_send; + ngx_add_timer(c->read, cscf->timeout); - ngx_add_timer(rev, cscf->timeout); - - if (ngx_handle_read_event(rev, 0) == NGX_ERROR) { + if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { ngx_imap_close_connection(c); } @@ -378,9 +377,14 @@ ngx_imap_auth_state(ngx_event_t *rev) ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); +#if (NGX_DEBUG_IMAP_PASSWD) ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap login:\"%V\" passwd:\"%V\"", &s->login, &s->passwd); +#else + ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, + "imap login:\"%V\"", &s->login); +#endif s->args.nelts = 0; s->buffer->pos = s->buffer->start; @@ -584,8 +588,10 @@ ngx_pop3_auth_state(ngx_event_t *rev) ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len); +#if (NGX_DEBUG_IMAP_PASSWD) ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, "pop3 passwd: \"%V\"", &s->passwd); +#endif s->args.nelts = 0; s->buffer->pos = s->buffer->start; |