diff options
Diffstat (limited to 'src/imap')
-rw-r--r-- | src/imap/ngx_imap.c | 29 | ||||
-rw-r--r-- | src/imap/ngx_imap.h | 32 | ||||
-rw-r--r-- | src/imap/ngx_imap_handler.c | 46 | ||||
-rw-r--r-- | src/imap/ngx_imap_parse.c | 68 |
4 files changed, 170 insertions, 5 deletions
diff --git a/src/imap/ngx_imap.c b/src/imap/ngx_imap.c index 900dcb347..13855f17d 100644 --- a/src/imap/ngx_imap.c +++ b/src/imap/ngx_imap.c @@ -2,6 +2,10 @@ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> +#include <ngx_imap.h> + + +static char *ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); static ngx_command_t ngx_imap_commands[] = { @@ -30,5 +34,28 @@ ngx_module_t ngx_imap_module = { ngx_imap_commands, /* module directives */ NGX_CORE_MODULE, /* module type */ NULL, /* init module */ - NULL /* init child */ + NULL /* init process */ }; + + +static char *ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_listening_t *ls; + + /* STUB */ + + ls = ngx_listening_inet_stream_socket(cf, 0, 8110); + if (ls == NULL) { + return NGX_CONF_ERROR; + } + + ls->backlog = -1; + ls->handler = ngx_imap_init_connection; + ls->pool_size = 16384; + /* ls->post_accept_timeout = 0; */ + ls->log = cf->cycle->new_log; + + /* */ + + return NGX_CONF_OK; +} diff --git a/src/imap/ngx_imap.h b/src/imap/ngx_imap.h new file mode 100644 index 000000000..5dc48df80 --- /dev/null +++ b/src/imap/ngx_imap.h @@ -0,0 +1,32 @@ +#ifndef _NGX_IMAP_H_INCLUDED_ +#define _NGX_IMAP_H_INCLUDED_ + + +#include <ngx_config.h> +#include <ngx_core.h> + + +typedef struct { + ngx_chain_t *send; +} ngx_imap_request_t; + + +#define NGX_POP3_USER 1 +#define NGX_POP3_PASS 2 +#define NGX_POP3_APOP 3 +#define NGX_POP3_STAT 4 +#define NGX_POP3_LIST 5 +#define NGX_POP3_RETR 6 +#define NGX_POP3_DELE 7 +#define NGX_POP3_NOOP 8 +#define NGX_POP3_RSET 9 +#define NGX_POP3_TOP 10 +#define NGX_POP3_UIDL 11 +#define NGX_POP3_QUIT 12 + + +void ngx_imap_init_connection(ngx_connection_t *c); +void ngx_imap_close_connection(ngx_connection_t *c); + + +#endif /* _NGX_IMAP_H_INCLUDED_ */ diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c index 635ae020c..bbedc9c56 100644 --- a/src/imap/ngx_imap_handler.c +++ b/src/imap/ngx_imap_handler.c @@ -2,18 +2,56 @@ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> +#include <ngx_imap.h> +#include <nginx.h> + + +static void ngx_imap_auth_state(ngx_event_t *rev); + + +static char pop3_greeting[] = "+OK " NGINX_VER " ready" CRLF; +static char imap_greeting[] = "* OK " NGINX_VER " ready" CRLF; void ngx_imap_init_connection(ngx_connection_t *c) { + ngx_int_t rc; + ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap init connection"); - if (ngx_close_socket(c->fd) == -1) { + c->log_error = NGX_ERROR_INFO; - /* we use ngx_cycle->log because c->log was in c->pool */ + rc = ngx_send(c, pop3_greeting, sizeof(pop3_greeting) - 1); - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, - ngx_close_socket_n " failed"); + if (rc == NGX_ERROR) { + ngx_imap_close_connection(c); + return; } + + c->read->event_handler = ngx_imap_auth_state; + + if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { + ngx_imap_close_connection(c); + return; + } +} + + +static void ngx_imap_auth_state(ngx_event_t *rev) +{ + ngx_connection_t *c; + + c = rev->data; + + ngx_imap_close_connection(c); +} + + +void ngx_imap_close_connection(ngx_connection_t *c) +{ + ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, + "close imap connection: %d", c->fd); + + ngx_close_connection(c); } diff --git a/src/imap/ngx_imap_parse.c b/src/imap/ngx_imap_parse.c new file mode 100644 index 000000000..08ff86355 --- /dev/null +++ b/src/imap/ngx_imap_parse.c @@ -0,0 +1,68 @@ + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_event.h> +#include <ngx_imap.h> + + +ngx_int_t ngx_pop3_parse_command(ngx_imap_request_t *r) +{ + u_char ch, *p, *c; + enum { + sw_start = 0, + sw_done + } state; + + while (p < r->buf->last && state < sw_done) { + ch = *p++; + + switch (state) { + + /* POP3 commands */ + case sw_start: + if (ch == ' ') { + c = r->buf->start; + + if (p - 1 - m == 4) { + + if (*c == 'U' && *(c + 1) == 'S' + && *(c + 2) == 'E' && *(c + 3) == 'R') + { + r->command = NGX_POP3_USER; + + } else if (*c == 'P' && *(c + 1) == 'A' + && *(c + 2) == 'A' && *(c + 3) == 'S') + { + r->method = NGX_POP3_PASS; + + } else if (*c == 'Q' && *(c + 1) == 'U' + && *(c + 2) == 'I' && *(c + 3) == 'T') + { + r->method = NGX_POP3_QUIT; + + } else if (*c == 'N' && *(c + 1) == 'O' + && *(c + 2) == 'O' && *(c + 3) == 'P') + { + r->method = NGX_POP3_NOOP; + } + } + + state = sw_spaces_before_arg; + break; + } + + if (ch < 'A' || ch > 'Z') { + return NGX_IMAP_PARSE_INVALID_COMMAND; + } + + break; + } + + /* suppress warning */ + case sw_done: + break; + } + } + + return NGX_OK; +} |