annotate src/mail/ngx_mail_pop3_handler.c @ 571:5938746e70c2 PATCH_NGINX_MAIL_0_8

Mail: get rid of ugly protocol check in ngx_mail_auth_parse(). Instead, use index of argument which holds authentication mechanism name. For IMAP and POP3 it's 0, for SMTP - 1 as SMTP preserves command in first argument to allow pipelining support. While here, add check that we actually have argument holding authentication mechanism name. Currently IMAP has no appropriate checks before calling ngx_mail_auth_parse() which results in possible access of uninitialized memory.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 27 Sep 2009 00:52:15 +0400
parents 2580fe1c5a9a
children 0b460e61bdcd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_mail.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 #include <ngx_mail_pop3_module.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 static ngx_int_t ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 static ngx_int_t ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 static ngx_int_t ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ngx_int_t stls);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 static ngx_int_t ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 static ngx_int_t ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 static ngx_int_t ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 static u_char pop3_greeting[] = "+OK POP3 ready" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 static u_char pop3_ok[] = "+OK" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 static u_char pop3_next[] = "+ " CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 static u_char pop3_username[] = "+ VXNlcm5hbWU6" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static u_char pop3_password[] = "+ UGFzc3dvcmQ6" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 u_char *p;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 ngx_mail_core_srv_conf_t *cscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_mail_pop3_srv_conf_t *pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 if (pscf->auth_methods
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 & (NGX_MAIL_AUTH_APOP_ENABLED|NGX_MAIL_AUTH_CRAM_MD5_ENABLED))
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 if (ngx_mail_salt(s, c, cscf) != NGX_OK) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
49 s->out.data = ngx_pnalloc(c->pool, sizeof(pop3_greeting) + s->salt.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 if (s->out.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 p = ngx_cpymem(s->out.data, pop3_greeting, sizeof(pop3_greeting) - 3);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 *p++ = ' ';
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 p = ngx_cpymem(p, s->salt.data, s->salt.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 s->out.len = p - s->out.data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 } else {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 s->out.len = sizeof(pop3_greeting) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 s->out.data = pop3_greeting;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 c->read->handler = ngx_mail_pop3_init_protocol;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 ngx_add_timer(c->read, cscf->timeout);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69
459
dac47e9ef0d5 nginx 0.7.27
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
70 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 ngx_mail_send(c->write);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 ngx_mail_pop3_init_protocol(ngx_event_t *rev)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 ngx_connection_t *c;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 ngx_mail_session_t *s;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 c = rev->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 c->log->action = "in auth state";
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 if (rev->timedout) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 c->timedout = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 s = c->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 if (s->buffer == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 == NGX_ERROR)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 s->buffer = ngx_create_temp_buf(c->pool, 128);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 if (s->buffer == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 s->mail_state = ngx_pop3_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 c->read->handler = ngx_mail_pop3_auth_state;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 ngx_mail_pop3_auth_state(rev);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 ngx_mail_pop3_auth_state(ngx_event_t *rev)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 ngx_int_t rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 ngx_connection_t *c;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_mail_session_t *s;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 c = rev->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 s = c->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 auth state");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 if (rev->timedout) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 c->timedout = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 if (s->out.len) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 send handler busy");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 s->blocked = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 s->blocked = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 rc = ngx_mail_read_command(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 if (rc == NGX_AGAIN || rc == NGX_ERROR) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 s->out.len = sizeof(pop3_ok) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 s->out.data = pop3_ok;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 if (rc == NGX_OK) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 switch (s->mail_state) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 case ngx_pop3_start:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 switch (s->command) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162 case NGX_POP3_USER:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 rc = ngx_mail_pop3_user(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 case NGX_POP3_CAPA:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 rc = ngx_mail_pop3_capa(s, c, 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 case NGX_POP3_APOP:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 rc = ngx_mail_pop3_apop(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 case NGX_POP3_AUTH:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 rc = ngx_mail_pop3_auth(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 case NGX_POP3_QUIT:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 s->quit = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 case NGX_POP3_NOOP:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 case NGX_POP3_STLS:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 rc = ngx_mail_pop3_stls(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 default:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 s->mail_state = ngx_pop3_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 case ngx_pop3_user:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 switch (s->command) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 case NGX_POP3_PASS:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 rc = ngx_mail_pop3_pass(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 case NGX_POP3_CAPA:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 rc = ngx_mail_pop3_capa(s, c, 0);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 case NGX_POP3_QUIT:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 s->quit = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 case NGX_POP3_NOOP:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 default:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 s->mail_state = ngx_pop3_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 /* suppress warinings */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 case ngx_pop3_passwd:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 case ngx_pop3_auth_login_username:
468
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
229 rc = ngx_mail_auth_login_username(s, c, 0);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 s->out.len = sizeof(pop3_password) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 s->out.data = pop3_password;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 s->mail_state = ngx_pop3_auth_login_password;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 case ngx_pop3_auth_login_password:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 rc = ngx_mail_auth_login_password(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 case ngx_pop3_auth_plain:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 rc = ngx_mail_auth_plain(s, c, 0);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 case ngx_pop3_auth_cram_md5:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 rc = ngx_mail_auth_cram_md5(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 switch (rc) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 case NGX_DONE:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 ngx_mail_auth(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 case NGX_ERROR:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 case NGX_MAIL_PARSE_INVALID_COMMAND:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 s->mail_state = ngx_pop3_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 s->state = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 s->out.len = sizeof(pop3_invalid_command) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 s->out.data = pop3_invalid_command;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 /* fall through */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 case NGX_OK:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 s->args.nelts = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 s->buffer->pos = s->buffer->start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 s->buffer->last = s->buffer->start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 if (s->state) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 s->arg_start = s->buffer->start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 ngx_mail_send(c->write);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 {
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
286 ngx_str_t *arg;
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 if (ngx_mail_starttls_only(s, c)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 if (s->args.nelts != 1) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 arg = s->args.elts;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 s->login.len = arg[0].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
300 s->login.data = ngx_pnalloc(c->pool, s->login.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 if (s->login.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 ngx_memcpy(s->login.data, arg[0].data, s->login.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 "pop3 login: \"%V\"", &s->login);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 s->mail_state = ngx_pop3_user;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 ngx_str_t *arg;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 if (s->args.nelts != 1) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 arg = s->args.elts;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 s->passwd.len = arg[0].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
327 s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 if (s->passwd.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334 #if (NGX_DEBUG_MAIL_PASSWD)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 "pop3 passwd: \"%V\"", &s->passwd);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 return NGX_DONE;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, ngx_int_t stls)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 ngx_mail_pop3_srv_conf_t *pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352 if (stls && c->ssl == NULL) {
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
353 ngx_mail_ssl_conf_t *sslcf;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
354
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 s->out = pscf->starttls_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 s->out = pscf->starttls_only_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 s->out = pscf->capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 ngx_mail_ssl_conf_t *sslcf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 if (c->ssl == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 if (sslcf->starttls) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 c->read->handler = ngx_mail_starttls_handler;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 ngx_str_t *arg;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 ngx_mail_pop3_srv_conf_t *pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 if (ngx_mail_starttls_only(s, c)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 if (s->args.nelts != 2) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 if (!(pscf->auth_methods & NGX_MAIL_AUTH_APOP_ENABLED)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 arg = s->args.elts;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 s->login.len = arg[0].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
420 s->login.data = ngx_pnalloc(c->pool, s->login.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 if (s->login.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 ngx_memcpy(s->login.data, arg[0].data, s->login.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 s->passwd.len = arg[1].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
428 s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 if (s->passwd.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436 "pop3 apop: \"%V\" \"%V\"", &s->login, &s->passwd);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 s->auth_method = NGX_MAIL_AUTH_APOP;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 return NGX_DONE;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 ngx_int_t rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 ngx_mail_pop3_srv_conf_t *pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 if (ngx_mail_starttls_only(s, c)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 if (s->args.nelts == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 s->out = pscf->auth_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 s->state = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464
571
5938746e70c2 Mail: get rid of ugly protocol check in ngx_mail_auth_parse().
Maxim Dounin <mdounin@mdounin.ru>
parents: 468
diff changeset
465 rc = ngx_mail_auth_parse(s, c, 0);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 switch (rc) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 case NGX_MAIL_AUTH_LOGIN:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 s->out.len = sizeof(pop3_username) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 s->out.data = pop3_username;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 s->mail_state = ngx_pop3_auth_login_username;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476
468
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
477 case NGX_MAIL_AUTH_LOGIN_USERNAME:
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
478
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
479 s->out.len = sizeof(pop3_password) - 1;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
480 s->out.data = pop3_password;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
481 s->mail_state = ngx_pop3_auth_login_password;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
482
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
483 return ngx_mail_auth_login_username(s, c, 1);
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
484
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 case NGX_MAIL_AUTH_PLAIN:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 s->out.len = sizeof(pop3_next) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488 s->out.data = pop3_next;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 s->mail_state = ngx_pop3_auth_plain;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 case NGX_MAIL_AUTH_CRAM_MD5:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 if (!(pscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499 if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 s->mail_state = ngx_pop3_auth_cram_md5;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507 return rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 }