comparison src/mail/ngx_mail_imap_handler.c @ 1479:2647950e047f

optimizations
author Igor Sysoev <igor@sysoev.ru>
date Thu, 13 Sep 2007 21:24:27 +0000
parents 59e1caf2be94
children a231e37a19ab
comparison
equal deleted inserted replaced
1478:d0cce8369848 1479:2647950e047f
175 rc = ngx_mail_imap_login(s, c); 175 rc = ngx_mail_imap_login(s, c);
176 break; 176 break;
177 177
178 case NGX_IMAP_AUTHENTICATE: 178 case NGX_IMAP_AUTHENTICATE:
179 rc = ngx_mail_imap_authenticate(s, c); 179 rc = ngx_mail_imap_authenticate(s, c);
180 180 tag = (rc != NGX_OK);
181 if (rc == NGX_OK) {
182 tag = 0;
183 }
184
185 break; 181 break;
186 182
187 case NGX_IMAP_CAPABILITY: 183 case NGX_IMAP_CAPABILITY:
188 rc = ngx_mail_imap_capability(s, c); 184 rc = ngx_mail_imap_capability(s, c);
189 break; 185 break;
305 301
306 static ngx_int_t 302 static ngx_int_t
307 ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c) 303 ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c)
308 { 304 {
309 ngx_str_t *arg; 305 ngx_str_t *arg;
306
310 #if (NGX_MAIL_SSL) 307 #if (NGX_MAIL_SSL)
311 ngx_mail_ssl_conf_t *sslcf; 308 if (ngx_mail_starttls_only(s, c)) {
312 309 return NGX_MAIL_PARSE_INVALID_COMMAND;
313 if (c->ssl == NULL) {
314 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
315
316 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
317 return NGX_MAIL_PARSE_INVALID_COMMAND;
318 }
319 } 310 }
320 #endif 311 #endif
321 312
322 arg = s->args.elts; 313 arg = s->args.elts;
323 314
355 346
356 347
357 static ngx_int_t 348 static ngx_int_t
358 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c) 349 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)
359 { 350 {
360 u_char *p; 351 ngx_int_t rc;
361 ngx_str_t *arg, salt;
362 ngx_uint_t n;
363 ngx_mail_core_srv_conf_t *cscf; 352 ngx_mail_core_srv_conf_t *cscf;
353
364 #if (NGX_MAIL_SSL) 354 #if (NGX_MAIL_SSL)
365 ngx_mail_ssl_conf_t *sslcf; 355 if (ngx_mail_starttls_only(s, c)) {
366
367 if (c->ssl == NULL) {
368 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
369
370 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
371 return NGX_MAIL_PARSE_INVALID_COMMAND;
372 }
373 }
374 #endif
375
376 if (s->args.nelts != 1) {
377 return NGX_MAIL_PARSE_INVALID_COMMAND; 356 return NGX_MAIL_PARSE_INVALID_COMMAND;
378 } 357 }
379 358 #endif
380 arg = s->args.elts; 359
381 360 rc = ngx_mail_auth_parse(s, c);
382 if (arg[0].len == 5) { 361
383 362 switch (rc) {
384 if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) { 363
385 364 case NGX_MAIL_AUTH_LOGIN:
386 s->out.len = sizeof(imap_username) - 1; 365
387 s->out.data = imap_username; 366 s->out.len = sizeof(imap_username) - 1;
388 s->mail_state = ngx_imap_auth_login_username; 367 s->out.data = imap_username;
389 368 s->mail_state = ngx_imap_auth_login_username;
390 return NGX_OK; 369
391 370 return NGX_OK;
392 } else if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) { 371
393 372 case NGX_MAIL_AUTH_PLAIN:
394 s->out.len = sizeof(imap_plain_next) - 1; 373
395 s->out.data = imap_plain_next; 374 s->out.len = sizeof(imap_plain_next) - 1;
396 s->mail_state = ngx_imap_auth_plain; 375 s->out.data = imap_plain_next;
397 376 s->mail_state = ngx_imap_auth_plain;
398 return NGX_OK; 377
399 } 378 return NGX_OK;
400 379
401 } else if (arg[0].len == 8 380 case NGX_MAIL_AUTH_CRAM_MD5:
402 && ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0)
403 {
404 if (s->args.nelts != 1) {
405 return NGX_MAIL_PARSE_INVALID_COMMAND;
406 }
407 381
408 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); 382 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
409 383
410 if (!(cscf->imap_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { 384 if (!(cscf->imap_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {
411 return NGX_MAIL_PARSE_INVALID_COMMAND; 385 return NGX_MAIL_PARSE_INVALID_COMMAND;
412 } 386 }
413 387
414 p = ngx_palloc(c->pool, 388 if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {
415 sizeof("+ " CRLF) - 1 389 s->mail_state = ngx_imap_auth_cram_md5;
416 + ngx_base64_encoded_length(s->salt.len)); 390 return NGX_OK;
417 if (p == NULL) { 391 }
418 return NGX_ERROR; 392
419 } 393 return NGX_ERROR;
420 394 }
421 p[0] = '+'; p[1]= ' '; 395
422 salt.data = &p[2]; 396 return rc;
423 s->salt.len -= 2;
424
425 ngx_encode_base64(&salt, &s->salt);
426
427 s->salt.len += 2;
428 n = 2 + salt.len;
429 p[n++] = CR; p[n++] = LF;
430
431 s->out.len = n;
432 s->out.data = p;
433 s->mail_state = ngx_imap_auth_cram_md5;
434
435 return NGX_OK;
436 }
437
438 return NGX_MAIL_PARSE_INVALID_COMMAND;
439 } 397 }
440 398
441 399
442 static ngx_int_t 400 static ngx_int_t
443 ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c) 401 ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c)