Added default_content_type argument to
authorDavid Levine <levinedl@acm.org>
Thu, 9 Aug 2012 22:13:38 +0000 (17:13 -0500)
committerDavid Levine <levinedl@acm.org>
Thu, 9 Aug 2012 22:13:38 +0000 (17:13 -0500)
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
test/mhbuild/test-utf8-body [new file with mode: 0755]
uip/sendsbr.c

index 54c1250..9e94b4d 100644 (file)
@@ -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 (executable)
index 0000000..e7cb2f8
--- /dev/null
@@ -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" <<EOF
+this is an attachment
+EOF
+
+cat > "${MH_TEST_DIR}/Mail/draft" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+Nmh-Attachment: $MH_TEST_DIR/attachment.txt
+
+This is a test.
+EOF
+
+cat > "${testname}.expected" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+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" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+Nmh-Attachment: $MH_TEST_DIR/attachment.txt
+
+¡Ay, caramba!
+EOF
+
+cat > "${testname}.expected" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+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}
index 3865258..08dc766 100644 (file)
@@ -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