Logging-only patch for 8BITMIME; bug 817.
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 4 Oct 2012 22:23:50 +0000 (23:23 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 6 Oct 2012 19:00:37 +0000 (20:00 +0100)
15 files changed:
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/src/globals.c
src/src/globals.h
src/src/macros.h
src/src/receive.c
src/src/smtp_in.c
test/confs/0566
test/log/0566
test/mail/0566.userx [new file with mode: 0644]
test/rejectlog/0566
test/scripts/0000-Basic/0566
test/stdout/0566

index 4ba31a0ce7ec18f163b663662288205e5278c219..2555139217a12f99f53ff3982b9aad9538be6aef 100644 (file)
@@ -13099,6 +13099,7 @@ Those options that undergo string expansion before use are marked with
 .option accept_8bitmime main boolean true
 .cindex "8BITMIME"
 .cindex "8-bit characters"
 .option accept_8bitmime main boolean true
 .cindex "8BITMIME"
 .cindex "8-bit characters"
+.cindex "log" "selectors"
 This option causes Exim to send 8BITMIME in its response to an SMTP
 EHLO command, and to accept the BODY= parameter on MAIL commands.
 However, though Exim is 8-bit clean, it is not a protocol converter, and it
 This option causes Exim to send 8BITMIME in its response to an SMTP
 EHLO command, and to accept the BODY= parameter on MAIL commands.
 However, though Exim is 8-bit clean, it is not a protocol converter, and it
@@ -13112,6 +13113,11 @@ A more detailed analysis of the issues is provided by Dan Bernstein:
 &url(http://cr.yp.to/smtp/8bitmime.html)
 .endd
 
 &url(http://cr.yp.to/smtp/8bitmime.html)
 .endd
 
+To log received 8BITMIME status use
+.code
+log_selector = +8bitmime
+.endd
+
 .option acl_not_smtp main string&!! unset
 .cindex "&ACL;" "for non-SMTP messages"
 .cindex "non-SMTP messages" "ACLs for"
 .option acl_not_smtp main string&!! unset
 .cindex "&ACL;" "for non-SMTP messages"
 .cindex "non-SMTP messages" "ACLs for"
@@ -33824,6 +33830,7 @@ log_selector = +arguments -retry_defer
 The list of optional log items is in the following table, with the default
 selection marked by asterisks:
 .display
 The list of optional log items is in the following table, with the default
 selection marked by asterisks:
 .display
+&` 8bitmime                   `&  received 8BITMIME status
 &`*acl_warn_skipped           `&  skipped &%warn%& statement in ACL
 &` address_rewrite            `&  address rewriting
 &` all_parents                `&  all parents in => lines
 &`*acl_warn_skipped           `&  skipped &%warn%& statement in ACL
 &` address_rewrite            `&  address rewriting
 &` all_parents                `&  all parents in => lines
index 84948f6ac083900a602842c2f965b821eece70f5..db1c5254c21d9cd5c8d97978d87692a279de0019 100644 (file)
@@ -78,6 +78,10 @@ JH/09 Add $headers_added variable, with content from use of ACL modifier
       add_header (but not yet added to the message).  Bugzilla 199.
 
 
       add_header (but not yet added to the message).  Bugzilla 199.
 
 
+JH/10 Add 8bitmime log_selector, for 8bitmime status on the received line.
+      Pulled from Bugzilla 817 by Wolfgang Breyha.
+
+
 
 Exim version 4.80
 -----------------
 
 Exim version 4.80
 -----------------
index 680d96cd1141fa247de48bfef0b7a960f29a25bf..2982fc4b5916e54349a399876ac7e388c71d6c29 100644 (file)
@@ -118,6 +118,8 @@ Version 4.81
 14. New expansion variable $headers_added with content from ACL add_header
     modifier (but not yet added to messsage).
 
 14. New expansion variable $headers_added with content from ACL add_header
     modifier (but not yet added to messsage).
 
+15. New 8bitmime status logging option for received messages.
+
 
 Version 4.80
 ------------
 
 Version 4.80
 ------------
index a66512f369e51e97c860fecb31b266332a0bf2c4..4361d6776c8bef5bc7327ff299dfb8c0930cab12 100644 (file)
@@ -98,6 +98,7 @@ Matt Bernstein            LMTP over socket
 Mike Bethune              Help with debugging an elusive ALRM signal bug
 Ard Biesheuvel            Lookup code for accessing an Interbase database
 Richard Birkett           Fix for empty -f address crash
 Mike Bethune              Help with debugging an elusive ALRM signal bug
 Ard Biesheuvel            Lookup code for accessing an Interbase database
 Richard Birkett           Fix for empty -f address crash
+Wolfgang Breyha           Logging of 8bitmime reception
 Dean Brooks               Fix for ratelimit per_rcpt in acl_not_smtp.
 Nick Burrett              Patch for CONFIGURE_FILE_USE_EUID in exicyclog
 Matthew Byng-Maddick      Patch for qualify_domain in redirect router
 Dean Brooks               Fix for ratelimit per_rcpt in acl_not_smtp.
 Nick Burrett              Patch for CONFIGURE_FILE_USE_EUID in exicyclog
 Matthew Byng-Maddick      Patch for qualify_domain in redirect router
index bcbe12d8201bbd186b99b80f40061f0e761678ed..ba6c8c6bac16447b337e24d1a904c66fd3e5b32a 100644 (file)
@@ -271,6 +271,7 @@ uschar *acl_wherecodes[]       = { US"550",     /* RCPT */
 
 BOOL    active_local_from_check = FALSE;
 BOOL    active_local_sender_retain = FALSE;
 
 BOOL    active_local_from_check = FALSE;
 BOOL    active_local_sender_retain = FALSE;
+int     body_8bitmime = 0;
 BOOL    accept_8bitmime        = TRUE; /* deliberately not RFC compliant */
 address_item  *addr_duplicate  = NULL;
 
 BOOL    accept_8bitmime        = TRUE; /* deliberately not RFC compliant */
 address_item  *addr_duplicate  = NULL;
 
@@ -734,6 +735,7 @@ selectors was getting close to filling a 32-bit word. */
 /* Note that this list must be in alphabetical order. */
 
 bit_table log_options[]        = {
 /* Note that this list must be in alphabetical order. */
 
 bit_table log_options[]        = {
+  { US"8bitmime",                     LX_8bitmime },
   { US"acl_warn_skipped",             LX_acl_warn_skipped },
   { US"address_rewrite",              L_address_rewrite },
   { US"all",                          L_all },
   { US"acl_warn_skipped",             LX_acl_warn_skipped },
   { US"address_rewrite",              L_address_rewrite },
   { US"all",                          L_all },
index 16caa41e9a4ac6766588e87cc6e85a3950b3b403..a27f62cfeedcfbf5afbe7136d623e7e749477294 100644 (file)
@@ -133,6 +133,7 @@ extern uschar **address_expansions[ADDRESS_EXPANSIONS_COUNT];
 /* General global variables */
 
 extern BOOL    accept_8bitmime;        /* Allow *BITMIME incoming */
 /* General global variables */
 
 extern BOOL    accept_8bitmime;        /* Allow *BITMIME incoming */
+extern int     body_8bitmime;          /* sender declared BODY= ; 7=7BIT, 8=8BITMIME */
 extern header_line *acl_added_headers; /* Headers added by an ACL */
 extern tree_node *acl_anchor;          /* Tree of named ACLs */
 extern uschar *acl_arg[9];             /* Argument to ACL call */
 extern header_line *acl_added_headers; /* Headers added by an ACL */
 extern tree_node *acl_anchor;          /* Tree of named ACLs */
 extern uschar *acl_arg[9];             /* Argument to ACL call */
index cec4733f65ffc1c557fd1bef9f0dfacb59ec6d77..30520021186a0573c2c8981653ab2dcce1849996 100644 (file)
@@ -409,6 +409,7 @@ set all the bits in a multi-word selector. */
 #define LX_tls_peerdn                  0x80400000
 #define LX_tls_sni                     0x80800000
 #define LX_unknown_in_list             0x81000000
 #define LX_tls_peerdn                  0x80400000
 #define LX_tls_sni                     0x80800000
 #define LX_unknown_in_list             0x81000000
+#define LX_8bitmime                    0x82000000
 
 #define L_default     (L_connection_reject        | \
                        L_delay_delivery           | \
 
 #define L_default     (L_connection_reject        | \
                        L_delay_delivery           | \
index 7b51805dca648f1f7c67d3fef182db3d9ec6b24e..8ac381addd7670f3d97abdf652cc80f500d01189 100644 (file)
@@ -3610,6 +3610,15 @@ if (sender_host_authenticated != NULL)
 sprintf(CS big_buffer, "%d", msg_size);
 s = string_append(s, &size, &sptr, 2, US" S=", big_buffer);
 
 sprintf(CS big_buffer, "%d", msg_size);
 s = string_append(s, &size, &sptr, 2, US" S=", big_buffer);
 
+/* log 8BITMIME mode announced in MAIL_FROM
+   0 ... no BODY= used
+   7 ... 7BIT
+   8 ... 8BITMIME */
+if (log_extra_selector & LX_8bitmime) {
+  sprintf(CS big_buffer, "%d", body_8bitmime);
+  s = string_append(s, &size, &sptr, 2, US" M8S=", big_buffer);
+}
+
 /* If an addr-spec in a message-id contains a quoted string, it can contain
 any characters except " \ and CR and so in particular it can contain NL!
 Therefore, make sure we use a printing-characters only version for the log.
 /* If an addr-spec in a message-id contains a quoted string, it can contain
 any characters except " \ and CR and so in particular it can contain NL!
 Therefore, make sure we use a printing-characters only version for the log.
index b1fea9daffebff2d22de36b5242d14feed92a861..e3746d99db3147db7e316e6c2f7359dc9d112b5e 100644 (file)
@@ -3320,10 +3320,20 @@ while (done <= 0)
         some sites want the action that is provided. We recognize both "8BITMIME"
         and "7BIT" as body types, but take no action. */
         case ENV_MAIL_OPT_BODY:
         some sites want the action that is provided. We recognize both "8BITMIME"
         and "7BIT" as body types, but take no action. */
         case ENV_MAIL_OPT_BODY:
-          if (accept_8bitmime &&
-              (strcmpic(value, US"8BITMIME") == 0 ||
-               strcmpic(value, US"7BIT") == 0) )
-            break;
+          if (accept_8bitmime) {
+            if (strcmpic(value, US"8BITMIME") == 0) {
+              body_8bitmime = 8;
+            } else if (strcmpic(value, US"7BIT") == 0) {
+              body_8bitmime = 7;
+            } else {
+              body_8bitmime = 0;
+              done = synprot_error(L_smtp_syntax_error, 501, NULL,
+                US"invalid data for BODY");
+              goto COMMAND_LOOP;
+            }
+            DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
+           break;
+          }
           arg_error = TRUE;
           break;
 
           arg_error = TRUE;
           break;
 
index e7a91c6944185b0a82a04a5995b46d610d922412..83e97fb18ce90e898d38bb60b88b939fa00dc36b 100644 (file)
@@ -1,4 +1,4 @@
-# Exim test configuration 0028
+# Exim test configuration 0566
 
 exim_path = EXIM_PATH
 host_lookup_order = bydns
 
 exim_path = EXIM_PATH
 host_lookup_order = bydns
@@ -6,6 +6,7 @@ primary_hostname = myhost.test.ex
 rfc1413_query_timeout = 0s
 spool_directory = DIR/spool
 log_file_path = DIR/spool/log/%slog
 rfc1413_query_timeout = 0s
 spool_directory = DIR/spool
 log_file_path = DIR/spool/log/%slog
+log_selector = +8bitmime
 gecos_pattern = ""
 gecos_name = CALLER_NAME
 
 gecos_pattern = ""
 gecos_name = CALLER_NAME
 
index e59c7336dcd305ac1b68f966e8c80d8cfcd7136a..0922615b32f17cd1a503e6373c295afac3890d8d 100644 (file)
@@ -3,3 +3,13 @@
 1999-03-02 09:44:33 ignoring AUTH=x@y from U=CALLER (client not authenticated)
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 ignoring AUTH=x@y from U=CALLER (client not authenticated)
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss M8S=0
+1999-03-02 09:44:33 10HmaX-0005vi-00 => userx <userx@test.ex> R=r2 T=local_delivery
+1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss M8S=7
+1999-03-02 09:44:33 10HmaY-0005vi-00 => userx <userx@test.ex> R=r2 T=local_delivery
+1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss M8S=8
+1999-03-02 09:44:33 10HmaZ-0005vi-00 => userx <userx@test.ex> R=r2 T=local_delivery
+1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed
+1999-03-02 09:44:33 SMTP call from CALLER dropped: too many syntax or protocol errors (last command was "foo")
diff --git a/test/mail/0566.userx b/test/mail/0566.userx
new file mode 100644 (file)
index 0000000..e5f0975
--- /dev/null
@@ -0,0 +1,39 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER (helo=Testing)
+       by myhost.test.ex with local-esmtp (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaX-0005vi-00
+       for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Subject: test
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+foo
+
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER (helo=Testing)
+       by myhost.test.ex with local-esmtp (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaY-0005vi-00
+       for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Subject: test
+Message-Id: <E10HmaY-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+foo
+
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER (helo=Testing)
+       by myhost.test.ex with local-esmtp (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaZ-0005vi-00
+       for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Subject: test
+Message-Id: <E10HmaZ-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+foo
+
index 67b5dc277848aa42e33977588022e40c414be324..7a420d042386720a7d466b8499c700ce0a0f3301 100644 (file)
@@ -1,2 +1,3 @@
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
 1999-03-02 09:44:33 U=CALLER F=<x@y> rejected RCPT <userx@test.ex>: SIZE value too big
+1999-03-02 09:44:33 SMTP call from CALLER dropped: too many syntax or protocol errors (last command was "foo")
index c4dc0d8aa274db0560d41c7c043671018262b184..b2c5f75b4890e7095b9a323e4f19ebc9aed1c538 100644 (file)
@@ -70,4 +70,57 @@ mail from:<x@y> BODY=8BITMIME SIZE=40004
 rcpt to:<userx@test.ex>
 quit
 ****
 rcpt to:<userx@test.ex>
 quit
 ****
+# no BODY, data
+exim -bs
+ehlo Testing
+mail from:<x@y>
+rcpt to:<userx@test.ex>
+data
+Subject: test
+
+foo
+.
+quit
+****
+sleep 1
+# 7bit BODY, data
+exim -bs
+ehlo Testing
+mail from:<x@y> BODY=7BIT
+rcpt to:<userx@test.ex>
+data
+Subject: test
+
+foo
+.
+quit
+****
+sleep 1
+# 8bit BODY, data
+exim -bs
+ehlo Testing
+mail from:<x@y> BODY=8BITMIME
+rcpt to:<userx@test.ex>
+data
+Subject: test
+
+foo
+.
+quit
+****
+sleep 1
+# bad BODY, data
+# should fail
+1
+exim -bs
+ehlo Testing
+mail from:<x@y> BODY=wrong
+rcpt to:<userx@test.ex>
+data
+Subject: test
+
+foo
+.
+quit
+****
 no_msglog_check
 no_msglog_check
index cb221f61143245599e6a50a4ee0828c44a561e97..d3465d49edd87709ebc720e34992d6dc90ae77e4 100644 (file)
 250 OK\r
 550 SIZE value too big\r
 221 myhost.test.ex closing connection\r
 250 OK\r
 550 SIZE value too big\r
 221 myhost.test.ex closing connection\r
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-myhost.test.ex Hello CALLER at Testing\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+250 OK\r
+250 Accepted\r
+354 Enter message, ending with "." on a line by itself\r
+250 OK id=10HmaX-0005vi-00\r
+221 myhost.test.ex closing connection\r
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-myhost.test.ex Hello CALLER at Testing\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+250 OK\r
+250 Accepted\r
+354 Enter message, ending with "." on a line by itself\r
+250 OK id=10HmaY-0005vi-00\r
+221 myhost.test.ex closing connection\r
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-myhost.test.ex Hello CALLER at Testing\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+250 OK\r
+250 Accepted\r
+354 Enter message, ending with "." on a line by itself\r
+250 OK id=10HmaZ-0005vi-00\r
+221 myhost.test.ex closing connection\r
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-myhost.test.ex Hello CALLER at Testing\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+501 invalid data for BODY\r
+503 sender not yet given\r
+503-All RCPT commands were rejected with this error:\r
+503-503 sender not yet given\r
+503 Valid RCPT command must precede DATA\r
+500 unrecognized command\r
+500 unrecognized command\r
+500-unrecognized command\r
+500 Too many syntax or protocol errors\r