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