From e657bef4282a62cd266d047bd7113138ec47859a Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sun, 13 Jan 2013 22:41:15 +0000 Subject: [PATCH] Log individual PRDR responses as seen by client side. --- src/src/globals.c | 2 +- src/src/globals.h | 2 +- src/src/local_scan.h | 4 --- src/src/receive.c | 72 +++++++++++++++---------------------- test/log/5500 | 7 +++- test/scripts/5500-PRDR/5500 | 3 +- test/stdout/5500 | 10 +++--- 7 files changed, 43 insertions(+), 57 deletions(-) diff --git a/src/src/globals.c b/src/src/globals.c index f4f1a7395..5db858bfc 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -149,7 +149,7 @@ uschar *tls_verify_hosts = NULL; /* Per Recipient Data Response variables */ BOOL prdr_enable = FALSE; BOOL prdr_requested = FALSE; -pcre *regex_PRDR = NULL; +const pcre *regex_PRDR = NULL; #endif /* Input-reading functions for messages, so we can use special ones for diff --git a/src/src/globals.h b/src/src/globals.h index 330c557d7..8d83be710 100644 --- a/src/src/globals.h +++ b/src/src/globals.h @@ -149,7 +149,7 @@ extern uschar *acl_smtp_connect; /* ACL run on SMTP connection */ extern uschar *acl_smtp_data; /* ACL run after DATA received */ #ifdef EXPERIMENTAL_PRDR extern uschar *acl_smtp_data_prdr; /* ACL run after DATA received if in PRDR mode*/ -extern pcre *regex_PRDR; /* For recognizing PRDR settings */ +const extern pcre *regex_PRDR; /* For recognizing PRDR settings */ #endif #ifndef DISABLE_DKIM extern uschar *acl_smtp_dkim; /* ACL run for DKIM signatures / domains */ diff --git a/src/src/local_scan.h b/src/src/local_scan.h index 74a16023d..057e4d428 100644 --- a/src/src/local_scan.h +++ b/src/src/local_scan.h @@ -131,10 +131,6 @@ typedef struct recipient_item { #ifdef EXPERIMENTAL_BRIGHTMAIL uschar *bmi_optin; #endif -#ifdef EXPERIMENTAL_PRDR - int prdr_rc; /* ACL return code for this recipient */ - uschar *prdr_user_msg; /* User specified message */ -#endif } recipient_item; diff --git a/src/src/receive.c b/src/src/receive.c index 9dfaed0a3..7145ec24a 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -3238,61 +3238,47 @@ else /* Loop through recipients, responses must be in same order received */ for (c = 0; recipients_count > c; c++) { + uschar * addr= recipients_list[c].address; + uschar * msg= US"PRDR R=<%s> %s"; uschar * code; DEBUG(D_receive) debug_printf("PRDR processing recipient %s (%d of %d)\n", - recipients_list[c].address, c+1, recipients_count); - rc = acl_check(ACL_WHERE_PRDR, recipients_list[c].address, + addr, c+1, recipients_count); + rc = acl_check(ACL_WHERE_PRDR, addr, acl_smtp_data_prdr, &user_msg, &log_msg); - recipients_list[c].prdr_rc = rc; - recipients_list[c].prdr_user_msg = user_msg - ? string_sprintf("%s: %s", recipients_list[c].address, user_msg) - : NULL; - /* If any recipient rejected content, then indicate it in final message */ + /* If any recipient rejected content, indicate it in final message */ all_pass |= rc; /* If all recipients rejected, indicate in final message */ all_fail &= rc; switch (rc) { - case OK: - case DISCARD: - code = US"250"; - if (user_msg != NULL) - smtp_user_msg(code, user_msg); - else - smtp_printf("250 OK PRDR accepted for %s\r\n", - recipients_list[c].address); - /* Decrement the counter _after_ removing the address * - * so that it points to the previous good one or zero * - * if result is to blackhole. */ - if (rc == DISCARD) - receive_remove_recipient(recipients_list[c--].address); - break; - - case DEFER: - code = US"450"; - if (user_msg != NULL) - smtp_user_msg(code, user_msg); - else - smtp_user_msg(code, string_sprintf( - "%s temporarily refuses the content", - recipients_list[c].address)); - receive_remove_recipient(recipients_list[c--].address); - break; - - default: - code = US"550"; - if (user_msg != NULL) - smtp_user_msg(code, user_msg); - else - smtp_user_msg(code, string_sprintf( - "%s refuses the content", - recipients_list[c].address)); - receive_remove_recipient(recipients_list[c--].address); - break; + case OK: case DISCARD: code = US"250"; break; + case DEFER: code = US"450"; break; + default: code = US"550"; break; } + if (user_msg != NULL) + smtp_user_msg(code, user_msg); + else + { + switch (rc) + { + case OK: case DISCARD: + msg = string_sprintf(msg, addr, "acceptance"); break; + case DEFER: + msg = string_sprintf(msg, addr, "temporary refusal"); break; + default: + msg = string_sprintf(msg, addr, "refusal"); break; + } + smtp_user_msg(code, msg); + } + if (log_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, log_msg); + else if (user_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, user_msg); + else log_write(0, LOG_MAIN, msg); + + if (rc != OK) + receive_remove_recipient(recipients_list[c--].address); } /* Set up final message, used if data acl gives OK */ smtp_reply = string_sprintf("%s id=%s message %s", diff --git a/test/log/5500 b/test/log/5500 index daa1f0715..f96a1ccc4 100644 --- a/test/log/5500 +++ b/test/log/5500 @@ -1,4 +1,9 @@ 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225 -1999-03-02 09:44:33 10HmaX-0005vi-00 H=(rhu.barb) [127.0.0.1] F=<> rejected after DATA +1999-03-02 09:44:33 10HmaY-0005vi-00 PRDR R= acceptance +1999-03-02 09:44:33 10HmaY-0005vi-00 PRDR R= temporary refusal +1999-03-02 09:44:33 10HmaY-0005vi-00 PRDR R= refusal 1999-03-02 09:44:33 10HmaY-0005vi-00 => userx R=r0 T=t1 1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 10HmaX-0005vi-00 PRDR R= acceptance +1999-03-02 09:44:33 10HmaX-0005vi-00 PRDR R= acceptance +1999-03-02 09:44:33 10HmaX-0005vi-00 H=(rhu.barb) [127.0.0.1] F=<> rejected after DATA diff --git a/test/scripts/5500-PRDR/5500 b/test/scripts/5500-PRDR/5500 index d52501788..57d4290e1 100644 --- a/test/scripts/5500-PRDR/5500 +++ b/test/scripts/5500-PRDR/5500 @@ -35,8 +35,7 @@ Sender: sender@some.where quit ??? 221 **** -#sleep 1 -#killdaemon +sleep 1 # # # 2: traditional data acl should be called, resulting in an overall reject diff --git a/test/stdout/5500 b/test/stdout/5500 index e3d40ac00..debe3499b 100644 --- a/test/stdout/5500 +++ b/test/stdout/5500 @@ -34,11 +34,11 @@ Connecting to 127.0.0.1 port 1225 ... connected ??? 353 <<< 353 PRDR content analysis beginning ??? 250 -<<< 250 OK PRDR accepted for userx@test.ex +<<< 250 PRDR R= acceptance ??? 450 -<<< 450 usery@test.ex temporarily refuses the content +<<< 450 PRDR R= temporary refusal ??? 550 -<<< 550 userz@test.ex refuses the content +<<< 550 PRDR R= refusal ??? 250 <<< 250 id=10HmaY-0005vi-00 message accepted for some recipients >>> quit @@ -78,9 +78,9 @@ Connecting to 127.0.0.1 port 1225 ... connected ??? 353 <<< 353 PRDR content analysis beginning ??? 250 -<<< 250 OK PRDR accepted for userp@test.ex +<<< 250 PRDR R= acceptance ??? 250 -<<< 250 OK PRDR accepted for userq@test.ex +<<< 250 PRDR R= acceptance ??? 550 <<< 550 Administrative prohibition >>> quit -- 2.25.1