aboutsummaryrefslogtreecommitdiff
path: root/src/imap/ngx_imap_handler.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2006-10-23 13:10:10 +0000
committerIgor Sysoev <igor@sysoev.ru>2006-10-23 13:10:10 +0000
commitabeb122d6e447f03be252094e857bf6d5611de19 (patch)
tree2c02436c62314dd4e47682f80970ed6f7507b73a /src/imap/ngx_imap_handler.c
parent73c80d82c1c7c1e8f1eb416ed378a2d541c9675b (diff)
downloadnginx-abeb122d6e447f03be252094e857bf6d5611de19.tar.gz
nginx-abeb122d6e447f03be252094e857bf6d5611de19.zip
APOP
Diffstat (limited to 'src/imap/ngx_imap_handler.c')
-rw-r--r--src/imap/ngx_imap_handler.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c
index 4a4c2c7cd..bb92b36df 100644
--- a/src/imap/ngx_imap_handler.c
+++ b/src/imap/ngx_imap_handler.c
@@ -233,6 +233,7 @@ ngx_imap_ssl_handshake_handler(ngx_connection_t *c)
static void
ngx_imap_init_session(ngx_connection_t *c)
{
+ u_char *p;
ngx_imap_session_t *s;
ngx_imap_core_srv_conf_t *cscf;
@@ -253,6 +254,35 @@ ngx_imap_init_session(ngx_connection_t *c)
s->out = greetings[s->protocol];
+ if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED)
+ && s->protocol == NGX_IMAP_POP3_PROTOCOL)
+ {
+ s->salt.data = ngx_palloc(c->pool,
+ sizeof(" <18446744073709551616.@>" CRLF) - 1
+ + NGX_TIME_T_LEN
+ + cscf->server_name.len);
+ if (s->salt.data == NULL) {
+ ngx_imap_session_internal_server_error(s);
+ return;
+ }
+
+ s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF,
+ ngx_random(), ngx_time(), &cscf->server_name)
+ - s->salt.data;
+
+ s->out.data = ngx_palloc(c->pool, greetings[0].len + 1 + s->salt.len);
+ if (s->out.data == NULL) {
+ ngx_imap_session_internal_server_error(s);
+ return;
+ }
+
+ p = ngx_cpymem(s->out.data, greetings[0].data, greetings[0].len - 2);
+ *p++ = ' ';
+ p = ngx_cpymem(p, s->salt.data, s->salt.len);
+
+ s->out.len = p - s->out.data;
+ }
+
ngx_add_timer(c->read, cscf->timeout);
if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {
@@ -726,6 +756,56 @@ ngx_pop3_auth_state(ngx_event_t *rev)
text = cscf->pop3_capability.data;
break;
+ case NGX_POP3_APOP:
+ cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module);
+
+ if ((cscf->auth_methods & NGX_IMAP_AUTH_APOP_ENABLED)
+ && s->args.nelts == 2)
+ {
+ arg = s->args.elts;
+
+ s->login.len = arg[0].len;
+ s->login.data = ngx_palloc(c->pool, s->login.len);
+ if (s->login.data == NULL) {
+ ngx_imap_session_internal_server_error(s);
+ return;
+ }
+
+ ngx_memcpy(s->login.data, arg[0].data, s->login.len);
+
+ s->passwd.len = arg[1].len;
+ s->passwd.data = ngx_palloc(c->pool, s->passwd.len);
+ if (s->passwd.data == NULL) {
+ ngx_imap_session_internal_server_error(s);
+ return;
+ }
+
+ ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);
+
+ ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0,
+ "pop3 apop: \"%V\" \"%V\"",
+ &s->login, &s->passwd);
+
+ s->auth_method = NGX_IMAP_AUTH_APOP;
+
+ s->args.nelts = 0;
+ s->buffer->pos = s->buffer->start;
+ s->buffer->last = s->buffer->start;
+
+ if (rev->timer_set) {
+ ngx_del_timer(rev);
+ }
+
+ ngx_imap_auth_http_init(s);
+
+ return;
+
+ } else {
+ rc = NGX_IMAP_PARSE_INVALID_COMMAND;
+ }
+
+ break;
+
case NGX_POP3_QUIT:
s->quit = 1;
break;
@@ -763,8 +843,6 @@ ngx_pop3_auth_state(ngx_event_t *rev)
case NGX_POP3_PASS:
if (s->args.nelts == 1) {
- /* STUB */ s->imap_state = ngx_pop3_start;
-
arg = s->args.elts;
s->passwd.len = arg[0].len;
s->passwd.data = ngx_palloc(c->pool, s->passwd.len);