Mercurial > hg > nginx
comparison src/mail/ngx_mail_smtp_handler.c @ 3516:dd1570b6f237
ngx_str_set() and ngx_str_null()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 14 May 2010 09:56:37 +0000 |
parents | 0b6277a58a2d |
children | d620f497c50f |
comparison
equal
deleted
inserted
replaced
3515:76d252724db5 | 3516:dd1570b6f237 |
---|---|
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 } |