nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev
17 years ago
14 | 14 | } ngx_imap_proxy_ctx_t; |
15 | 15 | |
16 | 16 | |
17 | typedef enum { | |
18 | ngx_pop3_start = 0, | |
19 | ngx_pop3_user | |
20 | } ngx_imap_state_e; | |
21 | ||
22 | ||
17 | 23 | typedef struct { |
18 | 24 | uint32_t signature; /* "IMAP" */ |
19 | 25 | |
20 | 26 | ngx_connection_t *connection; |
21 | 27 | ngx_buf_t *buffer; |
28 | ||
29 | ngx_imap_state_e imap_state; | |
22 | 30 | |
23 | 31 | ngx_imap_proxy_ctx_t *proxy; |
24 | 32 |
80 | 80 | return; |
81 | 81 | } |
82 | 82 | |
83 | c->read->event_handler = ngx_pop3_auth_state; | |
84 | ||
83 | 85 | ngx_pop3_auth_state(rev); |
84 | 86 | } |
85 | 87 | |
86 | 88 | |
87 | 89 | static void ngx_pop3_auth_state(ngx_event_t *rev) |
88 | 90 | { |
91 | ngx_uint_t quit; | |
89 | 92 | u_char *text; |
90 | 93 | ssize_t size; |
91 | 94 | ngx_int_t rc; |
95 | 98 | c = rev->data; |
96 | 99 | s = c->data; |
97 | 100 | |
101 | ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "pop3 auth state"); | |
102 | ||
98 | 103 | /* TODO: timeout */ |
99 | 104 | |
100 | 105 | rc = ngx_pop3_read_command(s); |
103 | 108 | return; |
104 | 109 | } |
105 | 110 | |
106 | s->state = 0; | |
111 | quit = 0; | |
112 | text = pop3_ok; | |
113 | size = sizeof(pop3_ok) - 1; | |
114 | ||
115 | if (rc == NGX_OK) { | |
116 | switch (s->imap_state) { | |
117 | ||
118 | case ngx_pop3_start: | |
119 | ||
120 | switch (s->command) { | |
121 | ||
122 | case NGX_POP3_USER: | |
123 | if (s->args.nelts == 1) { | |
124 | s->imap_state = ngx_pop3_user; | |
125 | } else { | |
126 | rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
127 | } | |
128 | ||
129 | break; | |
130 | ||
131 | case NGX_POP3_QUIT: | |
132 | quit = 1; | |
133 | break; | |
134 | ||
135 | default: | |
136 | s->imap_state = ngx_pop3_start; | |
137 | rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
138 | break; | |
139 | } | |
140 | ||
141 | break; | |
142 | ||
143 | case ngx_pop3_user: | |
144 | ||
145 | switch (s->command) { | |
146 | ||
147 | case NGX_POP3_PASS: | |
148 | if (s->args.nelts == 1) { | |
149 | /* STUB */ s->imap_state = ngx_pop3_start; | |
150 | } else { | |
151 | rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
152 | } | |
153 | ||
154 | break; | |
155 | ||
156 | case NGX_POP3_QUIT: | |
157 | quit = 1; | |
158 | break; | |
159 | ||
160 | default: | |
161 | s->imap_state = ngx_pop3_start; | |
162 | rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
163 | break; | |
164 | } | |
165 | ||
166 | break; | |
167 | } | |
168 | } | |
107 | 169 | |
108 | 170 | if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { |
109 | 171 | text = pop3_invalid_command; |
110 | 172 | size = sizeof(pop3_invalid_command) - 1; |
111 | ||
112 | } else { | |
113 | text = pop3_ok; | |
114 | size = sizeof(pop3_ok) - 1; | |
115 | 173 | } |
116 | 174 | |
117 | 175 | if (ngx_send(c, text, size) < size) { |
122 | 180 | ngx_imap_close_connection(c); |
123 | 181 | return; |
124 | 182 | } |
183 | ||
184 | if (quit) { | |
185 | ngx_imap_close_connection(c); | |
186 | return; | |
187 | } | |
188 | ||
189 | s->args.nelts = 0; | |
190 | s->buffer->pos = s->buffer->start; | |
191 | s->buffer->last = s->buffer->start; | |
125 | 192 | } |
126 | 193 | |
127 | 194 |
38 | 38 | s->command = NGX_POP3_USER; |
39 | 39 | |
40 | 40 | } else if (c[0] == 'P' && c[1] == 'A' |
41 | && c[2] == 'A' && c[3] == 'S') | |
41 | && c[2] == 'S' && c[3] == 'S') | |
42 | 42 | { |
43 | 43 | s->command = NGX_POP3_PASS; |
44 | 44 | |
55 | 55 | #endif |
56 | 56 | |
57 | 57 | } else { |
58 | s->state = sw_start; | |
58 | 59 | return NGX_IMAP_PARSE_INVALID_COMMAND; |
59 | 60 | } |
60 | 61 | |
61 | 62 | } else { |
63 | s->state = sw_start; | |
62 | 64 | return NGX_IMAP_PARSE_INVALID_COMMAND; |
63 | 65 | } |
64 | 66 | |
77 | 79 | } |
78 | 80 | |
79 | 81 | if (ch < 'A' || ch > 'Z') { |
82 | s->state = sw_start; | |
80 | 83 | return NGX_IMAP_PARSE_INVALID_COMMAND; |
81 | 84 | } |
82 | 85 | |
97 | 100 | break; |
98 | 101 | default: |
99 | 102 | if (s->args.nelts > 2) { |
103 | s->state = sw_start; | |
100 | 104 | return NGX_IMAP_PARSE_INVALID_COMMAND; |
101 | 105 | } |
102 | 106 | |
144 | 148 | state = sw_done; |
145 | 149 | break; |
146 | 150 | default: |
151 | s->state = sw_start; | |
147 | 152 | return NGX_IMAP_PARSE_INVALID_COMMAND; |
148 | 153 | } |
149 | 154 | break; |
166 | 171 | s->arg_start = NULL; |
167 | 172 | } |
168 | 173 | |
174 | s->state = sw_start; | |
169 | 175 | return NGX_OK; |
170 | 176 | |
171 | 177 | } else { |