Mercurial > hg > nginx
comparison src/mail/ngx_mail_proxy_module.c @ 2311:6bad42a41dd8
do not close session if SMTP backend returned an error on RCPT TO
patch by Maxim Dounin
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 13 Nov 2008 14:20:54 +0000 |
parents | 8156bc03982a |
children | 722b5aff05ae |
comparison
equal
deleted
inserted
replaced
2310:842a558c3bc5 | 2311:6bad42a41dd8 |
---|---|
102 NULL, /* exit master */ | 102 NULL, /* exit master */ |
103 NGX_MODULE_V1_PADDING | 103 NGX_MODULE_V1_PADDING |
104 }; | 104 }; |
105 | 105 |
106 | 106 |
107 static u_char smtp_auth_ok[] = "235 2.0.0 OK" CRLF; | |
108 static u_char smtp_ok[] = "250 2.0.0 OK" CRLF; | 107 static u_char smtp_ok[] = "250 2.0.0 OK" CRLF; |
109 | 108 |
110 | 109 |
111 void | 110 void |
112 ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_peer_addr_t *peer) | 111 ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_peer_addr_t *peer) |
610 case ngx_smtp_to: | 609 case ngx_smtp_to: |
611 | 610 |
612 b = s->proxy->buffer; | 611 b = s->proxy->buffer; |
613 | 612 |
614 if (s->auth_method == NGX_MAIL_AUTH_NONE) { | 613 if (s->auth_method == NGX_MAIL_AUTH_NONE) { |
614 b->pos = b->start; | |
615 | |
616 } else { | |
615 ngx_memcpy(b->start, smtp_ok, sizeof(smtp_ok) - 1); | 617 ngx_memcpy(b->start, smtp_ok, sizeof(smtp_ok) - 1); |
616 b->last = b->start + sizeof(smtp_ok) - 1; | 618 b->last = b->start + sizeof(smtp_ok) - 1; |
617 | 619 } |
618 } else { | |
619 ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1); | |
620 b->last = b->start + sizeof(smtp_auth_ok) - 1; | |
621 } | |
622 | |
623 b->pos = b->start; | |
624 | 620 |
625 s->connection->read->handler = ngx_mail_proxy_handler; | 621 s->connection->read->handler = ngx_mail_proxy_handler; |
626 s->connection->write->handler = ngx_mail_proxy_handler; | 622 s->connection->write->handler = ngx_mail_proxy_handler; |
627 rev->handler = ngx_mail_proxy_handler; | 623 rev->handler = ngx_mail_proxy_handler; |
628 c->write->handler = ngx_mail_proxy_handler; | 624 c->write->handler = ngx_mail_proxy_handler; |
757 break; | 753 break; |
758 | 754 |
759 default: /* NGX_MAIL_SMTP_PROTOCOL */ | 755 default: /* NGX_MAIL_SMTP_PROTOCOL */ |
760 switch (state) { | 756 switch (state) { |
761 | 757 |
762 case ngx_smtp_helo: | 758 case ngx_smtp_start: |
763 case ngx_smtp_helo_from: | 759 if (p[0] == '2' && p[1] == '2' && p[2] == '0') { |
764 case ngx_smtp_helo_xclient: | |
765 case ngx_smtp_from: | |
766 case ngx_smtp_to: | |
767 if (p[0] == '2' && p[1] == '5' && p[2] == '0') { | |
768 return NGX_OK; | 760 return NGX_OK; |
769 } | 761 } |
770 break; | 762 break; |
771 | 763 |
772 case ngx_smtp_start: | 764 case ngx_smtp_helo: |
773 if (p[0] == '2' && p[1] == '2' && p[2] == '0') { | 765 case ngx_smtp_helo_xclient: |
766 case ngx_smtp_helo_from: | |
767 case ngx_smtp_from: | |
768 if (p[0] == '2' && p[1] == '5' && p[2] == '0') { | |
774 return NGX_OK; | 769 return NGX_OK; |
775 } | 770 } |
776 break; | 771 break; |
777 | 772 |
778 case ngx_smtp_xclient: | 773 case ngx_smtp_xclient: |
779 case ngx_smtp_xclient_from: | 774 case ngx_smtp_xclient_from: |
780 if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') { | 775 if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') { |
781 return NGX_OK; | 776 return NGX_OK; |
782 } | 777 } |
783 break; | 778 break; |
779 | |
780 case ngx_smtp_to: | |
781 return NGX_OK; | |
784 } | 782 } |
785 | 783 |
786 break; | 784 break; |
787 } | 785 } |
788 | 786 |