diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2012-06-11 22:00:11 +0100 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2012-06-12 21:48:59 +0100 |
commit | 723c72e64c04d3b7bdf03b26c65761c1ae569312 (patch) | |
tree | 59639aa0abbfb181277712e07ddfd05ccafeed88 /src | |
parent | 585121e2682545b7afa599e039a7a1e2b1804570 (diff) |
Add ${acl {name}{arg}} expansion item.
Diffstat (limited to 'src')
-rw-r--r-- | src/src/expand.c | 42 | ||||
-rw-r--r-- | src/src/globals.c | 7 | ||||
-rw-r--r-- | src/src/macros.h | 4 |
3 files changed, 48 insertions, 5 deletions
diff --git a/src/src/expand.c b/src/src/expand.c index 965842611..16d5d74ab 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -102,6 +102,7 @@ bcrypt ({CRYPT}$2a$). alphabetical order. */ static uschar *item_table[] = { + US"acl", US"dlfunc", US"extract", US"filter", @@ -124,6 +125,7 @@ static uschar *item_table[] = { US"tr" }; enum { + EITEM_ACL, EITEM_DLFUNC, EITEM_EXTRACT, EITEM_FILTER, @@ -3641,6 +3643,45 @@ while (*s != 0) switch(item_type) { + /* Call an ACL from an expansion. We feed data in via $address_data. + If the ACL returns acceptance we return content set by "message =" + There is currently no limit on recursion; this would have us call + acl_check_internal() directly and get a current level from somewhere. + */ + + case EITEM_ACL: + { + int rc; + uschar *sub[2]; + uschar *new_yield; + uschar *user_msg; + uschar *log_msg; + switch(read_subs(sub, 2, 1, &s, skipping, TRUE, US"acl")) + { + case 1: goto EXPAND_FAILED_CURLY; + case 2: + case 3: goto EXPAND_FAILED; + } + if (skipping) continue; + + DEBUG(D_expand) + debug_printf("expanding: acl: %s arg: %s\n", sub[0], sub[1]?sub[1]:US"<none>"); + + deliver_address_data = sub[1]; + switch(rc = acl_check(ACL_WHERE_EXPANSION, NULL, sub[0], &user_msg, &log_msg)) + { + case OK: + if (user_msg) + yield = string_cat(yield, &size, &ptr, user_msg, Ustrlen(user_msg)); + continue; + case DEFER: + continue; + default: + expand_string_message = string_sprintf("acl \"%s\" did not accept", sub[0]); + goto EXPAND_FAILED; + } + } + /* Handle conditionals - preserve the values of the numerical expansion variables in case they get changed by a regular expression match in the condition. If not, they retain their external settings. At the end @@ -5533,7 +5574,6 @@ while (*s != 0) goto EXPAND_FAILED; } - if (skipping) continue; list = ((namedlist_block *)(t->data.ptr))->string; while ((item = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) diff --git a/src/src/globals.c b/src/src/globals.c index 97c7166ab..3ad38d39d 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -192,7 +192,6 @@ uschar *acl_not_smtp = NULL; uschar *acl_not_smtp_mime = NULL; #endif uschar *acl_not_smtp_start = NULL; - uschar *acl_smtp_auth = NULL; uschar *acl_smtp_connect = NULL; uschar *acl_smtp_data = NULL; @@ -240,7 +239,8 @@ uschar *acl_wherenames[] = { US"RCPT", US"NOTQUIT", US"QUIT", US"STARTTLS", - US"VRFY" + US"VRFY", + US"expansion" }; uschar *acl_wherecodes[] = { US"550", /* RCPT */ @@ -260,7 +260,8 @@ uschar *acl_wherecodes[] = { US"550", /* RCPT */ US"0", /* NOTQUIT; not relevant */ US"0", /* QUIT; not relevant */ US"550", /* STARTTLS */ - US"252" /* VRFY */ + US"252", /* VRFY */ + US"0" /* unknown; not relevant */ }; BOOL active_local_from_check = FALSE; diff --git a/src/src/macros.h b/src/src/macros.h index b17a80e10..d25071aae 100644 --- a/src/src/macros.h +++ b/src/src/macros.h @@ -820,7 +820,9 @@ enum { ACL_WHERE_RCPT, /* Some controls are for RCPT only */ ACL_WHERE_NOTQUIT, ACL_WHERE_QUIT, ACL_WHERE_STARTTLS, - ACL_WHERE_VRFY + ACL_WHERE_VRFY, + + ACL_WHERE_EXPANSION /* Currently used by a ${acl:name} expansion */ }; /* Situations for spool_write_header() */ |