[exim-cvs] Code for verify=header_names_ascii

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Exim Git Commits Mailing List
Date:  
À: exim-cvs
Sujet: [exim-cvs] Code for verify=header_names_ascii
Gitweb: http://git.exim.org/exim.git/commitdiff/770747fd28008931d72a9f87be83286eaf626a95
Commit:     770747fd28008931d72a9f87be83286eaf626a95
Parent:     76f44207fdf9cc3360a131a2297e6fa33080e323
Author:     Michael Fischer v. Mollard <info@???>
AuthorDate: Wed Mar 5 18:19:24 2014 -0800
Committer:  Todd Lyons <tlyons@???>
CommitDate: Thu Mar 6 08:28:36 2014 -0800


    Code for verify=header_names_ascii


    Documentation and test included.


    Fixed Conflicts:
        doc/doc-txt/ChangeLog
---
 doc/doc-docbook/spec.xfpt    |   17 +++++
 doc/doc-txt/ChangeLog        |    4 +
 doc/doc-txt/NewStuff         |    5 ++
 src/src/acl.c                |   19 ++++-
 src/src/functions.h          |    1 +
 src/src/verify.c             |   37 ++++++++++-
 test/confs/0569              |   34 ++++++++++
 test/log/0027                |    2 +-
 test/rejectlog/0027          |    2 +-
 test/scripts/0000-Basic/0569 |  147 ++++++++++++++++++++++++++++++++++++++++++
 test/stderr/0569             |  144 +++++++++++++++++++++++++++++++++++++++++
 test/stdout/0569             |   75 +++++++++++++++++++++
 12 files changed, 480 insertions(+), 7 deletions(-)


diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 40384c3..28c2ceb 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -27983,6 +27983,23 @@ This condition checks whether the sending host (the client) is authorized to
send email. Details of how this works are given in section
&<<SECTverifyCSA>>&.

+.new
+.vitem &*verify&~=&~header_names_ascii*&
+.cindex "&%verify%& ACL condition"
+.cindex "&ACL;" "verifying header names only ASCII"
+.cindex "header lines" "verifying header names only ASCII"
+.cindex "verifying" "header names only ASCII"
+This condition is relevant only in an ACL that is run after a message has been
+received, that is, in an ACL specified by &%acl_smtp_data%& or
+&%acl_not_smtp%&. It checks all header names (not the content) to make sure
+there are no non-ASCII characters, also excluding control characters. The
+allowable characters are decimal ASCII values 33 through 126.
+
+Exim itself will handle headers with non-ASCII characters, but it can cause
+problems for downstream applications, so this option will allow their
+detection and rejection in the DATA ACL's.
+.wen
+
.vitem &*verify&~=&~header_sender/*&<&'options'&>
.cindex "&%verify%& ACL condition"
.cindex "&ACL;" "verifying sender in the header"
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 331842f..889d6a4 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -37,6 +37,10 @@ PP/01 Continue incomplete 4.82 PP/19 by fixing docs too: use dns_dnssec_ok

JH/03 Bugzilla 1157: support log_selector smtp_confirmation for lmtp.

+TL/04 Add verify = header_names_ascii check to reject email with non-ASCII
+      characters in header names, implemented as a verify condition.
+      Contributed by Michael Fischer v. Mollard.
+


 Exim version 4.82
 -----------------
diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index 11cfcff..dd3e587 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -14,6 +14,11 @@ Version 4.83
     actual external source IP:host be used in exim instead of the IP of the
     proxy that is connecting to it.


+ 2. New verify option header_names_ascii, which will check to make sure
+    there are no non-ASCII characters in header names.  Exim itself handles
+    those non-ASCII characters, but downstream apps may not, so Exim can
+    detect and reject if those characters are present.
+


Version 4.82
------------
diff --git a/src/src/acl.c b/src/src/acl.c
index 29e0617..386754f 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -1650,7 +1650,8 @@ switch (dns_lookup(&dnsa, target, type, NULL))
*************************************************/

 enum { VERIFY_REV_HOST_LKUP, VERIFY_CERT, VERIFY_HELO, VERIFY_CSA, VERIFY_HDR_SYNTAX,
-  VERIFY_NOT_BLIND, VERIFY_HDR_SNDR, VERIFY_SNDR, VERIFY_RCPT
+       VERIFY_NOT_BLIND, VERIFY_HDR_SNDR, VERIFY_SNDR, VERIFY_RCPT,
+       VERIFY_HDR_NAMES_ASCII
   };
 typedef struct {
   uschar * name;
@@ -1670,7 +1671,8 @@ static verify_type_t verify_type_list[] = {
     { US"sender",          VERIFY_SNDR,        (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)
             |(1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP),
                                         FALSE, 6 },
-    { US"recipient",          VERIFY_RCPT,         (1<<ACL_WHERE_RCPT),    FALSE, 0 }
+    { US"recipient",          VERIFY_RCPT,         (1<<ACL_WHERE_RCPT),    FALSE, 0 },
+    { US"header_names_ascii",    VERIFY_HDR_NAMES_ASCII, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), TRUE, 0 }
   };



