From df8632277e3058a3eb2bec5bdf6a67311ffad6d6 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Mon, 14 Jan 2013 22:10:05 +0000 Subject: [PATCH] Fix PRDR client for server that shortcuts response sequence --- src/src/transports/smtp.c | 4 +- test/log/5510 | 36 +++++++++------ test/scripts/5500-PRDR/5510 | 66 +++++++++++++++++++++++++--- test/stdout/5510 | 88 ++++++++++++++++++++++++++++++------- 4 files changed, 155 insertions(+), 39 deletions(-) diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 144718a65..ee260a129 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -1774,7 +1774,9 @@ if (!ok) ok = TRUE; else if (!ok && errno == 0) switch(buffer[0]) { - case '2': prdr_active = FALSE; break; + case '2': prdr_active = FALSE; + ok = TRUE; + break; case '4': errno = ERRNO_DATA4XX; addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8; break; diff --git a/test/log/5510 b/test/log/5510 index 5cf25f1db..86a9babfe 100644 --- a/test/log/5510 +++ b/test/log/5510 @@ -3,21 +3,29 @@ 1999-03-02 09:44:33 10HmaX-0005vi-00 -> userz@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] PRDR C="250 second rcpt was good" 1999-03-02 09:44:33 10HmaX-0005vi-00 Completed 1999-03-02 09:44:33 10HmaY-0005vi-00 <= userx@test.ex U=CALLER P=local S=sss -1999-03-02 09:44:33 10HmaY-0005vi-00 => usery@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] PRDR C="250 first rcpt was good" -1999-03-02 09:44:33 10HmaY-0005vi-00 == userz@test.ex R=r0 T=t1 defer (0): PRDR error after DATA: 450 cannot handle second rcpt right now -1999-03-02 09:44:33 10HmaZ-0005vi-00 <= <> U=CALLER P=local S=sss -1999-03-02 09:44:33 10HmaZ-0005vi-00 => userp@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] PRDR C="250 first rcpt was good" -1999-03-02 09:44:33 10HmaZ-0005vi-00 ** userq@test.ex R=r0 T=t1: PRDR error after DATA: 550 second rcpt does not like content -1999-03-02 09:44:33 10HmaZ-0005vi-00 Frozen (delivery error message) -1999-03-02 09:44:33 10HmaY-0005vi-00 == userz@test.ex routing defer (-51): retry time not reached +1999-03-02 09:44:33 10HmaY-0005vi-00 => user2.1@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] C="250 OK got that" +1999-03-02 09:44:33 10HmaY-0005vi-00 -> user2.2@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] C="250 OK got that" +1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 10HmaZ-0005vi-00 <= userx@test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaZ-0005vi-00 => usery@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] PRDR C="250 first rcpt was good" +1999-03-02 09:44:33 10HmaZ-0005vi-00 == userz@test.ex R=r0 T=t1 defer (0): PRDR error after DATA: 450 cannot handle second rcpt right now 1999-03-02 09:44:33 10HmbA-0005vi-00 <= <> U=CALLER P=local S=sss -1999-03-02 09:44:33 10HmbA-0005vi-00 ** user4.1@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 oops, overall rejection -1999-03-02 09:44:33 10HmbA-0005vi-00 ** user4.2@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 oops, overall rejection +1999-03-02 09:44:33 10HmbA-0005vi-00 => userp@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] PRDR C="250 first rcpt was good" +1999-03-02 09:44:33 10HmbA-0005vi-00 ** userq@test.ex R=r0 T=t1: PRDR error after DATA: 550 second rcpt does not like content 1999-03-02 09:44:33 10HmbA-0005vi-00 Frozen (delivery error message) +1999-03-02 09:44:33 10HmaZ-0005vi-00 == userz@test.ex routing defer (-51): retry time not reached 1999-03-02 09:44:33 10HmbB-0005vi-00 <= <> U=CALLER P=local S=sss -1999-03-02 09:44:33 10HmbB-0005vi-00 == user5.1@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please -1999-03-02 09:44:33 10HmbB-0005vi-00 == user5.2@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please -1999-03-02 09:44:33 10HmbB-0005vi-00 == user5.3@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please +1999-03-02 09:44:33 10HmbB-0005vi-00 ** user5.1@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 oops, overall rejection +1999-03-02 09:44:33 10HmbB-0005vi-00 ** user5.2@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 oops, overall rejection +1999-03-02 09:44:33 10HmbB-0005vi-00 Frozen (delivery error message) 1999-03-02 09:44:33 10HmbC-0005vi-00 <= <> U=CALLER P=local S=sss -1999-03-02 09:44:33 10HmbC-0005vi-00 => user6.1@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] C="250 OK, got that" -1999-03-02 09:44:33 10HmbC-0005vi-00 Completed +1999-03-02 09:44:33 10HmbC-0005vi-00 ** user6.1@test.ex R=r0 T=t1: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 naah mate +1999-03-02 09:44:33 10HmbC-0005vi-00 ** user6.2@test.ex R=r0 T=t1: SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 550 naah mate +1999-03-02 09:44:33 10HmbC-0005vi-00 Frozen (delivery error message) +1999-03-02 09:44:33 10HmbD-0005vi-00 <= <> U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbD-0005vi-00 == user7.1@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please +1999-03-02 09:44:33 10HmbD-0005vi-00 == user7.2@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please +1999-03-02 09:44:33 10HmbD-0005vi-00 == user7.3@test.ex R=r0 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 450 oops, try again later please +1999-03-02 09:44:33 10HmbE-0005vi-00 <= <> U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbE-0005vi-00 => user8.1@test.ex R=r0 T=t1 H=127.0.0.1 [127.0.0.1] C="250 OK, got that" +1999-03-02 09:44:33 10HmbE-0005vi-00 Completed diff --git a/test/scripts/5500-PRDR/5510 b/test/scripts/5500-PRDR/5510 index 8d6c899ca..e5063a47a 100644 --- a/test/scripts/5500-PRDR/5510 +++ b/test/scripts/5500-PRDR/5510 @@ -30,7 +30,33 @@ Some message text. **** # # -# 2: Two recipients, one accepted one tmp-rejected +# 2: Two recipients, accepted by traditional response +# though client offered full PRDR capability +server PORT_S +220 Server ready +EHLO +250- +250-PRDR +250 OK +MAIL FROM: PRDR +250 OK +RCPT TO +250 OK +RCPT TO +250 OK +DATA +300 gimme that body +. +250 OK got that +QUIT +250 OK, bye +**** +exim -odi -f userx user2.1 user2.2 +Some message text. +**** +# +# +# 3: Two recipients, one accepted one tmp-rejected server PORT_S 220 Server ready EHLO @@ -58,7 +84,7 @@ Some message text. **** # # -# 3: Two recipients, one accepted one rejected +# 4: Two recipients, one accepted one rejected # Avoid tester issues dealing with the bounce by sending # with a null from. # @@ -89,7 +115,7 @@ Some message text. **** # # -# 4: Two recipients, rejected by final. +# 5: Two recipients, rejected by final after PRDR accepts. # server PORT_S 220 Server ready @@ -113,12 +139,38 @@ DATA QUIT 250 OK **** -exim -odi -f "" user4.1 user4.2 +exim -odi -f "" user5.1 user5.2 +text +**** +# +# +# 6: Two recipients, rejected traditionally though PRDR negociated. +# +server PORT_S +220 Server ready +EHLO +250- +250-PRDR +250 OK +MAIL FROM:<> PRDR +250 OK +RCPT TO +250 OK +RCPT TO +250 OK +DATA +300 yeah baby +. +550 naah mate +QUIT +250 OK +**** +exim -odi -f "" user6.1 user6.2 text **** # # -# 5: Temp-reject at final +# 7: Temp-reject at final server PORT_S 220 Server ready EHLO @@ -144,7 +196,7 @@ DATA QUIT 250 OK **** -exim -odi -f "" user5.1 user5.2 user5.3 +exim -odi -f "" user7.1 user7.2 user7.3 text **** # @@ -169,7 +221,7 @@ DATA QUIT 250 OK, bye **** -exim -odi -f "" user6.1 +exim -odi -f "" user8.1 text **** # diff --git a/test/stdout/5510 b/test/stdout/5510 index 10842ed00..b9eb9dbd8 100644 --- a/test/stdout/5510 +++ b/test/stdout/5510 @@ -40,6 +40,34 @@ EHLO myhost.test.ex 250 OK MAIL FROM: PRDR 250 OK +RCPT TO: +250 OK +RCPT TO: +250 OK +DATA +300 gimme that body +Received: from CALLER by myhost.test.ex with local (Exim x.yz) + (envelope-from ) + id 10HmaY-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: +From: userx@test.ex +Date: Tue, 2 Mar 1999 09:44:33 +0000 + +Some message text. +. +250 OK got that +QUIT +250 OK, bye +End of script +Listening on port 1224 ... +Connection request from [127.0.0.1] +220 Server ready +EHLO myhost.test.ex +250- +250-PRDR +250 OK +MAIL FROM: PRDR +250 OK RCPT TO: 250 OK RCPT TO: @@ -48,8 +76,8 @@ DATA 300 gimme yer body Received: from CALLER by myhost.test.ex with local (Exim x.yz) (envelope-from ) - id 10HmaY-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 -Message-Id: + id 10HmaZ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: From: userx@test.ex Date: Tue, 2 Mar 1999 09:44:33 +0000 @@ -78,8 +106,8 @@ RCPT TO: DATA 300 gimme yer body Received: from CALLER by myhost.test.ex with local (Exim x.yz) - id 10HmaZ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 -Message-Id: + id 10HmbA-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: Date: Tue, 2 Mar 1999 09:44:33 +0000 Some message text. @@ -98,15 +126,15 @@ EHLO myhost.test.ex 250 OK MAIL FROM:<> PRDR 250 OK -RCPT TO: +RCPT TO: 250 OK -RCPT TO: +RCPT TO: 250 OK DATA 300 yeah baby Received: from CALLER by myhost.test.ex with local (Exim x.yz) - id 10HmbA-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 -Message-Id: + id 10HmbB-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: Date: Tue, 2 Mar 1999 09:44:33 +0000 text @@ -127,17 +155,43 @@ EHLO myhost.test.ex 250 OK MAIL FROM:<> PRDR 250 OK -RCPT TO: +RCPT TO: 250 OK -RCPT TO: +RCPT TO: 250 OK -RCPT TO: +DATA +300 yeah baby +Received: from CALLER by myhost.test.ex with local (Exim x.yz) + id 10HmbC-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: +Date: Tue, 2 Mar 1999 09:44:33 +0000 + +text +. +550 naah mate +QUIT +250 OK +End of script +Listening on port 1224 ... +Connection request from [127.0.0.1] +220 Server ready +EHLO myhost.test.ex +250- +250-PRDR +250 OK +MAIL FROM:<> PRDR +250 OK +RCPT TO: +250 OK +RCPT TO: +250 OK +RCPT TO: 250 OK DATA 300 go ahead Received: from CALLER by myhost.test.ex with local (Exim x.yz) - id 10HmbB-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 -Message-Id: + id 10HmbD-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: Date: Tue, 2 Mar 1999 09:44:33 +0000 text @@ -159,14 +213,14 @@ EHLO myhost.test.ex 250 OK MAIL FROM:<> 250 OK -RCPT TO: +RCPT TO: 250 OK DATA 300 go ahead Received: from CALLER by myhost.test.ex with local (Exim x.yz) - id 10HmbC-0005vi-00 - for user6.1@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 -Message-Id: + id 10HmbE-0005vi-00 + for user8.1@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: Date: Tue, 2 Mar 1999 09:44:33 +0000 text -- 2.25.1