comparison src/mail/ngx_mail_smtp_handler.c @ 665:0b460e61bdcd default tip

Merge with nginx 1.0.0.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 25 Apr 2011 04:22:17 +0400
parents 5938746e70c2 8246d8a2c2be
children
comparison
equal deleted inserted replaced
572:06419a2298a9 665:0b460e61bdcd
189 s = ctx->data; 189 s = ctx->data;
190 c = s->connection; 190 c = s->connection;
191 191
192 if (ctx->state) { 192 if (ctx->state) {
193 ngx_log_error(NGX_LOG_ERR, c->log, 0, 193 ngx_log_error(NGX_LOG_ERR, c->log, 0,
194 "%V could not be resolved (%i: %s)", 194 "\"%V\" could not be resolved (%i: %s)",
195 &ctx->name, ctx->state, 195 &ctx->name, ctx->state,
196 ngx_resolver_strerror(ctx->state)); 196 ngx_resolver_strerror(ctx->state));
197 197
198 if (ctx->state == NGX_RESOLVE_NXDOMAIN) { 198 if (ctx->state == NGX_RESOLVE_NXDOMAIN) {
199 s->host = smtp_unavailable; 199 s->host = smtp_unavailable;
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 s->quit = 1; 323 s->quit = 1;
325 } 324 }
326 325
327 ngx_mail_send(c->write); 326 ngx_mail_send(c->write);
328 } 327 }
413 412
414 if (rc == NGX_AGAIN || rc == NGX_ERROR) { 413 if (rc == NGX_AGAIN || rc == NGX_ERROR) {
415 return; 414 return;
416 } 415 }
417 416
418 s->out.len = sizeof(smtp_ok) - 1; 417 ngx_str_set(&s->out, smtp_ok);
419 s->out.data = smtp_ok;
420 418
421 if (rc == NGX_OK) { 419 if (rc == NGX_OK) {
422 switch (s->mail_state) { 420 switch (s->mail_state) {
423 421
424 case ngx_smtp_start: 422 case ngx_smtp_start:
434 rc = ngx_mail_smtp_auth(s, c); 432 rc = ngx_mail_smtp_auth(s, c);
435 break; 433 break;
436 434
437 case NGX_SMTP_QUIT: 435 case NGX_SMTP_QUIT:
438 s->quit = 1; 436 s->quit = 1;
439 s->out.len = sizeof(smtp_bye) - 1; 437 ngx_str_set(&s->out, smtp_bye);
440 s->out.data = smtp_bye;
441 break; 438 break;
442 439
443 case NGX_SMTP_MAIL: 440 case NGX_SMTP_MAIL:
444 rc = ngx_mail_smtp_mail(s, c); 441 rc = ngx_mail_smtp_mail(s, c);
445 break; 442 break;
455 case NGX_SMTP_NOOP: 452 case NGX_SMTP_NOOP:
456 break; 453 break;
457 454
458 case NGX_SMTP_STARTTLS: 455 case NGX_SMTP_STARTTLS:
459 rc = ngx_mail_smtp_starttls(s, c); 456 rc = ngx_mail_smtp_starttls(s, c);
460 s->out.len = sizeof(smtp_starttls) - 1; 457 ngx_str_set(&s->out, smtp_starttls);
461 s->out.data = smtp_starttls;
462 break; 458 break;
463 459
464 default: 460 default:
465 rc = NGX_MAIL_PARSE_INVALID_COMMAND; 461 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
466 break; 462 break;
469 break; 465 break;
470 466
471 case ngx_smtp_auth_login_username: 467 case ngx_smtp_auth_login_username:
472 rc = ngx_mail_auth_login_username(s, c, 0); 468 rc = ngx_mail_auth_login_username(s, c, 0);
473 469
474 s->out.len = sizeof(smtp_password) - 1; 470 ngx_str_set(&s->out, smtp_password);
475 s->out.data = smtp_password;
476 s->mail_state = ngx_smtp_auth_login_password; 471 s->mail_state = ngx_smtp_auth_login_password;
477 break; 472 break;
478 473
479 case ngx_smtp_auth_login_password: 474 case ngx_smtp_auth_login_password:
480 rc = ngx_mail_auth_login_password(s, c); 475 rc = ngx_mail_auth_login_password(s, c);
505 return; 500 return;
506 501
507 case NGX_MAIL_PARSE_INVALID_COMMAND: 502 case NGX_MAIL_PARSE_INVALID_COMMAND:
508 s->mail_state = ngx_smtp_start; 503 s->mail_state = ngx_smtp_start;
509 s->state = 0; 504 s->state = 0;
510 505 ngx_str_set(&s->out, smtp_invalid_command);
511 s->out.len = sizeof(smtp_invalid_command) - 1;
512 s->out.data = smtp_invalid_command;
513 506
514 /* fall through */ 507 /* fall through */
515 508
516 case NGX_OK: 509 case NGX_OK:
517 s->args.nelts = 0; 510 s->args.nelts = 0;
535 { 528 {
536 ngx_str_t *arg; 529 ngx_str_t *arg;
537 ngx_mail_smtp_srv_conf_t *sscf; 530 ngx_mail_smtp_srv_conf_t *sscf;
538 531
539 if (s->args.nelts != 2) { 532 if (s->args.nelts != 2) {
540 s->out.len = sizeof(smtp_invalid_argument) - 1; 533 ngx_str_set(&s->out, smtp_invalid_argument);
541 s->out.data = smtp_invalid_argument;
542 s->state = 0; 534 s->state = 0;
543 return NGX_OK; 535 return NGX_OK;
544 } 536 }
545 537
546 arg = s->args.elts; 538 arg = s->args.elts;
552 return NGX_ERROR; 544 return NGX_ERROR;
553 } 545 }
554 546
555 ngx_memcpy(s->smtp_helo.data, arg[1].data, arg[1].len); 547 ngx_memcpy(s->smtp_helo.data, arg[1].data, arg[1].len);
556 548
557 s->smtp_from.len = 0; 549 ngx_str_null(&s->smtp_from);
558 s->smtp_from.data = NULL; 550 ngx_str_null(&s->smtp_to);
559 s->smtp_to.len = 0;
560 s->smtp_to.data = NULL;
561 551
562 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); 552 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);
563 553
564 if (s->command == NGX_SMTP_HELO) { 554 if (s->command == NGX_SMTP_HELO) {
565 s->out = sscf->server_name; 555 s->out = sscf->server_name;
605 return NGX_MAIL_PARSE_INVALID_COMMAND; 595 return NGX_MAIL_PARSE_INVALID_COMMAND;
606 } 596 }
607 #endif 597 #endif
608 598
609 if (s->args.nelts < 2) { 599 if (s->args.nelts < 2) {
610 s->out.len = sizeof(smtp_invalid_argument) - 1; 600 ngx_str_set(&s->out, smtp_invalid_argument);
611 s->out.data = smtp_invalid_argument;
612 s->state = 0; 601 s->state = 0;
613 return NGX_OK; 602 return NGX_OK;
614 } 603 }
615 604
616 rc = ngx_mail_auth_parse(s, c, 1); 605 rc = ngx_mail_auth_parse(s, c, 1);
617 606
618 switch (rc) { 607 switch (rc) {
619 608
620 case NGX_MAIL_AUTH_LOGIN: 609 case NGX_MAIL_AUTH_LOGIN:
621 610
622 s->out.len = sizeof(smtp_username) - 1; 611 ngx_str_set(&s->out, smtp_username);
623 s->out.data = smtp_username;
624 s->mail_state = ngx_smtp_auth_login_username; 612 s->mail_state = ngx_smtp_auth_login_username;
625 613
626 return NGX_OK; 614 return NGX_OK;
627 615
628 case NGX_MAIL_AUTH_LOGIN_USERNAME: 616 case NGX_MAIL_AUTH_LOGIN_USERNAME:
629 617
630 s->out.len = sizeof(smtp_password) - 1; 618 ngx_str_set(&s->out, smtp_password);
631 s->out.data = smtp_password;
632 s->mail_state = ngx_smtp_auth_login_password; 619 s->mail_state = ngx_smtp_auth_login_password;
633 620
634 return ngx_mail_auth_login_username(s, c, 2); 621 return ngx_mail_auth_login_username(s, c, 2);
635 622
636 case NGX_MAIL_AUTH_PLAIN: 623 case NGX_MAIL_AUTH_PLAIN:
637 624
638 s->out.len = sizeof(smtp_next) - 1; 625 ngx_str_set(&s->out, smtp_next);
639 s->out.data = smtp_next;
640 s->mail_state = ngx_smtp_auth_plain; 626 s->mail_state = ngx_smtp_auth_plain;
641 627
642 return NGX_OK; 628 return NGX_OK;
643 629
644 case NGX_MAIL_AUTH_CRAM_MD5: 630 case NGX_MAIL_AUTH_CRAM_MD5:
677 663
678 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); 664 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);
679 665
680 if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) { 666 if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) {
681 ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\""); 667 ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\"");
682 668 ngx_str_set(&s->out, smtp_auth_required);
683 s->out.len = sizeof(smtp_auth_required) - 1;
684 s->out.data = smtp_auth_required;
685
686 return NGX_OK; 669 return NGX_OK;
687 } 670 }
688 671
689 /* auth none */ 672 /* auth none */
690 673
691 if (s->smtp_from.len) { 674 if (s->smtp_from.len) {
692 s->out.len = sizeof(smtp_bad_sequence) - 1; 675 ngx_str_set(&s->out, smtp_bad_sequence);
693 s->out.data = smtp_bad_sequence;
694 return NGX_OK; 676 return NGX_OK;
695 } 677 }
696 678
697 arg = s->args.elts; 679 arg = s->args.elts;
698 end = arg + s->args.nelts - 1; 680 end = arg + s->args.nelts - 1;
710 ngx_memcpy(s->smtp_from.data, cmd.data, cmd.len); 692 ngx_memcpy(s->smtp_from.data, cmd.data, cmd.len);
711 693
712 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, 694 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
713 "smtp mail from:\"%V\"", &s->smtp_from); 695 "smtp mail from:\"%V\"", &s->smtp_from);
714 696
715 s->out.len = sizeof(smtp_ok) - 1; 697 ngx_str_set(&s->out, smtp_ok);
716 s->out.data = smtp_ok;
717 698
718 return NGX_OK; 699 return NGX_OK;
719 } 700 }
720 701
721 702
723 ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c) 704 ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c)
724 { 705 {
725 ngx_str_t *arg, *end, cmd; 706 ngx_str_t *arg, *end, cmd;
726 707
727 if (s->smtp_from.len == 0) { 708 if (s->smtp_from.len == 0) {
728 s->out.len = sizeof(smtp_bad_sequence) - 1; 709 ngx_str_set(&s->out, smtp_bad_sequence);
729 s->out.data = smtp_bad_sequence;
730 return NGX_OK; 710 return NGX_OK;
731 } 711 }
732 712
733 arg = s->args.elts; 713 arg = s->args.elts;
734 end = arg + s->args.nelts - 1; 714 end = arg + s->args.nelts - 1;
755 735
756 736
757 static ngx_int_t 737 static ngx_int_t
758 ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c) 738 ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c)
759 { 739 {
760 s->smtp_from.len = 0; 740 ngx_str_null(&s->smtp_from);
761 s->smtp_from.data = NULL; 741 ngx_str_null(&s->smtp_to);
762 s->smtp_to.len = 0; 742 ngx_str_set(&s->out, smtp_ok);
763 s->smtp_to.data = NULL;
764
765 s->out.len = sizeof(smtp_ok) - 1;
766 s->out.data = smtp_ok;
767 743
768 return NGX_OK; 744 return NGX_OK;
769 } 745 }
770 746
771 747
782 /* 758 /*
783 * RFC3207 requires us to discard any knowledge 759 * RFC3207 requires us to discard any knowledge
784 * obtained from client before STARTTLS. 760 * obtained from client before STARTTLS.
785 */ 761 */
786 762
787 s->smtp_helo.len = 0; 763 ngx_str_null(&s->smtp_helo);
788 s->smtp_helo.data = NULL; 764 ngx_str_null(&s->smtp_from);
789 s->smtp_from.len = 0; 765 ngx_str_null(&s->smtp_to);
790 s->smtp_from.data = NULL;
791 s->smtp_to.len = 0;
792 s->smtp_to.data = NULL;
793 766
794 c->read->handler = ngx_mail_starttls_handler; 767 c->read->handler = ngx_mail_starttls_handler;
795 return NGX_OK; 768 return NGX_OK;
796 } 769 }
797 } 770 }