@@ -1820,6 +1822,15 @@ switch(vp->value)
       *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
     return rc;


+  case VERIFY_HDR_NAMES_ASCII:
+    /* Check that all header names are true 7 bit strings
+    See RFC 5322, 2.2. and RFC 6532, 3. */
+
+    rc = verify_check_header_names_ascii(log_msgptr);
+    if (rc != OK && smtp_return_error_details && *log_msgptr != NULL)
+      *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
+    return rc;
+
   case VERIFY_NOT_BLIND:
     /* Check that no recipient of this message is "blind", that is, every envelope
     recipient must be mentioned in either To: or Cc:. */
@@ -2202,8 +2213,8 @@ return rc;


 BAD_VERIFY:
 *log_msgptr = string_sprintf("expected \"sender[=address]\", \"recipient\", "
-  "\"helo\", \"header_syntax\", \"header_sender\" or "
-  "\"reverse_host_lookup\" at start of ACL condition "
+  "\"helo\", \"header_syntax\", \"header_sender\", \"header_names_ascii\" "
+  "or \"reverse_host_lookup\" at start of ACL condition "
   "\"verify %s\"", arg);
 return ERROR;
 }
diff --git a/src/src/functions.h b/src/src/functions.h
index 9d933fe..c6cb301 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -402,6 +402,7 @@ extern int     verify_check_dnsbl(uschar **);
 extern int     verify_check_header_address(uschar **, uschar **, int, int, int,
                  uschar *, uschar *, int, int *);
 extern int     verify_check_headers(uschar **);
+extern int     verify_check_header_names_ascii(uschar **);
 extern int     verify_check_host(uschar **);
 extern int     verify_check_notblind(void);
 extern int     verify_check_this_host(uschar **, unsigned int *, uschar*,
diff --git a/src/src/verify.c b/src/src/verify.c
index 711b3af..3d3bfda 100644
--- a/src/src/verify.c
+++ b/src/src/verify.c
@@ -538,7 +538,7 @@ else
     #endif
       if (!(done= smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer), '2', callout)))
         goto RESPONSE_FAILED;
-    
+
     /* Not worth checking greeting line for ESMTP support */
     if (!(esmtp = verify_check_this_host(&(ob->hosts_avoid_esmtp), NULL,
       host->name, host->address, NULL) != OK))
@@ -2155,6 +2155,41 @@ return yield;
 }



