diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-09-10 14:32:02 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-09-10 14:32:02 +0000 |
commit | 10778353ae8eac375bf4cec5cff358b68c0a74be (patch) | |
tree | a65ec8992d91da0bd9bb67edd360949e4a687a3d /src/imap/ngx_imap_handler.c | |
parent | 34a497e500bb9da4e3a9cb6032193f836539be84 (diff) | |
download | nginx-10778353ae8eac375bf4cec5cff358b68c0a74be.tar.gz nginx-10778353ae8eac375bf4cec5cff358b68c0a74be.zip |
nginx-0.0.10-2004-09-10-18:32:02 import
Diffstat (limited to 'src/imap/ngx_imap_handler.c')
-rw-r--r-- | src/imap/ngx_imap_handler.c | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c index 6a107175d..581fa3d2e 100644 --- a/src/imap/ngx_imap_handler.c +++ b/src/imap/ngx_imap_handler.c @@ -81,12 +81,15 @@ static void ngx_imap_init_session(ngx_event_t *rev) return; } + c->read->event_handler = ngx_pop3_auth_state; + ngx_pop3_auth_state(rev); } static void ngx_pop3_auth_state(ngx_event_t *rev) { + ngx_uint_t quit; u_char *text; ssize_t size; ngx_int_t rc; @@ -96,6 +99,8 @@ static void ngx_pop3_auth_state(ngx_event_t *rev) c = rev->data; s = c->data; + ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "pop3 auth state"); + /* TODO: timeout */ rc = ngx_pop3_read_command(s); @@ -104,15 +109,68 @@ static void ngx_pop3_auth_state(ngx_event_t *rev) return; } - s->state = 0; + quit = 0; + text = pop3_ok; + size = sizeof(pop3_ok) - 1; + + if (rc == NGX_OK) { + switch (s->imap_state) { + + case ngx_pop3_start: + + switch (s->command) { + + case NGX_POP3_USER: + if (s->args.nelts == 1) { + s->imap_state = ngx_pop3_user; + } else { + rc = NGX_IMAP_PARSE_INVALID_COMMAND; + } + + break; + + case NGX_POP3_QUIT: + quit = 1; + break; + + default: + s->imap_state = ngx_pop3_start; + rc = NGX_IMAP_PARSE_INVALID_COMMAND; + break; + } + + break; + + case ngx_pop3_user: + + switch (s->command) { + + case NGX_POP3_PASS: + if (s->args.nelts == 1) { + /* STUB */ s->imap_state = ngx_pop3_start; + } else { + rc = NGX_IMAP_PARSE_INVALID_COMMAND; + } + + break; + + case NGX_POP3_QUIT: + quit = 1; + break; + + default: + s->imap_state = ngx_pop3_start; + rc = NGX_IMAP_PARSE_INVALID_COMMAND; + break; + } + + break; + } + } if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { text = pop3_invalid_command; size = sizeof(pop3_invalid_command) - 1; - - } else { - text = pop3_ok; - size = sizeof(pop3_ok) - 1; } if (ngx_send(c, text, size) < size) { @@ -123,6 +181,15 @@ static void ngx_pop3_auth_state(ngx_event_t *rev) ngx_imap_close_connection(c); return; } + + if (quit) { + ngx_imap_close_connection(c); + return; + } + + s->args.nelts = 0; + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; } |