comparison src/mail/ngx_mail_smtp_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 2b9e388c61f1
children d0f7a625f27c
comparison
equal deleted inserted replaced
569:19b134bf21c0 570:8246d8a2c2be
317 != NGX_OK) 317 != NGX_OK)
318 { 318 {
319 return; 319 return;
320 } 320 }
321 321
322 s->out.len = sizeof(smtp_invalid_pipelining) - 1; 322 ngx_str_set(&s->out, smtp_invalid_pipelining);
323 s->out.data = smtp_invalid_pipelining;
324 } 323 }
325 324
326 ngx_mail_send(c->write); 325 ngx_mail_send(c->write);
327 } 326 }
328 327
412 411
413 if (rc == NGX_AGAIN || rc == NGX_ERROR) { 412 if (rc == NGX_AGAIN || rc == NGX_ERROR) {
414 return; 413 return;
415 } 414 }
416 415
417 s->out.len = sizeof(smtp_ok) - 1; 416 ngx_str_set(&s->out, smtp_ok);
418 s->out.data = smtp_ok;
419 417
420 if (rc == NGX_OK) { 418 if (rc == NGX_OK) {
421 switch (s->mail_state) { 419 switch (s->mail_state) {
422 420
423 case ngx_smtp_start: 421 case ngx_smtp_start:
433 rc = ngx_mail_smtp_auth(s, c); 431 rc = ngx_mail_smtp_auth(s, c);
434 break; 432 break;
435 433
436 case NGX_SMTP_QUIT: 434 case NGX_SMTP_QUIT:
437 s->quit = 1; 435 s->quit = 1;
438 s->out.len = sizeof(smtp_bye) - 1; 436 ngx_str_set(&s->out, smtp_bye);
439 s->out.data = smtp_bye;
440 break; 437 break;
441 438
442 case NGX_SMTP_MAIL: 439 case NGX_SMTP_MAIL:
443 rc = ngx_mail_smtp_mail(s, c); 440 rc = ngx_mail_smtp_mail(s, c);
444 break; 441 break;
454 case NGX_SMTP_NOOP: 451 case NGX_SMTP_NOOP:
455 break; 452 break;
456 453
457 case NGX_SMTP_STARTTLS: 454 case NGX_SMTP_STARTTLS:
458 rc = ngx_mail_smtp_starttls(s, c); 455 rc = ngx_mail_smtp_starttls(s, c);
459 s->out.len = sizeof(smtp_starttls) - 1; 456 ngx_str_set(&s->out, smtp_starttls);
460 s->out.data = smtp_starttls;
461 break; 457 break;
462 458
463 default: 459 default:
464 rc = NGX_MAIL_PARSE_INVALID_COMMAND; 460 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
465 break; 461 break;
468 break; 464 break;
469 465
470 case ngx_smtp_auth_login_username: 466 case ngx_smtp_auth_login_username:
471 rc = ngx_mail_auth_login_username(s, c, 0); 467 rc = ngx_mail_auth_login_username(s, c, 0);
472 468
473 s->out.len = sizeof(smtp_password) - 1; 469 ngx_str_set(&s->out, smtp_password);
474 s->out.data = smtp_password;
475 s->mail_state = ngx_smtp_auth_login_password; 470 s->mail_state = ngx_smtp_auth_login_password;
476 break; 471 break;
477 472
478 case ngx_smtp_auth_login_password: 473 case ngx_smtp_auth_login_password:
479 rc = ngx_mail_auth_login_password(s, c); 474 rc = ngx_mail_auth_login_password(s, c);
500 return; 495 return;
501 496
502 case NGX_MAIL_PARSE_INVALID_COMMAND: 497 case NGX_MAIL_PARSE_INVALID_COMMAND:
503 s->mail_state = ngx_smtp_start; 498 s->mail_state = ngx_smtp_start;
504 s->state = 0; 499 s->state = 0;
505 500 ngx_str_set(&s->out, smtp_invalid_command);
506 s->out.len = sizeof(smtp_invalid_command) - 1;
507 s->out.data = smtp_invalid_command;
508 501
509 /* fall through */ 502 /* fall through */
510 503
511 case NGX_OK: 504 case NGX_OK:
512 s->args.nelts = 0; 505 s->args.nelts = 0;
527 { 520 {
528 ngx_str_t *arg; 521 ngx_str_t *arg;
529 ngx_mail_smtp_srv_conf_t *sscf; 522 ngx_mail_smtp_srv_conf_t *sscf;
530 523
531 if (s->args.nelts != 1) { 524 if (s->args.nelts != 1) {
532 s->out.len = sizeof(smtp_invalid_argument) - 1; 525 ngx_str_set(&s->out, smtp_invalid_argument);
533 s->out.data = smtp_invalid_argument;
534 s->state = 0; 526 s->state = 0;
535 return NGX_OK; 527 return NGX_OK;
536 } 528 }
537 529
538 arg = s->args.elts; 530 arg = s->args.elts;
544 return NGX_ERROR; 536 return NGX_ERROR;
545 } 537 }
546 538
547 ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len); 539 ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len);
548 540
549 s->smtp_from.len = 0; 541 ngx_str_null(&s->smtp_from);
550 s->smtp_from.data = NULL; 542 ngx_str_null(&s->smtp_to);
551 s->smtp_to.len = 0;
552 s->smtp_to.data = NULL;
553 543
554 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); 544 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);
555 545
556 if (s->command == NGX_SMTP_HELO) { 546 if (s->command == NGX_SMTP_HELO) {
557 s->out = sscf->server_name; 547 s->out = sscf->server_name;
597 return NGX_MAIL_PARSE_INVALID_COMMAND; 587 return NGX_MAIL_PARSE_INVALID_COMMAND;
598 } 588 }
599 #endif 589 #endif
600 590
601 if (s->args.nelts == 0) { 591 if (s->args.nelts == 0) {
602 s->out.len = sizeof(smtp_invalid_argument) - 1; 592 ngx_str_set(&s->out, smtp_invalid_argument);
603 s->out.data = smtp_invalid_argument;
604 s->state = 0; 593 s->state = 0;
605 return NGX_OK; 594 return NGX_OK;
606 } 595 }
607 596
608 rc = ngx_mail_auth_parse(s, c); 597 rc = ngx_mail_auth_parse(s, c);
609 598
610 switch (rc) { 599 switch (rc) {
611 600
612 case NGX_MAIL_AUTH_LOGIN: 601 case NGX_MAIL_AUTH_LOGIN:
613 602
614 s->out.len = sizeof(smtp_username) - 1; 603 ngx_str_set(&s->out, smtp_username);
615 s->out.data = smtp_username;
616 s->mail_state = ngx_smtp_auth_login_username; 604 s->mail_state = ngx_smtp_auth_login_username;
617 605
618 return NGX_OK; 606 return NGX_OK;
619 607
620 case NGX_MAIL_AUTH_LOGIN_USERNAME: 608 case NGX_MAIL_AUTH_LOGIN_USERNAME:
621 609
622 s->out.len = sizeof(smtp_password) - 1; 610 ngx_str_set(&s->out, smtp_password);
623 s->out.data = smtp_password;
624 s->mail_state = ngx_smtp_auth_login_password; 611 s->mail_state = ngx_smtp_auth_login_password;
625 612
626 return ngx_mail_auth_login_username(s, c, 1); 613 return ngx_mail_auth_login_username(s, c, 1);
627 614
628 case NGX_MAIL_AUTH_PLAIN: 615 case NGX_MAIL_AUTH_PLAIN:
629 616
630 s->out.len = sizeof(smtp_next) - 1; 617 ngx_str_set(&s->out, smtp_next);
631 s->out.data = smtp_next;
632 s->mail_state = ngx_smtp_auth_plain; 618 s->mail_state = ngx_smtp_auth_plain;
633 619
634 return NGX_OK; 620 return NGX_OK;
635 621
636 case NGX_MAIL_AUTH_CRAM_MD5: 622 case NGX_MAIL_AUTH_CRAM_MD5:
671 657
672 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); 658 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);
673 659
674 if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) { 660 if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) {
675 ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\""); 661 ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\"");
676 662 ngx_str_set(&s->out, smtp_auth_required);
677 s->out.len = sizeof(smtp_auth_required) - 1;
678 s->out.data = smtp_auth_required;
679
680 return NGX_OK; 663 return NGX_OK;
681 } 664 }
682 665
683 /* auth none */ 666 /* auth none */
684 667
685 if (s->smtp_from.len) { 668 if (s->smtp_from.len) {
686 s->out.len = sizeof(smtp_bad_sequence) - 1; 669 ngx_str_set(&s->out, smtp_bad_sequence);
687 s->out.data = smtp_bad_sequence;
688 return NGX_OK; 670 return NGX_OK;
689 } 671 }
690 672
691 l.len = s->buffer->last - s->buffer->start; 673 l.len = s->buffer->last - s->buffer->start;
692 l.data = s->buffer->start; 674 l.data = s->buffer->start;
721 ngx_memcpy(s->smtp_from.data, l.data, l.len); 703 ngx_memcpy(s->smtp_from.data, l.data, l.len);
722 704
723 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, 705 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
724 "smtp mail from:\"%V\"", &s->smtp_from); 706 "smtp mail from:\"%V\"", &s->smtp_from);
725 707
726 s->out.len = sizeof(smtp_ok) - 1; 708 ngx_str_set(&s->out, smtp_ok);
727 s->out.data = smtp_ok;
728 709
729 return NGX_OK; 710 return NGX_OK;
730 } 711 }
731 712
732 713
736 u_char ch; 717 u_char ch;
737 ngx_str_t l; 718 ngx_str_t l;
738 ngx_uint_t i; 719 ngx_uint_t i;
739 720
740 if (s->smtp_from.len == 0) { 721 if (s->smtp_from.len == 0) {
741 s->out.len = sizeof(smtp_bad_sequence) - 1; 722 ngx_str_set(&s->out, smtp_bad_sequence);
742 s->out.data = smtp_bad_sequence;
743 return NGX_OK; 723 return NGX_OK;
744 } 724 }
745 725
746 l.len = s->buffer->last - s->buffer->start; 726 l.len = s->buffer->last - s->buffer->start;
747 l.data = s->buffer->start; 727 l.data = s->buffer->start;
785 765
786 766
787 static ngx_int_t 767 static ngx_int_t
788 ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c) 768 ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c)
789 { 769 {
790 s->smtp_from.len = 0; 770 ngx_str_null(&s->smtp_from);
791 s->smtp_from.data = NULL; 771 ngx_str_null(&s->smtp_to);
792 s->smtp_to.len = 0; 772 ngx_str_set(&s->out, smtp_ok);
793 s->smtp_to.data = NULL;
794
795 s->out.len = sizeof(smtp_ok) - 1;
796 s->out.data = smtp_ok;
797 773
798 return NGX_OK; 774 return NGX_OK;
799 } 775 }
800 776
801 777
812 /* 788 /*
813 * RFC3207 requires us to discard any knowledge 789 * RFC3207 requires us to discard any knowledge
814 * obtained from client before STARTTLS. 790 * obtained from client before STARTTLS.
815 */ 791 */
816 792
817 s->smtp_helo.len = 0; 793 ngx_str_null(&s->smtp_helo);
818 s->smtp_helo.data = NULL; 794 ngx_str_null(&s->smtp_from);
819 s->smtp_from.len = 0; 795 ngx_str_null(&s->smtp_to);
820 s->smtp_from.data = NULL;
821 s->smtp_to.len = 0;
822 s->smtp_to.data = NULL;
823 796
824 c->read->handler = ngx_mail_starttls_handler; 797 c->read->handler = ngx_mail_starttls_handler;
825 return NGX_OK; 798 return NGX_OK;
826 } 799 }
827 } 800 }