]> diplodocus.org Git - nmh/commitdiff
Have -nocrlflinebreaks apply to the message parts that -decodetypes
authorDavid Levine <levinedl@acm.org>
Sat, 12 Mar 2016 18:25:36 +0000 (13:25 -0500)
committerDavid Levine <levinedl@acm.org>
Sat, 12 Mar 2016 18:26:45 +0000 (13:26 -0500)
designates.

man/mhfixmsg.man
test/mhfixmsg/test-mhfixmsg
uip/mhfixmsg.c

index 268f5334b3c714d8ed6c67ae8bce2d1050717e73..eb9595de9547912fb4c7fa49162b4b465abe0112 100644 (file)
@@ -291,7 +291,7 @@ content type and/or encoding as follows:
 .ta \w'\-crlflinebreaks 'u
 \-decodetext         base64 and quoted-printable encoded text parts
 \-decodetypes        limits parts to which -decodetext applies
-\-crlflinebreaks text parts
+\-crlflinebreaks     text parts
 \-textcharset        text/plain parts
 \-reformat           text parts that are not text/plain
 \-fixboundary        outermost multipart part
index 5ea79adaeb6c1ae529d0cb6c3def7b6c49054b2b..61821c271124606623244bfcfe96edd78ae41ab1 100755 (executable)
@@ -1446,8 +1446,6 @@ check "$expected" "$actual"
 
 
 # check -decodetypes attachment/ics
-# -nocrlflinebreaks won't with non-text content, so the carriage returns are
-# unavoidable.
 cat >$expected <<EOF
 To: recipient@example.com
 From: sender@example.com
@@ -1495,7 +1493,8 @@ Content-Disposition: attachment; filename="test1.txt"
 Content-MD5: kq+Hnc2SD/eKwAnkFBDuEA==
 Content-Transfer-Encoding: quoted-printable
 
-This is the text/plain part.
+This is the=
+ text/plain part.
 
 ------- =_aaaaaaaaaa0
 Content-Type: application/ics; charset="iso-8859-1"; name="invite.ics"
@@ -1513,6 +1512,73 @@ run_prog mhfixmsg last -outfile "$actual" -noreformat
 check "$expected" "$actual"
 
 
+# check -decodetypes attachment/ics and -nocrlflinebreaks
+cat >$expected <<EOF
+To: recipient@example.com
+From: sender@example.com
+Subject: mhfixmsg decode test 5
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Disposition: attachment; filename="test1.txt"
+Content-MD5: kq+Hnc2SD/eKwAnkFBDuEA==
+Content-Transfer-Encoding: 8bit
+
+This is the text/plain part.
+
+------- =_aaaaaaaaaa0
+Content-Type: application/ics; charset="iso-8859-1"; name="invite.ics"
+Content-Disposition: attachment; filename="invite.ics"
+Content-Transfer-Encoding: 8bit
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:test-mhical
+BEGIN:VEVENT
+DTSTAMP:20150101T162400Z
+DTSTART:20150105T160000
+DTEND:20150105T163000
+SUMMARY:4 pm meeting
+END:VEVENT
+END:VCALENDAR
+
+------- =_aaaaaaaaaa0--
+EOF
+
+cat >`mhpath new` <<EOF
+To: recipient@example.com
+From: sender@example.com
+Subject: mhfixmsg decode test 5
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Disposition: attachment; filename="test1.txt"
+Content-MD5: kq+Hnc2SD/eKwAnkFBDuEA==
+Content-Transfer-Encoding: quoted-printable
+
+This is the=
+ text/plain part.
+
+------- =_aaaaaaaaaa0
+Content-Type: application/ics; charset="iso-8859-1"; name="invite.ics"
+Content-Disposition: attachment; filename="invite.ics"
+Content-Transfer-Encoding: base64
+
+QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KUFJPRElEOnRlc3QtbWhpY2FsDQpCRUdJTjpW
+RVZFTlQNCkRUU1RBTVA6MjAxNTAxMDFUMTYyNDAwWg0KRFRTVEFSVDoyMDE1MDEwNVQxNjAwMDAN
+CkRURU5EOjIwMTUwMTA1VDE2MzAwMA0KU1VNTUFSWTo0IHBtIG1lZXRpbmcNCkVORDpWRVZFTlQN
+CkVORDpWQ0FMRU5EQVINCg==
+
+------- =_aaaaaaaaaa0--
+EOF
+run_prog mhfixmsg last -outfile "$actual" -nocrlflinebreaks -noreformat
+check "$expected" "$actual"
+
+
 # make sure there are no tmp files left over
 find "$MH_TEST_DIR/Mail" \( -name 'mhfix*' -o -name ',mhfix*' \) -print \
   >"$actual"
