annotate src/mail/ngx_mail_parse.c @ 7938:dc955d274130

Mail: connections with wrong ALPN protocols are now rejected. This is a recommended behavior by RFC 7301 and is useful for mitigation of protocol confusion attacks [1]. For POP3 and IMAP protocols IANA-assigned ALPN IDs are used [2]. For the SMTP protocol "smtp" is used. [1] https://alpaca-attack.com/ [2] https://www.iana.org/assignments/tls-extensiontype-values/
author Vladimir Homutov <vl@nginx.com>
date Wed, 20 Oct 2021 09:45:34 +0300
parents b38728495e1a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 2495
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
6
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
11 #include <ngx_mail.h>
4759
4c36e15651f7 Fixed compilation with -Wmissing-prototypes.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
12 #include <ngx_mail_pop3_module.h>
4c36e15651f7 Fixed compilation with -Wmissing-prototypes.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
13 #include <ngx_mail_imap_module.h>
4c36e15651f7 Fixed compilation with -Wmissing-prototypes.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
14 #include <ngx_mail_smtp_module.h>
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
17 ngx_int_t
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
18 ngx_mail_pop3_parse_command(ngx_mail_session_t *s)
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
19 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
20 u_char ch, *p, *c, c0, c1, c2, c3;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
21 ngx_str_t *arg;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
22 enum {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
23 sw_start = 0,
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
24 sw_command,
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
25 sw_invalid,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
26 sw_spaces_before_argument,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
27 sw_argument,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
28 sw_almost_done
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
29 } state;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
30
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
31 state = s->state;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
32
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
33 for (p = s->buffer->pos; p < s->buffer->last; p++) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
34 ch = *p;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
35
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
36 switch (state) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
37
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
38 /* POP3 command */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
39 case sw_start:
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
40 s->cmd_start = p;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
41 state = sw_command;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
42
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
43 /* fall through */
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
44
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
45 case sw_command:
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
46 if (ch == ' ' || ch == CR || ch == LF) {
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
47 c = s->cmd_start;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
48
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
49 if (p - c == 4) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
50
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
51 c0 = ngx_toupper(c[0]);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
52 c1 = ngx_toupper(c[1]);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
53 c2 = ngx_toupper(c[2]);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
54 c3 = ngx_toupper(c[3]);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
55
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
56 if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
57 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
58 s->command = NGX_POP3_USER;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
59
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
60 } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
61 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
62 s->command = NGX_POP3_PASS;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
63
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
64 } else if (c0 == 'A' && c1 == 'P' && c2 == 'O' && c3 == 'P')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
65 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
66 s->command = NGX_POP3_APOP;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
67
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
68 } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
69 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
70 s->command = NGX_POP3_QUIT;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
71
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
72 } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
73 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
74 s->command = NGX_POP3_CAPA;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
75
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
76 } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
77 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
78 s->command = NGX_POP3_AUTH;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
79
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
80 } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
81 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
82 s->command = NGX_POP3_NOOP;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
83 #if (NGX_MAIL_SSL)
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
84 } else if (c0 == 'S' && c1 == 'T' && c2 == 'L' && c3 == 'S')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
85 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
86 s->command = NGX_POP3_STLS;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
87 #endif
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
88 } else {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
89 goto invalid;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
90 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
91
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
92 } else {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
93 goto invalid;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
94 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
95
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
96 s->cmd.data = s->cmd_start;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
97 s->cmd.len = p - s->cmd_start;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
98
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
99 switch (ch) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
100 case ' ':
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
101 state = sw_spaces_before_argument;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
102 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
103 case CR:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
104 state = sw_almost_done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
105 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
106 case LF:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
107 goto done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
108 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
109 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
110 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
111
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
112 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
113 goto invalid;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
114 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
115
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
116 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
117
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
118 case sw_invalid:
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
119 goto invalid;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
120
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
121 case sw_spaces_before_argument:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
122 switch (ch) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
123 case ' ':
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
124 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
125 case CR:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
126 state = sw_almost_done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
127 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
128 case LF:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
129 goto done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
130 default:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
131 if (s->args.nelts <= 2) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
132 state = sw_argument;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
133 s->arg_start = p;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
134 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
135 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
136 goto invalid;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
137 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
138 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
139
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
140 case sw_argument:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
141 switch (ch) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
142
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
143 case ' ':
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
144
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
145 /*
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
146 * the space should be considered as part of the at username
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
147 * or password, but not of argument in other commands
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
148 */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
149
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
150 if (s->command == NGX_POP3_USER
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
151 || s->command == NGX_POP3_PASS)
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
152 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
153 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
154 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
155
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
156 /* fall through */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
157
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
158 case CR:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
159 case LF:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
160 arg = ngx_array_push(&s->args);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
161 if (arg == NULL) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
162 return NGX_ERROR;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
163 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
164 arg->len = p - s->arg_start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
165 arg->data = s->arg_start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
166 s->arg_start = NULL;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
167
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
168 switch (ch) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
169 case ' ':
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
170 state = sw_spaces_before_argument;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
171 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
172 case CR:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
173 state = sw_almost_done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
174 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
175 case LF:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
176 goto done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
177 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
178 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
179
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
180 default:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
181 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
182 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
183 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
184
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
185 case sw_almost_done:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
186 switch (ch) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
187 case LF:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
188 goto done;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
189 default:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
190 goto invalid;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
191 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
192 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
193 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
194
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
195 s->buffer->pos = p;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
196 s->state = state;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
197
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
198 return NGX_AGAIN;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
199
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
200 done:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
201
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
202 s->buffer->pos = p + 1;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
203 s->state = (s->command != NGX_POP3_AUTH) ? sw_start : sw_argument;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
204
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
205 return NGX_OK;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
206
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
207 invalid:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
208
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
209 s->state = sw_invalid;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
210
7838
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
211 /* skip invalid command till LF */
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
212
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
213 for ( /* void */ ; p < s->buffer->last; p++) {
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
214 if (*p == LF) {
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
215 s->state = sw_start;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
216 s->buffer->pos = p + 1;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
217 return NGX_MAIL_PARSE_INVALID_COMMAND;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
218 }
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
219 }
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
220
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
221 s->buffer->pos = p;
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
222
815c63581be4 Mail: POP3 pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7837
diff changeset
223 return NGX_AGAIN;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
224 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
225
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
226
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
227 ngx_int_t
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
228 ngx_mail_imap_parse_command(ngx_mail_session_t *s)
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 {
7841
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
230 u_char ch, *p, *c, *dst, *src, *end;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
231 ngx_str_t *arg;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 enum {
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 sw_start = 0,
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
234 sw_tag,
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
235 sw_invalid,
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
236 sw_spaces_before_command,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
237 sw_command,
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
238 sw_spaces_before_argument,
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
239 sw_argument,
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
240 sw_backslash,
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
241 sw_literal,
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
242 sw_no_sync_literal_argument,
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
243 sw_start_literal_argument,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
244 sw_literal_argument,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
245 sw_end_literal_argument,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
246 sw_almost_done
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 } state;
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
249 state = s->state;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
250
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
251 for (p = s->buffer->pos; p < s->buffer->last; p++) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
252 ch = *p;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 switch (state) {
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
256 /* IMAP tag */
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 case sw_start:
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
258 s->tag_start = p;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
259 state = sw_tag;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
260
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
261 /* fall through */
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
262
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
263 case sw_tag:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
264 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
265 case ' ':
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
266 s->tag.len = p - s->tag_start + 1;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
267 s->tag.data = s->tag_start;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
268 state = sw_spaces_before_command;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
269 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
270 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
271 case LF:
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
272 goto invalid;
7842
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
273 default:
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
274 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
275 && (ch < '0' || ch > '9') && ch != '-' && ch != '.'
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
276 && ch != '_')
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
277 {
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
278 goto invalid;
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
279 }
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
280 if (p - s->tag_start > 31) {
7842
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
281 goto invalid;
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
282 }
4b15f1b92100 Mail: stricter checking of IMAP tags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
283 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
284 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
285 break;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
287 case sw_invalid:
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
288 goto invalid;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
289
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
290 case sw_spaces_before_command:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
291 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
292 case ' ':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
293 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
294 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
295 case LF:
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
296 goto invalid;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
297 default:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
298 s->cmd_start = p;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
299 state = sw_command;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
300 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
301 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
302 break;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
304 case sw_command:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
305 if (ch == ' ' || ch == CR || ch == LF) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
306
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
307 c = s->cmd_start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
308
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
309 switch (p - c) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
310
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
311 case 4:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
312 if ((c[0] == 'N' || c[0] == 'n')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
313 && (c[1] == 'O'|| c[1] == 'o')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
314 && (c[2] == 'O'|| c[2] == 'o')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
315 && (c[3] == 'P'|| c[3] == 'p'))
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
317 s->command = NGX_IMAP_NOOP;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
319 } else {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
320 goto invalid;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
322 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
323
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
324 case 5:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
325 if ((c[0] == 'L'|| c[0] == 'l')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
326 && (c[1] == 'O'|| c[1] == 'o')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
327 && (c[2] == 'G'|| c[2] == 'g')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
328 && (c[3] == 'I'|| c[3] == 'i')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
329 && (c[4] == 'N'|| c[4] == 'n'))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
330 {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
331 s->command = NGX_IMAP_LOGIN;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
332
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
333 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
334 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
335 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
336 break;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
337
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
338 case 6:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
339 if ((c[0] == 'L'|| c[0] == 'l')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
340 && (c[1] == 'O'|| c[1] == 'o')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
341 && (c[2] == 'G'|| c[2] == 'g')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
342 && (c[3] == 'O'|| c[3] == 'o')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
343 && (c[4] == 'U'|| c[4] == 'u')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
344 && (c[5] == 'T'|| c[5] == 't'))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
345 {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
346 s->command = NGX_IMAP_LOGOUT;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
347
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
348 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
349 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
350 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
351 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
352
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
353 #if (NGX_MAIL_SSL)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
354 case 8:
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
355 if ((c[0] == 'S'|| c[0] == 's')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
356 && (c[1] == 'T'|| c[1] == 't')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
357 && (c[2] == 'A'|| c[2] == 'a')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
358 && (c[3] == 'R'|| c[3] == 'r')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
359 && (c[4] == 'T'|| c[4] == 't')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
360 && (c[5] == 'T'|| c[5] == 't')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
361 && (c[6] == 'L'|| c[6] == 'l')
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
362 && (c[7] == 'S'|| c[7] == 's'))
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
363 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
364 s->command = NGX_IMAP_STARTTLS;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
365
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
366 } else {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
367 goto invalid;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
368 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
369 break;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
370 #endif
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
371
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
372 case 10:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
373 if ((c[0] == 'C'|| c[0] == 'c')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
374 && (c[1] == 'A'|| c[1] == 'a')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
375 && (c[2] == 'P'|| c[2] == 'p')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
376 && (c[3] == 'A'|| c[3] == 'a')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
377 && (c[4] == 'B'|| c[4] == 'b')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
378 && (c[5] == 'I'|| c[5] == 'i')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
379 && (c[6] == 'L'|| c[6] == 'l')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
380 && (c[7] == 'I'|| c[7] == 'i')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
381 && (c[8] == 'T'|| c[8] == 't')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
382 && (c[9] == 'Y'|| c[9] == 'y'))
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
383 {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
384 s->command = NGX_IMAP_CAPABILITY;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
385
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
386 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
387 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
388 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
389 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
390
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
391 case 12:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
392 if ((c[0] == 'A'|| c[0] == 'a')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
393 && (c[1] == 'U'|| c[1] == 'u')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
394 && (c[2] == 'T'|| c[2] == 't')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
395 && (c[3] == 'H'|| c[3] == 'h')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
396 && (c[4] == 'E'|| c[4] == 'e')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
397 && (c[5] == 'N'|| c[5] == 'n')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
398 && (c[6] == 'T'|| c[6] == 't')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
399 && (c[7] == 'I'|| c[7] == 'i')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
400 && (c[8] == 'C'|| c[8] == 'c')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
401 && (c[9] == 'A'|| c[9] == 'a')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
402 && (c[10] == 'T'|| c[10] == 't')
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
403 && (c[11] == 'E'|| c[11] == 'e'))
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
404 {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
405 s->command = NGX_IMAP_AUTHENTICATE;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
406
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
407 } else {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
408 goto invalid;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
409 }
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
410 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
411
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
412 default:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
413 goto invalid;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
416 s->cmd.data = s->cmd_start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
417 s->cmd.len = p - s->cmd_start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
418
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
419 switch (ch) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
420 case ' ':
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
421 state = sw_spaces_before_argument;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
422 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
423 case CR:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
424 state = sw_almost_done;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
425 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
426 case LF:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
427 goto done;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
428 }
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 break;
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
432 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
433 goto invalid;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 break;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
437
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
438 case sw_spaces_before_argument:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
439 switch (ch) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
440 case ' ':
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
441 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
442 case CR:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
443 state = sw_almost_done;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
444 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
445 case LF:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
446 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
447 case '"':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
448 if (s->args.nelts <= 2) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
449 s->quoted = 1;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
450 s->arg_start = p + 1;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
451 state = sw_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
452 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
453 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
454 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
455 case '{':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
456 if (s->args.nelts <= 2) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
457 state = sw_literal;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
458 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
459 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
460 goto invalid;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
461 default:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
462 if (s->args.nelts <= 2) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
463 s->arg_start = p;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
464 state = sw_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
465 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
466 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
467 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
468 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
469 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
470
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
471 case sw_argument:
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1323
diff changeset
472 if (ch == ' ' && s->quoted) {
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1323
diff changeset
473 break;
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1323
diff changeset
474 }
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1323
diff changeset
475
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
476 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
477 case '"':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
478 if (!s->quoted) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
479 break;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
480 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
481 s->quoted = 0;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
482 /* fall through */
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
483 case ' ':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
484 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
485 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
486 arg = ngx_array_push(&s->args);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
487 if (arg == NULL) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
488 return NGX_ERROR;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
489 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
490 arg->len = p - s->arg_start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
491 arg->data = s->arg_start;
7841
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
492
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
493 if (s->backslash) {
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
494 dst = s->arg_start;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
495 end = p;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
496
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
497 for (src = dst; src < end; dst++) {
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
498 *dst = *src;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
499 if (*src++ == '\\') {
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
500 *dst = *src++;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
501 }
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
502 }
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
503
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
504 arg->len = dst - s->arg_start;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
505 s->backslash = 0;
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
506 }
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7840
diff changeset
507
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
508 s->arg_start = NULL;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
509
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
510 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
511 case '"':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
512 case ' ':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
513 state = sw_spaces_before_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
514 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
515 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
516 state = sw_almost_done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
517 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
518 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
519 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
520 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
521 break;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
522 case '\\':
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
523 if (s->quoted) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
524 s->backslash = 1;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
525 state = sw_backslash;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
526 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
527 break;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
528 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
529 break;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
530
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
531 case sw_backslash:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
532 switch (ch) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
533 case CR:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
534 case LF:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
535 goto invalid;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
536 default:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
537 state = sw_argument;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
538 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
539 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
540
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
541 case sw_literal:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
542 if (ch >= '0' && ch <= '9') {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
543 s->literal_len = s->literal_len * 10 + (ch - '0');
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
544 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
545 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
546 if (ch == '}') {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
547 state = sw_start_literal_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
548 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
549 }
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
550 if (ch == '+') {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
551 state = sw_no_sync_literal_argument;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
552 break;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
553 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
554 goto invalid;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
555
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
556 case sw_no_sync_literal_argument:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
557 if (ch == '}') {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
558 s->no_sync_literal = 1;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
559 state = sw_start_literal_argument;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
560 break;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
561 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
562 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
563
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
564 case sw_start_literal_argument:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
565 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
566 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
567 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
568 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
569 s->buffer->pos = p + 1;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
570 s->arg_start = p + 1;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
571 if (s->no_sync_literal == 0) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
572 s->state = sw_literal_argument;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
573 return NGX_IMAP_NEXT;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
574 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
575 state = sw_literal_argument;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
576 s->no_sync_literal = 0;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
577 break;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
578 default:
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
579 goto invalid;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
580 }
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
581 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
582
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
583 case sw_literal_argument:
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
584 if (s->literal_len && --s->literal_len) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
585 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
586 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
587
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
588 arg = ngx_array_push(&s->args);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
589 if (arg == NULL) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
590 return NGX_ERROR;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
591 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
592 arg->len = p + 1 - s->arg_start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
593 arg->data = s->arg_start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
594 s->arg_start = NULL;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
595 state = sw_end_literal_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
596
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
597 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
598
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
599 case sw_end_literal_argument:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
600 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
601 case '{':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
602 if (s->args.nelts <= 2) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
603 state = sw_literal;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
604 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
605 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
606 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
607 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
608 state = sw_almost_done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
609 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
610 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
611 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
612 default:
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
613 state = sw_spaces_before_argument;
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
614 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
615 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
616 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
617
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
618 case sw_almost_done:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
619 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
620 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
621 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
622 default:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
623 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
624 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
625 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
626 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
627
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
628 s->buffer->pos = p;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
629 s->state = state;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
630
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
631 return NGX_AGAIN;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
632
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
633 done:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
634
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
635 s->buffer->pos = p + 1;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
636 s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
637
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
638 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
639
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
640 invalid:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
641
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
642 s->state = sw_invalid;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
643 s->quoted = 0;
7839
3974f4e56a4e Mail: fixed s->arg_start clearing on invalid IMAP commands.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7838
diff changeset
644 s->backslash = 0;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
645 s->no_sync_literal = 0;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
646 s->literal_len = 0;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
647
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
648 /* skip invalid command till LF */
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
649
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
650 for ( /* void */ ; p < s->buffer->last; p++) {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
651 if (*p == LF) {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
652 s->state = sw_start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
653 s->buffer->pos = p + 1;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
654
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
655 /* detect non-synchronizing literals */
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
656
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
657 if ((size_t) (p - s->buffer->start) > sizeof("{1+}") - 1) {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
658 p--;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
659
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
660 if (*p == CR) {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
661 p--;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
662 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
663
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
664 if (*p == '}' && *(p - 1) == '+') {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
665 s->quit = 1;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
666 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
667 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
668
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
669 return NGX_MAIL_PARSE_INVALID_COMMAND;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
670 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
671 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
672
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
673 s->buffer->pos = p;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
674
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7842
diff changeset
675 return NGX_AGAIN;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
676 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
677
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
678
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
679 ngx_int_t
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
680 ngx_mail_smtp_parse_command(ngx_mail_session_t *s)
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
681 {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
682 u_char ch, *p, *c, c0, c1, c2, c3;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
683 ngx_str_t *arg;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
684 enum {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
685 sw_start = 0,
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
686 sw_command,
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
687 sw_invalid,
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
688 sw_spaces_before_argument,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
689 sw_argument,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
690 sw_almost_done
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
691 } state;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
692
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
693 state = s->state;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
694
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
695 for (p = s->buffer->pos; p < s->buffer->last; p++) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
696 ch = *p;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
697
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
698 switch (state) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
699
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
700 /* SMTP command */
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
701 case sw_start:
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
702 s->cmd_start = p;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
703 state = sw_command;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
704
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
705 /* fall through */
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
706
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
707 case sw_command:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
708 if (ch == ' ' || ch == CR || ch == LF) {
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
709 c = s->cmd_start;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
710
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
711 if (p - c == 4) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
712
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
713 c0 = ngx_toupper(c[0]);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
714 c1 = ngx_toupper(c[1]);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
715 c2 = ngx_toupper(c[2]);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
716 c3 = ngx_toupper(c[3]);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
717
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
718 if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O')
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
719 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
720 s->command = NGX_SMTP_HELO;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
721
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
722 } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O')
800
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
723 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
724 s->command = NGX_SMTP_EHLO;
800
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
725
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
726 } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
727 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
728 s->command = NGX_SMTP_QUIT;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
729
809
da9c1521319d AUTH PLAIN LOGIN CRAM-MD5
Igor Sysoev <igor@sysoev.ru>
parents: 800
diff changeset
730 } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')
da9c1521319d AUTH PLAIN LOGIN CRAM-MD5
Igor Sysoev <igor@sysoev.ru>
parents: 800
diff changeset
731 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
732 s->command = NGX_SMTP_AUTH;
809
da9c1521319d AUTH PLAIN LOGIN CRAM-MD5
Igor Sysoev <igor@sysoev.ru>
parents: 800
diff changeset
733
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
734 } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
735 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
736 s->command = NGX_SMTP_NOOP;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
737
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
738 } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L')
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
739 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
740 s->command = NGX_SMTP_MAIL;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
741
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
742 } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T')
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
743 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
744 s->command = NGX_SMTP_RSET;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
745
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
746 } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
747 {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
748 s->command = NGX_SMTP_RCPT;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
749
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
750 } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
751 {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
752 s->command = NGX_SMTP_VRFY;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
753
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
754 } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
755 {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
756 s->command = NGX_SMTP_EXPN;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
757
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
758 } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
759 {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
760 s->command = NGX_SMTP_HELP;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
761
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
762 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
763 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
764 }
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
765 #if (NGX_MAIL_SSL)
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
766 } else if (p - c == 8) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
767
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
768 if ((c[0] == 'S'|| c[0] == 's')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
769 && (c[1] == 'T'|| c[1] == 't')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
770 && (c[2] == 'A'|| c[2] == 'a')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
771 && (c[3] == 'R'|| c[3] == 'r')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
772 && (c[4] == 'T'|| c[4] == 't')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
773 && (c[5] == 'T'|| c[5] == 't')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
774 && (c[6] == 'L'|| c[6] == 'l')
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
775 && (c[7] == 'S'|| c[7] == 's'))
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
776 {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
777 s->command = NGX_SMTP_STARTTLS;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
778
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
779 } else {
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
780 goto invalid;
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
781 }
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
782 #endif
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
783 } else {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
784 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
785 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
786
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
787 s->cmd.data = s->cmd_start;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
788 s->cmd.len = p - s->cmd_start;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
789
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
790 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
791 case ' ':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
792 state = sw_spaces_before_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
793 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
794 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
795 state = sw_almost_done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
796 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
797 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
798 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
799 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
800 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
801 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
802
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
803 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
804 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
805 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
806
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
807 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
808
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
809 case sw_invalid:
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
810 goto invalid;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
811
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
812 case sw_spaces_before_argument:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
813 switch (ch) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
814 case ' ':
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
815 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
816 case CR:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
817 state = sw_almost_done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
818 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
819 case LF:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
820 goto done;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
821 default:
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 1479
diff changeset
822 if (s->args.nelts <= 10) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
823 state = sw_argument;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
824 s->arg_start = p;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
825 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
826 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
827 goto invalid;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
828 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
829 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
830
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
831 case sw_argument:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
832 switch (ch) {
800
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
833 case ' ':
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
834 case CR:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
835 case LF:
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
836 arg = ngx_array_push(&s->args);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
837 if (arg == NULL) {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
838 return NGX_ERROR;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
839 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
840 arg->len = p - s->arg_start;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
841 arg->data = s->arg_start;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
842 s->arg_start = NULL;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
843
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
844 switch (ch) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
845 case ' ':
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
846 state = sw_spaces_before_argument;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
847 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
848 case CR:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
849 state = sw_almost_done;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
850 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
851 case LF:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
852 goto done;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
853 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
854 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
855
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
856 default:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
857 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
858 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
859 break;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
860
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
861 case sw_almost_done:
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
862 switch (ch) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
863 case LF:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
864 goto done;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
865 default:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
866 goto invalid;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
867 }
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
868 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
869 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
870
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
871 s->buffer->pos = p;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
872 s->state = state;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
873
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
874 return NGX_AGAIN;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
875
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
876 done:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
877
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
878 s->buffer->pos = p + 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
879 s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 810
diff changeset
880
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
881 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
882
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
883 invalid:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
884
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
885 s->state = sw_invalid;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
886
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
887 /* skip invalid command till LF */
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
888
7837
ba8a8299b904 Mail: optimized discarding invalid SMTP commands.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7836
diff changeset
889 for ( /* void */ ; p < s->buffer->last; p++) {
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
890 if (*p == LF) {
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
891 s->state = sw_start;
7836
6a81d96d3733 Mail: fixed handling of invalid SMTP commands split between reads.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6774
diff changeset
892 s->buffer->pos = p + 1;
6a81d96d3733 Mail: fixed handling of invalid SMTP commands split between reads.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6774
diff changeset
893 return NGX_MAIL_PARSE_INVALID_COMMAND;
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
894 }
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
895 }
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
896
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
897 s->buffer->pos = p;
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5246
diff changeset
898
7836
6a81d96d3733 Mail: fixed handling of invalid SMTP commands split between reads.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6774
diff changeset
899 return NGX_AGAIN;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
900 }
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
901
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
902
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
903 ngx_int_t
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
904 ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c)
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
905 {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
906 ngx_str_t *arg;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
907
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
908 #if (NGX_MAIL_SSL)
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
909 if (ngx_mail_starttls_only(s, c)) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
910 return NGX_MAIL_PARSE_INVALID_COMMAND;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
911 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
912 #endif
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
913
5246
b6562f98bfd8 Mail: fixed possible uninitialized memory access.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4759
diff changeset
914 if (s->args.nelts == 0) {
b6562f98bfd8 Mail: fixed possible uninitialized memory access.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4759
diff changeset
915 return NGX_MAIL_PARSE_INVALID_COMMAND;
b6562f98bfd8 Mail: fixed possible uninitialized memory access.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4759
diff changeset
916 }
b6562f98bfd8 Mail: fixed possible uninitialized memory access.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4759
diff changeset
917
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
918 arg = s->args.elts;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
919
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
920 if (arg[0].len == 5) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
921
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
922 if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
923
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
924 if (s->args.nelts == 1) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
925 return NGX_MAIL_AUTH_LOGIN;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
926 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
927
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
928 if (s->args.nelts == 2) {
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
929 return NGX_MAIL_AUTH_LOGIN_USERNAME;
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
930 }
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
931
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
932 return NGX_MAIL_PARSE_INVALID_COMMAND;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
933 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
934
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
935 if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
936
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
937 if (s->args.nelts == 1) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
938 return NGX_MAIL_AUTH_PLAIN;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
939 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
940
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
941 if (s->args.nelts == 2) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
942 return ngx_mail_auth_plain(s, c, 1);
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
943 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
944 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
945
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
946 return NGX_MAIL_PARSE_INVALID_COMMAND;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
947 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
948
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
949 if (arg[0].len == 8) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
950
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
951 if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) {
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
952
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
953 if (s->args.nelts != 1) {
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
954 return NGX_MAIL_PARSE_INVALID_COMMAND;
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
955 }
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
956
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
957 return NGX_MAIL_AUTH_CRAM_MD5;
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
958 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
959
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
960 if (ngx_strncasecmp(arg[0].data, (u_char *) "EXTERNAL", 8) == 0) {
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
961
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
962 if (s->args.nelts == 1) {
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
963 return NGX_MAIL_AUTH_EXTERNAL;
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
964 }
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
965
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
966 if (s->args.nelts == 2) {
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
967 return ngx_mail_auth_external(s, c, 1);
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
968 }
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
969 }
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
970
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 5398
diff changeset
971 return NGX_MAIL_PARSE_INVALID_COMMAND;
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
972 }
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
973
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
974 return NGX_MAIL_PARSE_INVALID_COMMAND;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
975 }