From: Jeremy Harris Date: Thu, 4 Oct 2012 22:23:50 +0000 (+0100) Subject: Logging-only patch for 8BITMIME; bug 817. X-Git-Tag: exim-4_82_RC2~139 X-Git-Url: https://git.exim.org/users/jgh/exim.git/commitdiff_plain/3c0a92dcf8312d3071769e5a36946c651330e0e4 Logging-only patch for 8BITMIME; bug 817. --- diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index 4ba31a0ce..255513921 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -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" +.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 @@ -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 +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" @@ -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 +&` 8bitmime `& received 8BITMIME status &`*acl_warn_skipped `& skipped &%warn%& statement in ACL &` address_rewrite `& address rewriting &` all_parents `& all parents in => lines diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 84948f6ac..db1c5254c 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -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. +JH/10 Add 8bitmime log_selector, for 8bitmime status on the received line. + Pulled from Bugzilla 817 by Wolfgang Breyha. + + Exim version 4.80 ----------------- diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff index 680d96cd1..2982fc4b5 100644 --- a/doc/doc-txt/NewStuff +++ b/doc/doc-txt/NewStuff @@ -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). +15. New 8bitmime status logging option for received messages. + Version 4.80 ------------ diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS index a66512f36..4361d6776 100644 --- a/src/ACKNOWLEDGMENTS +++ b/src/ACKNOWLEDGMENTS @@ -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 +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 diff --git a/src/src/globals.c b/src/src/globals.c index bcbe12d82..ba6c8c6ba 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -271,6 +271,7 @@ uschar *acl_wherecodes[] = { US"550", /* RCPT */ 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; @@ -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[] = { + { US"8bitmime", LX_8bitmime }, { US"acl_warn_skipped", LX_acl_warn_skipped }, { US"address_rewrite", L_address_rewrite }, { US"all", L_all }, diff --git a/src/src/globals.h b/src/src/globals.h index 16caa41e9..a27f62cfe 100644 --- a/src/src/globals.h +++ b/src/src/globals.h @@ -133,6 +133,7 @@ extern uschar **address_expansions[ADDRESS_EXPANSIONS_COUNT]; /* 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 */ diff --git a/src/src/macros.h b/src/src/macros.h index cec4733f6..305200211 100644 --- a/src/src/macros.h +++ b/src/src/macros.h @@ -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_8bitmime 0x82000000 #define L_default (L_connection_reject | \ L_delay_delivery | \ diff --git a/src/src/receive.c b/src/src/receive.c index 7b51805dc..8ac381add 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -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); +/* 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. diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c index b1fea9daf..e3746d99d 100644 --- a/src/src/smtp_in.c +++ b/src/src/smtp_in.c @@ -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: - 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; diff --git a/test/confs/0566 b/test/confs/0566 index e7a91c694..83e97fb18 100644 --- a/test/confs/0566 +++ b/test/confs/0566 @@ -1,4 +1,4 @@ -# Exim test configuration 0028 +# Exim test configuration 0566 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 +log_selector = +8bitmime gecos_pattern = "" gecos_name = CALLER_NAME diff --git a/test/log/0566 b/test/log/0566 index e59c7336d..0922615b3 100644 --- a/test/log/0566 +++ b/test/log/0566 @@ -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= rejected RCPT : SIZE value too big 1999-03-02 09:44:33 U=CALLER F= rejected RCPT : 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 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 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 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 index 000000000..e5f0975da --- /dev/null +++ b/test/mail/0566.userx @@ -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 ) + id 10HmaX-0005vi-00 + for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Subject: test +Message-Id: +From: CALLER_NAME +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 ) + id 10HmaY-0005vi-00 + for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Subject: test +Message-Id: +From: CALLER_NAME +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 ) + id 10HmaZ-0005vi-00 + for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Subject: test +Message-Id: +From: CALLER_NAME +Date: Tue, 2 Mar 1999 09:44:33 +0000 + +foo + diff --git a/test/rejectlog/0566 b/test/rejectlog/0566 index 67b5dc277..7a420d042 100644 --- a/test/rejectlog/0566 +++ b/test/rejectlog/0566 @@ -1,2 +1,3 @@ 1999-03-02 09:44:33 U=CALLER F= rejected RCPT : SIZE value too big 1999-03-02 09:44:33 U=CALLER F= rejected RCPT : 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") diff --git a/test/scripts/0000-Basic/0566 b/test/scripts/0000-Basic/0566 index c4dc0d8aa..b2c5f75b4 100644 --- a/test/scripts/0000-Basic/0566 +++ b/test/scripts/0000-Basic/0566 @@ -70,4 +70,57 @@ mail from: BODY=8BITMIME SIZE=40004 rcpt to: quit **** +# no BODY, data +exim -bs +ehlo Testing +mail from: +rcpt to: +data +Subject: test + +foo +. +quit +**** +sleep 1 +# 7bit BODY, data +exim -bs +ehlo Testing +mail from: BODY=7BIT +rcpt to: +data +Subject: test + +foo +. +quit +**** +sleep 1 +# 8bit BODY, data +exim -bs +ehlo Testing +mail from: BODY=8BITMIME +rcpt to: +data +Subject: test + +foo +. +quit +**** +sleep 1 +# bad BODY, data +# should fail +1 +exim -bs +ehlo Testing +mail from: BODY=wrong +rcpt to: +data +Subject: test + +foo +. +quit +**** no_msglog_check diff --git a/test/stdout/0566 b/test/stdout/0566 index cb221f611..d3465d49e 100644 --- a/test/stdout/0566 +++ b/test/stdout/0566 @@ -88,3 +88,51 @@ 250 OK 550 SIZE value too big 221 myhost.test.ex closing connection +220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 +250-myhost.test.ex Hello CALLER at Testing +250-SIZE 52428800 +250-8BITMIME +250-PIPELINING +250 HELP +250 OK +250 Accepted +354 Enter message, ending with "." on a line by itself +250 OK id=10HmaX-0005vi-00 +221 myhost.test.ex closing connection +220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 +250-myhost.test.ex Hello CALLER at Testing +250-SIZE 52428800 +250-8BITMIME +250-PIPELINING +250 HELP +250 OK +250 Accepted +354 Enter message, ending with "." on a line by itself +250 OK id=10HmaY-0005vi-00 +221 myhost.test.ex closing connection +220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 +250-myhost.test.ex Hello CALLER at Testing +250-SIZE 52428800 +250-8BITMIME +250-PIPELINING +250 HELP +250 OK +250 Accepted +354 Enter message, ending with "." on a line by itself +250 OK id=10HmaZ-0005vi-00 +221 myhost.test.ex closing connection +220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 +250-myhost.test.ex Hello CALLER at Testing +250-SIZE 52428800 +250-8BITMIME +250-PIPELINING +250 HELP +501 invalid data for BODY +503 sender not yet given +503-All RCPT commands were rejected with this error: +503-503 sender not yet given +503 Valid RCPT command must precede DATA +500 unrecognized command +500 unrecognized command +500-unrecognized command +500 Too many syntax or protocol errors