From d00b170aa19a82a22bf55516f2cdb33e26deca0c Mon Sep 17 00:00:00 2001 From: David Levine Date: Thu, 9 Aug 2012 17:13:38 -0500 Subject: [PATCH] Added default_content_type argument to make_mime_composition_file_entry(). It's used only to force message bodies to always use text/plain content type, which allows mhbuild to do the right thing with them. Thanks to Steve Rader for reporting that UTF-8 characters in message bodies had previously caused them to be encoded as octet-streams (with attachments managed by send), and to Ken for coming up with the fix. --- Makefile.am | 6 +- test/mhbuild/test-utf8-body | 134 +++++++++++++++++++++++++++++++++++++++++++ uip/sendsbr.c | 17 ++++-- 3 files changed, 149 insertions(+), 8 deletions(-) create mode 100755 test/mhbuild/test-utf8-body diff --git a/Makefile.am b/Makefile.am index 54c1250..9e94b4d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -51,11 +51,11 @@ TESTS = test/ali/test-ali \ test/format/test-dp test/format/test-fmtdump \ test/format/test-localmbox test/format/test-myname \ test/format/test-myhost test/format/test-mymbox \ - test/forw/test-forw-digest \ - test/forw/test-forw-format \ + test/forw/test-forw-digest test/forw/test-forw-format \ test/inc/test-deb359167 test/inc/test-eom-align \ test/inc/test-inc-scanout test/install-mh/test-install-mh \ - test/manpages/test-manpages test/mhbuild/test-forw \ + test/manpages/test-manpages \ + test/mhbuild/test-forw test/mhbuild/test-utf8-body \ test/mhlist/test-mhlist test/mhmail/test-mhmail \ test/mhparam/test-mhparam test/mhpath/test-mhpath \ test/mhshow/test-cte-binary test/mhshow/test-qp \ diff --git a/test/mhbuild/test-utf8-body b/test/mhbuild/test-utf8-body new file mode 100755 index 0000000..e7cb2f8 --- /dev/null +++ b/test/mhbuild/test-utf8-body @@ -0,0 +1,134 @@ +#!/bin/sh +###################################################### +# +# Test UTF-8 body along with an attachment +# +###################################################### + +set -e + +if test -z "${MH_OBJ_DIR}"; then + srcdir=`dirname "$0"`/../.. + MH_OBJ_DIR=`cd "$srcdir" && pwd`; export MH_OBJ_DIR +fi + +. "${MH_OBJ_DIR}/test/common.sh" + +setup_test +testname="${MH_TEST_DIR}/$$" + + +#### Rely on sendmail/pipe below to override default mts. +mts_fakesendmail="${MHMTSCONF}-fakesendmail" +cp "${MHMTSCONF}" "$mts_fakesendmail" +printf "%s\n" "sendmail: ${srcdir}/test/fakesendmail" >>"$mts_fakesendmail" +MHMTSCONF="$mts_fakesendmail" + +# argument: expected output +test_attachment () +{ + send -draft -mts sendmail/pipe + + # fakesendmail drops the message and any cc's into this mbox. + mbox="${MH_TEST_DIR}"/Mail/fakesendmail.mbox + inc -silent -file "$mbox" + rm -f "$mbox" "$mbox.map" + + cur=`mhpath cur` + + # + # It's hard to calculate the exact Date: header post is going to + # use, so we'll just use sed to remove the actual date so we can easily + # compare it against our "correct" output. And same for + # Content-ID and charset. + # + sed -e 's/^Date:.*/Date:/' \ + -e 's/^Content-ID:.*/Content-ID:/' \ + -e 's/; charset=".*//' \ + "$cur" > "${testname}.actual" + + check "${testname}.actual" "$1" +} + +# check that 7-bit body isn't encoded +cat > "${MH_TEST_DIR}/attachment.txt" < "${MH_TEST_DIR}/Mail/draft" < +To: Somebody Else +Subject: Test +Nmh-Attachment: $MH_TEST_DIR/attachment.txt + +This is a test. +EOF + +cat > "${testname}.expected" < +To: Somebody Else +Subject: Test +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" +Content-ID: +Date: + +------- =_aaaaaaaaaa0 +Content-Type: text/plain + +This is a test. + +------- =_aaaaaaaaaa0 +Content-Type: text/plain; name="attachment.txt" +Content-Description: attachment.txt +Content-Disposition: attachment; filename="attachment.txt" + +this is an attachment + +------- =_aaaaaaaaaa0-- +EOF + +test_attachment "${testname}.expected" + +# check that 8-bit body is still encoded as quoted-printable +# text/plain, even with an attachment + +cat > "${MH_TEST_DIR}/Mail/draft" < +To: Somebody Else +Subject: Test +Nmh-Attachment: $MH_TEST_DIR/attachment.txt + +¡Ay, caramba! +EOF + +cat > "${testname}.expected" < +To: Somebody Else +Subject: Test +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" +Content-ID: +Date: + +------- =_aaaaaaaaaa0 +Content-Type: text/plain +Content-Transfer-Encoding: quoted-printable + +=A1Ay, caramba! + +------- =_aaaaaaaaaa0 +Content-Type: text/plain; name="attachment.txt" +Content-Description: attachment.txt +Content-Disposition: attachment; filename="attachment.txt" + +this is an attachment + +------- =_aaaaaaaaaa0-- +EOF + +test_attachment "${testname}.expected" + +rm -f ${MHMTSCONF} "${MH_TEST_DIR}/attachment.txt" + +exit ${failed:-0} diff --git a/uip/sendsbr.c b/uip/sendsbr.c index 3865258..08dc766 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -63,7 +63,7 @@ static int sendaux (char **, int, char *, struct stat *); static int attach(char *, char *, int); static void clean_up_temporary_files(void); static int get_line(void); -static void make_mime_composition_file_entry(char *, int); +static void make_mime_composition_file_entry(char *, int, char *); /* @@ -292,10 +292,13 @@ attach(char *attachment_header_field_name, char *draft_file_name, /* * Add a mhbuild MIME composition file line for the body if there was one. + * Set the default content type to text/plain so that mhbuild takes care + * of any necessary encoding. */ if (has_body) - make_mime_composition_file_entry(body_file_name, attachformat); + make_mime_composition_file_entry(body_file_name, attachformat, + "text/plain"); /* * Now, go back to the beginning of the draft file and look for header fields @@ -314,7 +317,10 @@ attach(char *attachment_header_field_name, char *draft_file_name, for (p = field + length + 1; *p == ' ' || *p == '\t'; p++) ; - make_mime_composition_file_entry(p, attachformat); + /* Don't set the default content type so take + make_mime_composition_file_entry() will try to infer it + from the file type. */ + make_mime_composition_file_entry(p, attachformat, 0); } } @@ -382,7 +388,8 @@ get_line(void) } static void -make_mime_composition_file_entry(char *file_name, int attachformat) +make_mime_composition_file_entry(char *file_name, int attachformat, + char *default_content_type) { int binary; /* binary character found flag */ int c; /* current character */ @@ -393,7 +400,7 @@ make_mime_composition_file_entry(char *file_name, int attachformat) char *p; /* miscellaneous string pointer */ struct stat st; /* file status buffer */ - content_type = (char *)0; + content_type = default_content_type; /* * Check the file name for a suffix. Scan the context for that suffix on a -- 1.7.10.4