annotate src/mail/ngx_mail_imap_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_imap_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_imap_login(ngx_mail_session_t *s,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 ngx_connection_t *c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 ngx_connection_t *c);
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 static u_char imap_greeting[] = "* OK IMAP4 ready" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 static u_char imap_star[] = "* ";
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 static u_char imap_ok[] = "OK completed" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static u_char imap_next[] = "+ OK" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 static u_char imap_plain_next[] = "+ " CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 static u_char imap_username[] = "+ VXNlcm5hbWU6" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 static u_char imap_password[] = "+ UGFzc3dvcmQ6" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 static u_char imap_bye[] = "* BYE" CRLF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 static u_char imap_invalid_command[] = "BAD invalid command" CRLF;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c)
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 ngx_mail_core_srv_conf_t *cscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 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
41
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 s->out.len = sizeof(imap_greeting) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 s->out.data = imap_greeting;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 c->read->handler = ngx_mail_imap_init_protocol;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 ngx_add_timer(c->read, cscf->timeout);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48
459
dac47e9ef0d5 nginx 0.7.27
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
49 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 ngx_mail_send(c->write);
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 ngx_mail_imap_init_protocol(ngx_event_t *rev)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 ngx_connection_t *c;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 ngx_mail_session_t *s;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 ngx_mail_imap_srv_conf_t *iscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 c = rev->data;
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->log->action = "in auth state";
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 if (rev->timedout) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 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
70 c->timedout = 1;
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 return;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 s = c->data;
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 if (s->buffer == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 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
79 == NGX_ERROR)
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_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 return;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 if (s->buffer == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 }
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 s->mail_state = ngx_imap_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 c->read->handler = ngx_mail_imap_auth_state;
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 ngx_mail_imap_auth_state(rev);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
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 void
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 ngx_mail_imap_auth_state(ngx_event_t *rev)
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 u_char *p, *dst, *src, *end;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 ngx_str_t *arg;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 ngx_int_t rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 ngx_uint_t tag, i;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 ngx_connection_t *c;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 ngx_mail_session_t *s;
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 c = rev->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 s = c->data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 if (rev->timedout) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 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
118 c->timedout = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 return;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 if (s->out.len) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy");
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 s->blocked = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 }
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 s->blocked = 0;
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 rc = ngx_mail_read_command(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 if (rc == NGX_AGAIN || rc == NGX_ERROR) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 }
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 tag = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 s->text.len = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 s->out.len = sizeof(imap_ok) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 s->out.data = imap_ok;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 if (rc == NGX_OK) {
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 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i",
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 s->command);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 if (s->backslash) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 arg = s->args.elts;
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 for (i = 0; i < s->args.nelts; i++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 dst = arg[i].data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 end = dst + arg[i].len;
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 for (src = dst; src < end; dst++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 *dst = *src;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 if (*src++ == '\\') {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 *dst = *src++;
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 }
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 arg[i].len = dst - arg[i].data;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 s->backslash = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 switch (s->mail_state) {
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_imap_start:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 switch (s->command) {
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_IMAP_LOGIN:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 rc = ngx_mail_imap_login(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_IMAP_AUTHENTICATE:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 rc = ngx_mail_imap_authenticate(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 tag = (rc != NGX_OK);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 case NGX_IMAP_CAPABILITY:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 rc = ngx_mail_imap_capability(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 case NGX_IMAP_LOGOUT:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 s->quit = 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 s->text.len = sizeof(imap_bye) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 s->text.data = imap_bye;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 case NGX_IMAP_NOOP:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 case NGX_IMAP_STARTTLS:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 rc = ngx_mail_imap_starttls(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 default:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
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 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 case ngx_imap_auth_login_username:
468
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
208 rc = ngx_mail_auth_login_username(s, c, 0);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 tag = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 s->out.len = sizeof(imap_password) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 s->out.data = imap_password;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 s->mail_state = ngx_imap_auth_login_password;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 case ngx_imap_auth_login_password:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 rc = ngx_mail_auth_login_password(s, c);
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 case ngx_imap_auth_plain:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 rc = ngx_mail_auth_plain(s, c, 0);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 case ngx_imap_auth_cram_md5:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 rc = ngx_mail_auth_cram_md5(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 } else if (rc == NGX_IMAP_NEXT) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 tag = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 s->out.len = sizeof(imap_next) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 s->out.data = imap_next;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 }
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 switch (rc) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 case NGX_DONE:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 ngx_mail_auth(s, c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 case NGX_ERROR:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 ngx_mail_session_internal_server_error(s);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 return;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 case NGX_MAIL_PARSE_INVALID_COMMAND:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 s->state = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 s->out.len = sizeof(imap_invalid_command) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 s->out.data = imap_invalid_command;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 s->mail_state = ngx_imap_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 break;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 if (tag) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 if (s->tag.len == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 s->tag.len = sizeof(imap_star) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 s->tag.data = (u_char *) imap_star;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 }
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 if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 s->tagged_line.len = s->tag.len + s->text.len + s->out.len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
262 s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 if (s->tagged_line.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 ngx_mail_close_connection(c);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 return;
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 }
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 p = s->tagged_line.data;
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 if (s->text.len) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 p = ngx_cpymem(p, s->text.data, s->text.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 }
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 p = ngx_cpymem(p, s->tag.data, s->tag.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 ngx_memcpy(p, s->out.data, s->out.len);
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 s->out.len = s->text.len + s->tag.len + s->out.len;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 s->out.data = s->tagged_line.data;
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 if (rc != NGX_IMAP_NEXT) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 s->args.nelts = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 if (s->state) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 /* preserve tag */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 s->arg_start = s->buffer->start + s->tag.len;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 s->buffer->pos = s->arg_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 s->buffer->last = s->arg_start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 } else {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 s->buffer->pos = s->buffer->start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 s->buffer->last = s->buffer->start;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 s->tag.len = 0;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 }
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 ngx_mail_send(c->write);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304 {
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
305 ngx_str_t *arg;
336
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 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 if (ngx_mail_starttls_only(s, c)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 arg = s->args.elts;
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 if (s->args.nelts != 2 || arg[0].len == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 }
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 s->login.len = arg[0].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
320 s->login.data = ngx_pnalloc(c->pool, s->login.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 if (s->login.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 return NGX_ERROR;
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 ngx_memcpy(s->login.data, arg[0].data, s->login.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 s->passwd.len = arg[1].len;
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
328 s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 if (s->passwd.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 return NGX_ERROR;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 #if (NGX_DEBUG_MAIL_PASSWD)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 "imap login:\"%V\" passwd:\"%V\"",
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 &s->login, &s->passwd);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 #else
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 "imap login:\"%V\"", &s->login);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 return NGX_DONE;
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
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 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 ngx_int_t rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352 ngx_mail_core_srv_conf_t *cscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 ngx_mail_imap_srv_conf_t *iscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 if (ngx_mail_starttls_only(s, c)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360
571
5938746e70c2 Mail: get rid of ugly protocol check in ngx_mail_auth_parse().
Maxim Dounin <mdounin@mdounin.ru>
parents: 468
diff changeset
361 rc = ngx_mail_auth_parse(s, c, 0);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 switch (rc) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 case NGX_MAIL_AUTH_LOGIN:
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 s->out.len = sizeof(imap_username) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 s->out.data = imap_username;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 s->mail_state = ngx_imap_auth_login_username;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
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
468
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
373 case NGX_MAIL_AUTH_LOGIN_USERNAME:
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
374
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
375 s->out.len = sizeof(imap_password) - 1;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
376 s->out.data = imap_password;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
377 s->mail_state = ngx_imap_auth_login_password;
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
378
2580fe1c5a9a Mail: support for smtp auth login with username.
Maxim Dounin <mdounin@mdounin.ru>
parents: 459
diff changeset
379 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
380
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 case NGX_MAIL_AUTH_PLAIN:
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 s->out.len = sizeof(imap_plain_next) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 s->out.data = imap_plain_next;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 s->mail_state = ngx_imap_auth_plain;
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 return NGX_OK;
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 case NGX_MAIL_AUTH_CRAM_MD5:
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 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
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 if (!(iscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 if (s->salt.data == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 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
399
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400 if (ngx_mail_salt(s, c, cscf) != NGX_OK) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 }
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 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
406 s->mail_state = ngx_imap_auth_cram_md5;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 }
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 return NGX_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 }
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 return rc;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 }
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 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 ngx_mail_imap_srv_conf_t *iscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
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 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 if (c->ssl == NULL) {
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
427 ngx_mail_ssl_conf_t *sslcf;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
428
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 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
430
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 s->text = iscf->starttls_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 return NGX_OK;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 s->text = iscf->starttls_only_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 return NGX_OK;
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 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 #endif
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 s->text = iscf->capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 return NGX_OK;
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449 static ngx_int_t
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 #if (NGX_MAIL_SSL)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 ngx_mail_ssl_conf_t *sslcf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 if (c->ssl == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 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
457 if (sslcf->starttls) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 c->read->handler = ngx_mail_starttls_handler;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 return NGX_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 }
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
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 #endif
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465 return NGX_MAIL_PARSE_INVALID_COMMAND;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 }