index 8a586182c599380ada477e48fbbd77a39e9a8b73..d5107c60228b44557a8c744b24c6db1ae3780315 100644 (file)
@@ -119,6 +119,7 @@ static int strip_crs (CT, int *);
 static int convert_charsets (CT, char *, int *);
 static int fix_always (CT, int *);
 static int write_content (CT, char *, char *, int, int);
+static void set_text_ctparams(CT, char *, int);
 static int remove_file (char *);
 static void report (char *, char *, char *, char *, ...);
 static void pipeser (int);
@@ -346,15 +347,7 @@ main (int argc, char **argv) {
         ctp = cts;
 
         if ((ct = parse_mime (file))) {
-            if (ct->c_type == CT_TEXT) {
-                /* parse_mime() does not set lf_line_endings in struct text, so set it here. */
-                if (ct->c_ctparams == NULL) {
-                    if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) {
-                        adios (NULL, "out of memory");
-                    }
-                }
-                ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings;
-            }
+            set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
             *ctp++ = ct;
         }
     } else {
@@ -398,16 +391,7 @@ main (int argc, char **argv) {
 
                 msgnam = m_name (msgnum);
                 if ((ct = parse_mime (msgnam))) {
-                    if (ct->c_type == CT_TEXT) {
-                        /* parse_mime() does not set lf_line_endings in struct text, so set it here. */
-                        if (ct->c_ctparams == NULL) {
-                            if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) ==
-                                NULL) {
-                                adios (NULL, "out of memory");
-                            }
-                        }
-                        ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings;
-                    }
+                    set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
                     *ctp++ = ct;
                 }
             }
@@ -1821,8 +1805,7 @@ decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mo
         }
 
         lf_line_endings =
-            ct->c_type == CT_TEXT  &&  ct->c_ctparams  &&
-            ((struct text *) ct->c_ctparams)->lf_line_endings;
+            ct->c_ctparams  &&  ((struct text *) ct->c_ctparams)->lf_line_endings;
 
         switch (ct->c_encoding) {
         case CE_BASE64:
@@ -2356,6 +2339,44 @@ write_content (CT ct, char *input_filename, char *outfile, int modify_inplace,
 }
 
 
+/*
+ * parse_mime() does not set lf_line_endings in struct text, so use this function to do it.
+ * It touches the parts the decodetypes identifies.
+ */
+static void
+set_text_ctparams(CT ct, char *decodetypes, int lf_line_endings) {
+    switch (ct->c_type) {
+    case CT_MULTIPART: {
+        struct multipart *m = (struct multipart *) ct->c_ctparams;
+        struct part *part;
+
+        for (part = m->mp_parts; part; part = part->mp_next) {
+            set_text_ctparams(part->mp_part, decodetypes, lf_line_endings);
+        }
+        break;
+    }
+
+    case CT_MESSAGE:
+        if (ct->c_subtype == MESSAGE_EXTERNAL) {
+            struct exbody *e = (struct exbody *) ct->c_ctparams;
+
+            set_text_ctparams(e->eb_content, decodetypes, lf_line_endings);
+        }
+        break;
+
+    default:
+        if (should_decode(decodetypes, ct->c_ctinfo.ci_type, ct->c_ctinfo.ci_subtype)) {
+            if (ct->c_ctparams == NULL) {
+                if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) {
+                    adios (NULL, "out of memory");
+                }
+            }
+            ((struct text *) ct->c_ctparams)->lf_line_endings = lf_line_endings;
+        }
+    }
+}
+
+
 /*
  * If "rmmproc" is defined, call that to remove the file.  Otherwise,
  * use the standard MH backup file.