Add args to trad. modifier acl call method
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 14 Jun 2012 19:44:58 +0000 (20:44 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 14 Jun 2012 19:44:58 +0000 (20:44 +0100)
src/src/acl.c

index a721665d445abb26bbc2520cea4240228ef836e0..45be2fd3604f8a52f05b69edc7cafe5caed42b68 100644 (file)
@@ -236,7 +236,7 @@ at the outer level. In the other cases, expansion already occurs in the
 checking functions. */
 
 static uschar cond_expand_at_top[] = {
 checking functions. */
 
 static uschar cond_expand_at_top[] = {
-  TRUE,    /* acl */
+  FALSE,   /* acl */
   TRUE,    /* add_header */
   FALSE,   /* authenticated */
 #ifdef EXPERIMENTAL_BRIGHTMAIL
   TRUE,    /* add_header */
   FALSE,   /* authenticated */
 #ifdef EXPERIMENTAL_BRIGHTMAIL
@@ -2785,13 +2785,40 @@ for (; cb != NULL; cb = cb->next)
     "discard" verb. */
 
     case ACLC_ACL:
     "discard" verb. */
 
     case ACLC_ACL:
-    rc = acl_check_internal(where, addr, arg, level+1, user_msgptr, log_msgptr);
-    if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD)
       {
       {
-      *log_msgptr = string_sprintf("nested ACL returned \"discard\" for "
-        "\"%s\" command (only allowed with \"accept\" or \"discard\")",
-        verbs[verb]);
-      return ERROR;
+      uschar * cp = arg;
+      uschar * tmp;
+      uschar * name;
+
+      if (!(tmp = string_dequote(&cp)) || !(name = expand_string(tmp)))
+        {
+        if (expand_string_forcedfail) continue;
+        *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
+          tmp, expand_string_message);
+        return search_find_defer? DEFER : ERROR;
+        }
+
+      for (acl_narg = 0; acl_narg < sizeof(acl_arg)/sizeof(*acl_arg); acl_narg++)
+        {
+       while (*cp && isspace(*cp)) cp++;
+       if (!*cp) break;
+       if (!(tmp = string_dequote(&cp)) || !(acl_arg[acl_narg] = expand_string(tmp)))
+          {
+          if (expand_string_forcedfail) continue;
+          *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
+            arg, expand_string_message);
+          return search_find_defer? DEFER : ERROR;
+          }
+       }
+
+      rc = acl_check_internal(where, addr, name, level+1, user_msgptr, log_msgptr);
+      if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD)
+        {
+        *log_msgptr = string_sprintf("nested ACL returned \"discard\" for "
+          "\"%s\" command (only allowed with \"accept\" or \"discard\")",
+          verbs[verb]);
+        return ERROR;
+        }
       }
     break;
 
       }
     break;