On Fri, 29 Jul 2005, Philip Hazel wrote: > On Fri, 29 Jul 2005, Matthew Newton wrote: > > > Why not just put the data sent to exim in a variable, say $smtp_data, > > just before each ACL is called. > > RTFM: > > 39.12 Data for non-message ACLs > > When an ACL is being run for AUTH, EHLO, ETRN, EXPN, HELO, STARTTLS, or VRFY, > | > the remainder of the SMTP command line is placed in $smtp_command_argument.
[moved to exim-dev] However we were talking about envelope commands (MAIL and RCPT) so this is almost but not quite a solution. Matthew identified the right internal variable, though it's local to smtp_in.c. The documentation lists the situations in which it is passed through to acl_check() but in the case of RCPT the variable which is used for this is overloaded with the recipient address, so these two uses need to be separated. Is something like the following patch OK or would a bigger change make it cleaner overall? (I haven't even compiled this yet.) Tony. -- f.a.n.finch <[EMAIL PROTECTED]> http://dotat.at/ BISCAY: WEST 5 OR 6 BECOMING VARIABLE 3 OR 4. SHOWERS AT FIRST. MODERATE OR GOOD. Index: acl.c =================================================================== RCS file: /home/cvs/exim/exim-src/src/acl.c,v retrieving revision 1.43 diff -u -r1.43 acl.c --- acl.c 2 Aug 2005 15:19:20 -0000 1.43 +++ acl.c 16 Aug 2005 15:10:33 -0000 @@ -3345,8 +3345,8 @@ */ int -acl_check(int where, uschar *data_string, uschar *s, uschar **user_msgptr, - uschar **log_msgptr) +acl_check(int where, uschar *data_string, uschar *recipient, uschar *s, + uschar **user_msgptr, uschar **log_msgptr) { int rc; address_item adb; @@ -3355,12 +3355,13 @@ *user_msgptr = *log_msgptr = NULL; sender_verified_failed = NULL; ratelimiters_cmd = NULL; +addr = NULL; if (where == ACL_WHERE_RCPT) { adb = address_defaults; addr = &adb; - addr->address = data_string; + addr->address = recipient; if (deliver_split_address(addr) == DEFER) { *log_msgptr = US"defer in percent_hack_domains check"; @@ -3369,11 +3370,8 @@ deliver_domain = addr->domain; deliver_localpart = addr->local_part; } -else - { - addr = NULL; - smtp_command_argument = data_string; - } + +smtp_command_argument = data_string; rc = acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr); Index: functions.h =================================================================== RCS file: /home/cvs/exim/exim-src/src/functions.h,v retrieving revision 1.19 diff -u -r1.19 functions.h --- functions.h 9 Aug 2005 13:31:52 -0000 1.19 +++ functions.h 16 Aug 2005 15:10:33 -0000 @@ -39,7 +39,8 @@ /* Everything else... */ extern acl_block *acl_read(uschar *(*)(void), uschar **); -extern int acl_check(int, uschar *, uschar *, uschar **, uschar **); +extern int acl_check(int, uschar *, uschar *, uschar *, uschar **, + uschar **); extern uschar *auth_b64encode(uschar *, int); extern int auth_b64decode(uschar *, uschar **); extern int auth_call_pam(uschar *, uschar **); Index: mime.c =================================================================== RCS file: /home/cvs/exim/exim-src/src/mime.c,v retrieving revision 1.12 diff -u -r1.12 mime.c --- mime.c 16 Aug 2005 12:32:32 -0000 1.12 +++ mime.c 16 Aug 2005 15:10:33 -0000 @@ -656,7 +656,7 @@ mime_is_coverletter = !(context && context->context == MBC_ATTACHMENT); /* call ACL handling function */ - rc = acl_check(ACL_WHERE_MIME, NULL, acl, user_msgptr, log_msgptr); + rc = acl_check(ACL_WHERE_MIME, NULL, NULL, acl, user_msgptr, log_msgptr); mime_stream = NULL; mime_current_boundary = NULL; Index: receive.c =================================================================== RCS file: /home/cvs/exim/exim-src/src/receive.c,v retrieving revision 1.22 diff -u -r1.22 receive.c --- receive.c 1 Aug 2005 14:41:25 -0000 1.22 +++ receive.c 16 Aug 2005 15:10:33 -0000 @@ -2927,7 +2927,8 @@ if (acl_smtp_data != NULL && recipients_count > 0) { uschar *user_msg, *log_msg; - rc = acl_check(ACL_WHERE_DATA, NULL, acl_smtp_data, &user_msg, &log_msg); + rc = acl_check(ACL_WHERE_DATA, NULL, NULL, acl_smtp_data, + &user_msg, &log_msg); add_acl_headers(US"DATA"); if (rc == DISCARD) { @@ -2967,7 +2968,8 @@ if (acl_not_smtp != NULL) { uschar *user_msg, *log_msg; - rc = acl_check(ACL_WHERE_NOTSMTP, NULL, acl_not_smtp, &user_msg, &log_msg); + rc = acl_check(ACL_WHERE_NOTSMTP, NULL, NULL, acl_not_smtp, + &user_msg, &log_msg); if (rc == DISCARD) { recipients_count = 0; Index: smtp_in.c =================================================================== RCS file: /home/cvs/exim/exim-src/src/smtp_in.c,v retrieving revision 1.22 diff -u -r1.22 smtp_in.c --- smtp_in.c 2 Aug 2005 15:19:20 -0000 1.22 +++ smtp_in.c 16 Aug 2005 15:10:33 -0000 @@ -1547,8 +1547,8 @@ int rc; uschar *user_msg, *log_msg; smtp_data = US"in \"connect\" ACL"; /* For logged failure message */ - rc = acl_check(ACL_WHERE_CONNECT, US"", acl_smtp_connect, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_CONNECT, US"", NULL, acl_smtp_connect, + &user_msg, &log_msg); if (rc != OK) { (void)smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg); @@ -2179,8 +2179,8 @@ if (acl_smtp_auth != NULL) { - rc = acl_check(ACL_WHERE_AUTH, smtp_data, acl_smtp_auth, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_AUTH, smtp_data, NULL, acl_smtp_auth, + &user_msg, &log_msg); if (rc != OK) { done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg); @@ -2443,8 +2443,8 @@ if (acl_smtp_helo != NULL) { - rc = acl_check(ACL_WHERE_HELO, smtp_data, acl_smtp_helo, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_HELO, smtp_data, NULL, acl_smtp_helo, + &user_msg, &log_msg); if (rc != OK) { done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg); @@ -2751,7 +2751,7 @@ else { ignore_msg = US"rejected by ACL"; - rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth, + rc = acl_check(ACL_WHERE_MAILAUTH, NULL, NULL, acl_smtp_mailauth, &user_msg, &log_msg); } @@ -2905,7 +2905,8 @@ /* Apply an ACL check if one is defined, before responding */ rc = (acl_smtp_mail == NULL)? OK : - acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg); + acl_check(ACL_WHERE_MAIL, smtp_data, NULL, acl_smtp_mail, + &user_msg, &log_msg); if (rc == OK || rc == DISCARD) { @@ -3063,7 +3064,8 @@ for them. Otherwise, check the access control list for this recipient. */ rc = recipients_discarded? DISCARD : - acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg, &log_msg); + acl_check(ACL_WHERE_RCPT, smtp_data, recipient, acl_smtp_rcpt, + &user_msg, &log_msg); /* The ACL was happy */ @@ -3137,8 +3139,8 @@ if (acl_smtp_predata == NULL) rc = OK; else { enable_dollar_recipients = TRUE; - rc = acl_check(ACL_WHERE_PREDATA, NULL, acl_smtp_predata, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_PREDATA, NULL, NULL, acl_smtp_predata, + &user_msg, &log_msg); enable_dollar_recipients = FALSE; } @@ -3158,8 +3160,8 @@ case VRFY_CMD: - rc = acl_check(ACL_WHERE_VRFY, smtp_data, acl_smtp_vrfy, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_VRFY, smtp_data, NULL, acl_smtp_vrfy, + &user_msg, &log_msg); if (rc != OK) done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg); else @@ -3206,8 +3208,8 @@ case EXPN_CMD: - rc = acl_check(ACL_WHERE_EXPN, smtp_data, acl_smtp_expn, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_EXPN, smtp_data, NULL, acl_smtp_expn, + &user_msg, &log_msg); if (rc != OK) done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg); else @@ -3237,8 +3239,8 @@ if (acl_smtp_starttls != NULL) { - rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_STARTTLS, NULL, NULL, acl_smtp_starttls, + &user_msg, &log_msg); if (rc != OK) { done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg); @@ -3343,7 +3345,8 @@ if (acl_smtp_quit != NULL) { - rc = acl_check(ACL_WHERE_QUIT, US"", acl_smtp_quit,&user_msg,&log_msg); + rc = acl_check(ACL_WHERE_QUIT, US"", NULL, acl_smtp_quit, + &user_msg, &log_msg); if (rc == ERROR) log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s", log_msg); @@ -3435,8 +3438,8 @@ log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_data, host_and_ident(FALSE)); - rc = acl_check(ACL_WHERE_ETRN, smtp_data, acl_smtp_etrn, &user_msg, - &log_msg); + rc = acl_check(ACL_WHERE_ETRN, smtp_data, NULL, acl_smtp_etrn, + &user_msg, &log_msg); if (rc != OK) { done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg); -- ## List details at http://www.exim.org/mailman/listinfo/exim-dev Exim details at http://www.exim.org/ ##
