X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Facl.c;h=5af408c5c1346440df8bc6c2758c4d7a39fa7c18;hb=d9d29e0555e6a3bf33cc616693d98c982796201f;hp=6ae3680b789b5f20c249bf467698b013ee1af2aa;hpb=362145b5072e8d863d74c4fed8d7c1377c783b87;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/acl.c b/src/src/acl.c index 6ae3680b7..5af408c5c 100644 --- a/src/src/acl.c +++ b/src/src/acl.c @@ -1074,14 +1074,14 @@ do /* contains embedded newline; needs doubling */ ret = string_cat(ret, &size, &ptr, s, cp-s+1); - ret = string_cat(ret, &size, &ptr, "\n", 1); + ret = string_cat(ret, &size, &ptr, US"\n", 1); s = cp+1; } /* last bit of header */ ret = string_cat(ret, &size, &ptr, s, cp-s+1); /* newline-sep list */ } -while(h = h->next); +while((h = h->next)); ret[ptr-1] = '\0'; /* overwrite last newline */ return ret; @@ -3954,8 +3954,11 @@ acl_check_wargs(int where, address_item *addr, uschar *s, int level, { uschar * tmp; uschar * tmp_arg[9]; /* must match acl_arg[] */ +uschar * sav_arg[9]; /* must match acl_arg[] */ +int sav_narg; uschar * name; int i; +int ret; if (!(tmp = string_dequote(&s)) || !(name = expand_string(tmp))) goto bad; @@ -3970,11 +3973,25 @@ for (i = 0; i < 9; i++) goto bad; } } + +sav_narg = acl_narg; acl_narg = i; -for (i = 0; i < acl_narg; i++) acl_arg[i] = tmp_arg[i]; -while (i < 9) acl_arg[i++] = NULL; +for (i = 0; i < acl_narg; i++) + { + sav_arg[i] = acl_arg[i]; + acl_arg[i] = tmp_arg[i]; + } +while (i < 9) + { + sav_arg[i] = acl_arg[i]; + acl_arg[i++] = NULL; + } + +ret = acl_check_internal(where, addr, name, level, user_msgptr, log_msgptr); -return acl_check_internal(where, addr, name, level, user_msgptr, log_msgptr); +acl_narg = sav_narg; +for (i = 0; i < 9; i++) acl_arg[i] = sav_arg[i]; +return ret; bad: if (expand_string_forcedfail) return ERROR; @@ -3989,6 +4006,34 @@ return search_find_defer?DEFER:ERROR; * Check access using an ACL * *************************************************/ +/* Alternate interface for ACL, used by expansions */ +int +acl_eval(int where, uschar *s, uschar **user_msgptr, uschar **log_msgptr) +{ +address_item adb; +address_item *addr = NULL; + +*user_msgptr = *log_msgptr = NULL; +sender_verified_failed = NULL; +ratelimiters_cmd = NULL; +log_reject_target = LOG_MAIN|LOG_REJECT; + +if (where == ACL_WHERE_RCPT) + { + adb = address_defaults; + addr = &adb; + addr->address = expand_string(US"$local_part@$domain"); + addr->domain = deliver_domain; + addr->local_part = deliver_localpart; + addr->cc_local_part = deliver_localpart; + addr->lc_local_part = deliver_localpart; + } + +return acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr); +} + + + /* This is the external interface for ACL checks. It sets up an address and the expansions for $domain and $local_part when called after RCPT, then calls acl_check_internal() to do the actual work. @@ -4007,6 +4052,7 @@ Returns: OK access is granted by an ACCEPT verb DEFER can't tell at the moment ERROR disaster */ +int acl_where = ACL_WHERE_UNKNOWN; int acl_check(int where, uschar *recipient, uschar *s, uschar **user_msgptr, @@ -4035,7 +4081,9 @@ if (where == ACL_WHERE_RCPT) deliver_localpart = addr->local_part; } +acl_where = where; rc = acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr); +acl_where = ACL_WHERE_UNKNOWN; /* Cutthrough - if requested, and WHERE_RCPT and not yet opened conn as result of recipient-verify, @@ -4118,7 +4166,6 @@ return rc; } - /************************************************* * Create ACL variable * *************************************************/