+/*************************************************
+*      Check header names for 8-bit characters   *
+*************************************************/
+
+/* This function checks for invalid charcters in header names. See
+RFC 5322, 2.2. and RFC 6532, 3.
+
+Arguments:
+  msgptr     where to put an error message
+
+Returns:     OK
+             FAIL
+*/
+
+int
+verify_check_header_names_ascii(uschar **msgptr)
+{
+header_line *h;
+uschar *colon, *s;
+
+for (h = header_list; h != NULL; h = h->next)
+  {
+   colon = Ustrchr(h->text, ':');
+   for(s = h->text; s < colon; s++)
+     {
+        if ((*s < 33) || (*s > 126))
+        {
+                *msgptr = string_sprintf("Invalid character in header \"%.*s\" found",
+                                         colon - h->text, h->text);
+                return FAIL;
+        }
+     }
+  }
+return OK;
+}


 /*************************************************
 *          Check for blind recipients            *
diff --git a/test/confs/0569 b/test/confs/0569
new file mode 100644
index 0000000..0987e7e
--- /dev/null
+++ b/test/confs/0569
@@ -0,0 +1,34 @@
+# Exim test configuration 0569
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+acl_smtp_mail = check_from
+acl_smtp_rcpt = accept
+acl_smtp_data = check_message
+
+recipient_unqualified_hosts = V4NET.10.10.9
+
+# ----- ACL -----
+
+begin acl
+
+check_from:
+  accept senders = usery@???
+         set acl_m_message = I do not like your message
+  accept
+
+check_message:
+  require message = ${if def:acl_m_message {$acl_m_message}}
+          verify = header_names_ascii
+  accept
+
+# End
diff --git a/test/log/0027 b/test/log/0027
index 9aade88..3dbfa02 100644
--- a/test/log/0027
+++ b/test/log/0027
@@ -3,7 +3,7 @@
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <postmaster@???>: Sender verify failed
 1999-03-02 09:44:33 U=CALLER F=<userx@???> rejected RCPT <userx@???>: deny for userx
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = header_syntax"@???>: cannot verify header_syntax in ACL for RCPT
-1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = junk"@???>: expected "sender[=address]", "recipient", "helo", "header_syntax", "header_sender" or "reverse_host_lookup" at start of ACL condition "verify junk"
+1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = junk"@???>: expected "sender[=address]", "recipient", "helo", "header_syntax", "header_sender", "header_names_ascii" or "reverse_host_lookup" at start of ACL condition "verify junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny vorify = junk"@???>: unknown ACL condition/modifier in "deny vorify = junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"dony verify = junk"@???>: unknown ACL verb "dony" in "dony verify = junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny !message = abcd"@???>: ACL error: negation is not allowed with "message"
diff --git a/test/rejectlog/0027 b/test/rejectlog/0027
index 24bcc70..b80e616 100644
--- a/test/rejectlog/0027
+++ b/test/rejectlog/0027
@@ -3,7 +3,7 @@
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <postmaster@???>: Sender verify failed
 1999-03-02 09:44:33 U=CALLER F=<userx@???> rejected RCPT <userx@???>: deny for userx
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = header_syntax"@???>: cannot verify header_syntax in ACL for RCPT
-1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = junk"@???>: expected "sender[=address]", "recipient", "helo", "header_syntax", "header_sender" or "reverse_host_lookup" at start of ACL condition "verify junk"
+1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny verify = junk"@???>: expected "sender[=address]", "recipient", "helo", "header_syntax", "header_sender", "header_names_ascii" or "reverse_host_lookup" at start of ACL condition "verify junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny vorify = junk"@???>: unknown ACL condition/modifier in "deny vorify = junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"dony verify = junk"@???>: unknown ACL verb "dony" in "dony verify = junk"
 1999-03-02 09:44:33 U=CALLER F=<> temporarily rejected RCPT <"deny !message = abcd"@???>: ACL error: negation is not allowed with "message"
diff --git a/test/scripts/0000-Basic/0569 b/test/scripts/0000-Basic/0569
new file mode 100644
index 0000000..41cdb87
--- /dev/null
+++ b/test/scripts/0000-Basic/0569
@@ -0,0 +1,147 @@
+# verify = header_names_ascii
+# 1. Headers are good, make sure no misfires.
+exim -bh V4NET.10.10.10
+mail from:<userx@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???
+Subject: testing
+
+.
+QUIT
+****
+# 2. A non-ASCII in header name, uses default rejection message
+exim -bh V4NET.10.10.10
+mail from:<userx@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???>
+Subject: testing
+
+.
+QUIT
+****
+# 3. A non-ASCII character in header name, different from sets an acl variable
+#    causing custom log message
+exim -bh V4NET.10.10.10
+mail from:<usery@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???>
+Subjec⍅: testing
+
+.
+QUIT
+****
+# 4. A non-ASCII character in header name, uses default rejection message
+exim -bh V4NET.10.10.10
+mail from:<userx@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???>
+Subjec⍅: testing
+
+.
+QUIT
+****
+# 5. Headers are good, Unicode in message body, make sure no misfires.
+exim -bh V4NET.10.10.10
+mail from:<userx@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???>
+Subject: testing
+
+Some unicode characters: 顷晦٦
+This email should be accepted because the headers are ok.
+.
+QUIT
+****
+# 6. Headers are good, Unicode in a header content *and* message body,
+#    make sure no misfires.
+exim -bh V4NET.10.10.10
+mail from:<userx@???>
+rcpt to:<userx@???>
+data
+Received: from mail.example.com([10.11.12.13] helo=mail.example.com)
+    by mail1-int.example.com with esmtp (Exim 4.80)
+    envelope-from <userx@???>
+    id 1WIJRL-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:57:00 +0000
+Received: from mail1-int.example.com([10.120.12.12] helo=mail1-int.example.com)
+    by webmail1.example.com with esmtp (Exim 4.80)
+    envelope-from <userx癑@exim.test.ex>
+    id 1WIJRK-0005Dw-MW
+    for XX@YY; Tue, 25 Feb 2014 15:56:58 +0000
+From: userx@???
+To: userx@???
+Cc: <abcd@???>
+Subject: testing
+
+Some unicode characters: 顷晦٦
+This email should be accepted because the headers are ok even though the
+content of one of the headers has unicode.
+.
+QUIT
+****
+no_msglog_check
diff --git a/test/stderr/0569 b/test/stderr/0569
new file mode 100644
index 0000000..b17c2ac
--- /dev/null
+++ b/test/stderr/0569
@@ -0,0 +1,144 @@
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> userx@??? in "usery@???"? no (end of list)
+>>> accept: condition test failed in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test succeeded in ACL "check_message"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_message"
+LOG: 10HmaX-0005vi-00 <= userx@??? H=[V4NET.10.10.10] P=smtp S=sss
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> userx@??? in "usery@???"? no (end of list)
+>>> accept: condition test failed in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test failed in ACL "check_message"
+LOG: 10HmbA-0005vi-00 H=[V4NET.10.10.10] F=<userx@???> rejected after DATA: Invalid character in header "Received" found
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> exim.test.ex in "exim.test.ex"? yes (matched "exim.test.ex")
+>>> usery@??? in "usery@???"? yes (matched "usery@???")
+>>> check set acl_m_message = I do not like your message
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test failed in ACL "check_message"
+LOG: 10HmbB-0005vi-00 H=[V4NET.10.10.10] F=<usery@???> rejected after DATA: Invalid character in header "Subjec⍅" found
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> userx@??? in "usery@???"? no (end of list)
+>>> accept: condition test failed in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test failed in ACL "check_message"
+LOG: 10HmbC-0005vi-00 H=[V4NET.10.10.10] F=<userx@???> rejected after DATA: Invalid character in header "Subjec⍅" found
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> userx@??? in "usery@???"? no (end of list)
+>>> accept: condition test failed in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test succeeded in ACL "check_message"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_message"
+LOG: 10HmaY-0005vi-00 <= userx@??? H=[V4NET.10.10.10] P=smtp S=sss
+>>> host in hosts_connection_nolog? no (option unset)
+>>> host in host_lookup? no (option unset)
+>>> host in host_reject_connection? no (option unset)
+>>> host in sender_unqualified_hosts? no (option unset)
+>>> host in recipient_unqualified_hosts? no (end of list)
+>>> host in helo_verify_hosts? no (option unset)
+>>> host in helo_try_verify_hosts? no (option unset)
+>>> host in helo_accept_junk_hosts? no (option unset)
+>>> using ACL "check_from"
+>>> processing "accept"
+>>> check senders = usery@???
+>>> userx@??? in "usery@???"? no (end of list)
+>>> accept: condition test failed in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_from"
+>>> processing "accept"
+>>> accept: condition test succeeded in inline ACL
+>>> host in ignore_fromline_hosts? no (option unset)
+>>> using ACL "check_message"
+>>> processing "require"
+>>> check verify = header_names_ascii
+>>> require: condition test succeeded in ACL "check_message"
+>>> processing "accept"
+>>> accept: condition test succeeded in ACL "check_message"
+LOG: 10HmaZ-0005vi-00 <= userx@??? H=[V4NET.10.10.10] P=smtp S=sss
diff --git a/test/stdout/0569 b/test/stdout/0569
new file mode 100644
index 0000000..9d82558
--- /dev/null
+++ b/test/stdout/0569
@@ -0,0 +1,75 @@
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+250 OK id=10HmaX-0005vi-00
+
+**** SMTP testing: that is not a real message id!
+
+221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+550 Administrative prohibition
+221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+550 I do not like your message
+221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+550 Administrative prohibition
+221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+250 OK id=10HmaY-0005vi-00
+
+**** SMTP testing: that is not a real message id!
+
+221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host V4NET.10.10.10
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+250 OK id=10HmaZ-0005vi-00
+
+**** SMTP testing: that is not a real message id!
+
+221 myhost.test.ex closing connection