Relax rules on verb use in QUIT/not-QUIT ACLs. Bug 608
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 21 Feb 2015 23:51:57 +0000 (23:51 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 22 Feb 2015 00:01:35 +0000 (00:01 +0000)
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/acl.c
test/confs/0502
test/log/0502
test/paniclog/0502
test/stderr/0502
test/stdout/0502

index af000dc8fe6b52cccbd5c8dd61a532a6c61769d6..a647066ca2e5ebc9fd090ea97399f5117080d068 100644 (file)
@@ -27105,8 +27105,8 @@ the feature was not requested by the client.
 .cindex "QUIT, ACL for"
 The ACL for the SMTP QUIT command is anomalous, in that the outcome of the ACL
 does not affect the response code to QUIT, which is always 221. Thus, the ACL
-does not in fact control any access. For this reason, the only verbs that are
-permitted are &%accept%& and &%warn%&.
+does not in fact control any access. For this reason, it may only accept
+or warn as its final result.
 
 This ACL can be used for tasks such as custom logging at the end of an SMTP
 session. For example, you can use ACL variables in other ACLs to count
index c9e35733ead49bd29282abc0eb3ec07742c74003..b027a66113c3015cbd1604fd552b4259b31a3fcb 100644 (file)
@@ -70,11 +70,14 @@ JH/18 Bug 1581: Router and transport options headers_add/remove can
 JH/19 Bug 392: spamd_address, and clamd av_scanner, now support retry
       option values. 
 
-JH/20 BUG 1571: Ensure that $tls_in_peerdn is set, when verification fails
+JH/20 Bug 1571: Ensure that $tls_in_peerdn is set, when verification fails
       under OpenSSL.
 
 JH/21 Support for the A6 type of dns record is withdrawn.
 
+JH/22 Bug 608: The result of a QUIT or not-QUIT toplevel ACL now matters
+      rather than the verbs used.
+
 
 
 Exim version 4.85
index 18119ecfada9da97a575cde731b15e8b1b2b1aef..ea078f6fde8e571fea20420957ad972931929538 100644 (file)
@@ -4077,19 +4077,12 @@ while (acl != NULL)
   int cond;
   int basic_errno = 0;
   BOOL endpass_seen = FALSE;
+  BOOL acl_quit_check = level == 0
+    && (where == ACL_WHERE_QUIT || where == ACL_WHERE_NOTQUIT);
 
   *log_msgptr = *user_msgptr = NULL;
   acl_temp_details = FALSE;
 
-  if ((where == ACL_WHERE_QUIT || where == ACL_WHERE_NOTQUIT) &&
-      acl->verb != ACL_ACCEPT &&
-      acl->verb != ACL_WARN)
-    {
-    *log_msgptr = string_sprintf("\"%s\" is not allowed in a QUIT or not-QUIT ACL",
-      verbs[acl->verb]);
-    return ERROR;
-    }
-
   HDEBUG(D_acl) debug_printf("processing \"%s\"\n", verbs[acl->verb]);
 
   /* Clear out any search error message from a previous check before testing
@@ -4170,6 +4163,7 @@ while (acl != NULL)
     if (cond == OK)
       {
       HDEBUG(D_acl) debug_printf("end of %s: DEFER\n", acl_name);
+      if (acl_quit_check) goto badquit;
       acl_temp_details = TRUE;
       return DEFER;
       }
@@ -4179,6 +4173,7 @@ while (acl != NULL)
     if (cond == OK)
       {
       HDEBUG(D_acl) debug_printf("end of %s: DENY\n", acl_name);
+      if (acl_quit_check) goto badquit;
       return FAIL;
       }
     break;
@@ -4187,6 +4182,7 @@ while (acl != NULL)
     if (cond == OK || cond == DISCARD)
       {
       HDEBUG(D_acl) debug_printf("end of %s: DISCARD\n", acl_name);
+      if (acl_quit_check) goto badquit;
       return DISCARD;
       }
     if (endpass_seen)
@@ -4200,6 +4196,7 @@ while (acl != NULL)
     if (cond == OK)
       {
       HDEBUG(D_acl) debug_printf("end of %s: DROP\n", acl_name);
+      if (acl_quit_check) goto badquit;
       return FAIL_DROP;
       }
     break;
@@ -4208,6 +4205,7 @@ while (acl != NULL)
     if (cond != OK)
       {
       HDEBUG(D_acl) debug_printf("end of %s: not OK\n", acl_name);
+      if (acl_quit_check) goto badquit;
       return cond;
       }
     break;
@@ -4238,6 +4236,11 @@ while (acl != NULL)
 
 HDEBUG(D_acl) debug_printf("end of %s: implicit DENY\n", acl_name);
 return FAIL;
+
+badquit:
+  *log_msgptr = string_sprintf("QUIT or not-QUIT teplevel ACL may not fail "
+    "('%s' verb used incorrectly)", verbs[acl->verb]);
+  return ERROR;
 }
 
 
index aab2adaae1d5d1b8fd33f27a914744b27e818b38..cf3ceb74f001b629d1e200c00d44fc6cda872f84 100644 (file)
@@ -33,11 +33,17 @@ check_mail:
   warn  set acl_c1 = ${eval:$acl_c1+1}
   accept
 
+q_sub:
+  deny
+
 check_quit:
   warn     logwrite = Messages received: $acl_c1
            logwrite = Messages accepted: $acl_c0
            logwrite = Recipients:        $acl_c2
            logwrite = Accepted:          $acl_c3
+
+  require  !acl = q_sub
+
   LAST
 
 check_rcpt:
index d55bd6e3ecdc9b3cf6429dbf82e863216ccc8cbc..37d82e43bb5dd2511e2748d9dd123ebde1e1daef 100644 (file)
@@ -8,7 +8,7 @@
 1999-03-02 09:44:33 Messages accepted: 
 1999-03-02 09:44:33 Recipients:        
 1999-03-02 09:44:33 Accepted:          
-1999-03-02 09:44:33 ACL for QUIT returned ERROR: "deny" is not allowed in a QUIT or not-QUIT ACL
+1999-03-02 09:44:33 ACL for QUIT returned ERROR: QUIT or not-QUIT teplevel ACL may not fail ('deny' verb used incorrectly)
 1999-03-02 09:44:33 Messages received: 1
 1999-03-02 09:44:33 Messages accepted: 
 1999-03-02 09:44:33 Recipients:        
index 8ab24fba4245ffecde42ff10d77f6f1f82b24b52..71afc025badd10ef96766e652aaaee7c04d6afcc 100644 (file)
@@ -1 +1 @@
-1999-03-02 09:44:33 ACL for QUIT returned ERROR: "deny" is not allowed in a QUIT or not-QUIT ACL
+1999-03-02 09:44:33 ACL for QUIT returned ERROR: QUIT or not-QUIT teplevel ACL may not fail ('deny' verb used incorrectly)
index 8ab24fba4245ffecde42ff10d77f6f1f82b24b52..71afc025badd10ef96766e652aaaee7c04d6afcc 100644 (file)
@@ -1 +1 @@
-1999-03-02 09:44:33 ACL for QUIT returned ERROR: "deny" is not allowed in a QUIT or not-QUIT ACL
+1999-03-02 09:44:33 ACL for QUIT returned ERROR: QUIT or not-QUIT teplevel ACL may not fail ('deny' verb used incorrectly)
index 4b307e8171ac7af0aee81649892edfbf19c83ed5..a0fbe6b0000e8cc2d8d25d625cf637a04ebdc3a6 100644 (file)
@@ -15,7 +15,7 @@
 250 OK id=10HmaY-0005vi-00\r
 221 Your message here\r
 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
-221 myhost.test.ex closing connection\r
+221 Your message here\r
 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
 250 OK\r
 221 myhost.test.ex closing connection\r