comparison src/mail/ngx_mail_imap_handler.c @ 570:8246d8a2c2be NGINX_0_8_37

nginx 0.8.37 *) Feature: the ngx_http_split_clients_module. *) Feature: the "map" directive supports keys more than 255 characters. *) Bugfix: nginx ignored the "private" and "no-store" values in the "Cache-Control" backend response header line. *) Bugfix: a "stub" parameter of an "include" SSI directive was not used, if empty response has 200 status code. *) Bugfix: if a proxied or FastCGI request was internally redirected to another proxied or FastCGI location, then a segmentation fault might occur in a worker process; the bug had appeared in 0.8.33. Thanks to Yichun Zhang. *) Bugfix: IMAP connections may hang until they timed out while talking to Zimbra server. Thanks to Alan Batie.
author Igor Sysoev <http://sysoev.ru>
date Mon, 17 May 2010 00:00:00 +0400
parents 33394d1255b0
children d0f7a625f27c
comparison
equal deleted inserted replaced
569:19b134bf21c0 570:8246d8a2c2be
37 { 37 {
38 ngx_mail_core_srv_conf_t *cscf; 38 ngx_mail_core_srv_conf_t *cscf;
39 39
40 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); 40 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
41 41
42 s->out.len = sizeof(imap_greeting) - 1; 42 ngx_str_set(&s->out, imap_greeting);
43 s->out.data = imap_greeting;
44 43
45 c->read->handler = ngx_mail_imap_init_protocol; 44 c->read->handler = ngx_mail_imap_init_protocol;
46 45
47 ngx_add_timer(c->read, cscf->timeout); 46 ngx_add_timer(c->read, cscf->timeout);
48 47
134 return; 133 return;
135 } 134 }
136 135
137 tag = 1; 136 tag = 1;
138 s->text.len = 0; 137 s->text.len = 0;
139 s->out.len = sizeof(imap_ok) - 1; 138 ngx_str_set(&s->out, imap_ok);
140 s->out.data = imap_ok;
141 139
142 if (rc == NGX_OK) { 140 if (rc == NGX_OK) {
143 141
144 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i", 142 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i",
145 s->command); 143 s->command);
184 rc = ngx_mail_imap_capability(s, c); 182 rc = ngx_mail_imap_capability(s, c);
185 break; 183 break;
186 184
187 case NGX_IMAP_LOGOUT: 185 case NGX_IMAP_LOGOUT:
188 s->quit = 1; 186 s->quit = 1;
189 s->text.len = sizeof(imap_bye) - 1; 187 ngx_str_set(&s->text, imap_bye);
190 s->text.data = imap_bye;
191 break; 188 break;
192 189
193 case NGX_IMAP_NOOP: 190 case NGX_IMAP_NOOP:
194 break; 191 break;
195 192
206 203
207 case ngx_imap_auth_login_username: 204 case ngx_imap_auth_login_username:
208 rc = ngx_mail_auth_login_username(s, c, 0); 205 rc = ngx_mail_auth_login_username(s, c, 0);
209 206
210 tag = 0; 207 tag = 0;
211 s->out.len = sizeof(imap_password) - 1; 208 ngx_str_set(&s->out, imap_password);
212 s->out.data = imap_password;
213 s->mail_state = ngx_imap_auth_login_password; 209 s->mail_state = ngx_imap_auth_login_password;
214 210
215 break; 211 break;
216 212
217 case ngx_imap_auth_login_password: 213 case ngx_imap_auth_login_password:
227 break; 223 break;
228 } 224 }
229 225
230 } else if (rc == NGX_IMAP_NEXT) { 226 } else if (rc == NGX_IMAP_NEXT) {
231 tag = 0; 227 tag = 0;
232 s->out.len = sizeof(imap_next) - 1; 228 ngx_str_set(&s->out, imap_next);
233 s->out.data = imap_next;
234 } 229 }
235 230
236 switch (rc) { 231 switch (rc) {
237 232
238 case NGX_DONE: 233 case NGX_DONE:
243 ngx_mail_session_internal_server_error(s); 238 ngx_mail_session_internal_server_error(s);
244 return; 239 return;
245 240
246 case NGX_MAIL_PARSE_INVALID_COMMAND: 241 case NGX_MAIL_PARSE_INVALID_COMMAND:
247 s->state = 0; 242 s->state = 0;
248 s->out.len = sizeof(imap_invalid_command) - 1; 243 ngx_str_set(&s->out, imap_invalid_command);
249 s->out.data = imap_invalid_command;
250 s->mail_state = ngx_imap_start; 244 s->mail_state = ngx_imap_start;
251 break; 245 break;
252 } 246 }
253 247
254 if (tag) { 248 if (tag) {
255 if (s->tag.len == 0) { 249 if (s->tag.len == 0) {
256 s->tag.len = sizeof(imap_star) - 1; 250 ngx_str_set(&s->tag, imap_star);
257 s->tag.data = (u_char *) imap_star;
258 } 251 }
259 252
260 if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) { 253 if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) {
261 s->tagged_line.len = s->tag.len + s->text.len + s->out.len; 254 s->tagged_line.len = s->tag.len + s->text.len + s->out.len;
262 s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len); 255 s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len);
362 355
363 switch (rc) { 356 switch (rc) {
364 357
365 case NGX_MAIL_AUTH_LOGIN: 358 case NGX_MAIL_AUTH_LOGIN:
366 359
367 s->out.len = sizeof(imap_username) - 1; 360 ngx_str_set(&s->out, imap_username);
368 s->out.data = imap_username;
369 s->mail_state = ngx_imap_auth_login_username; 361 s->mail_state = ngx_imap_auth_login_username;
370 362
371 return NGX_OK; 363 return NGX_OK;
372 364
373 case NGX_MAIL_AUTH_LOGIN_USERNAME: 365 case NGX_MAIL_AUTH_LOGIN_USERNAME:
374 366
375 s->out.len = sizeof(imap_password) - 1; 367 ngx_str_set(&s->out, imap_password);
376 s->out.data = imap_password;
377 s->mail_state = ngx_imap_auth_login_password; 368 s->mail_state = ngx_imap_auth_login_password;
378 369
379 return ngx_mail_auth_login_username(s, c, 1); 370 return ngx_mail_auth_login_username(s, c, 1);
380 371
381 case NGX_MAIL_AUTH_PLAIN: 372 case NGX_MAIL_AUTH_PLAIN:
382 373
383 s->out.len = sizeof(imap_plain_next) - 1; 374 ngx_str_set(&s->out, imap_plain_next);
384 s->out.data = imap_plain_next;
385 s->mail_state = ngx_imap_auth_plain; 375 s->mail_state = ngx_imap_auth_plain;
386 376
387 return NGX_OK; 377 return NGX_OK;
388 378
389 case NGX_MAIL_AUTH_CRAM_MD5: 379 case NGX_MAIL_AUTH_CRAM_MD5: