Mercurial > hg > nginx-mail
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 } |