]> git.phdru.name Git - mimedecode.git/commitdiff
Make option -i to work with multipart messages
authorOleg Broytman <phd@phdru.name>
Sun, 8 Jun 2014 13:15:56 +0000 (17:15 +0400)
committerOleg Broytman <phd@phdru.name>
Sun, 8 Jun 2014 13:24:24 +0000 (17:24 +0400)
ChangeLog
TODO
mimedecode.docbook
mimedecode.py
test/expected/msg_36-1.txt [new file with mode: 0644]
test/test_all

index a63d023390b9dd485f4d6de80860fbf526e2a356..0b51d69d1662459e96e9408448af36d4885ec046 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 Version 2.5.1 (2014-04-??)
 
+   Make option -i to work with multipart messages.
+
    Open all files in binary mode. Output os.linesep instead of '\n'.
 
    Test --save-headers|body|message masks one after another to allow
diff --git a/TODO b/TODO
index 36e44bfdc211e1da2f05d2b40517a8f3226a0f6a..864a50ff3980f3abde92ddd0f78eb564cd4d4c3d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,9 +2,6 @@ Add option -I to completely skip (remove) subparts -- no headers, no body,
 no boundary, nothing.
 
 
-Extend options -eIi to multipart subparts.
-
-
 Never touch multipart/encrypted and multipart/signed (but allow -I).
 
 
index 67011a66213f8435a2e3b798c50c544d713122f7..7ca12cd5fa6a60c0db9d934533acba54724733b1 100644 (file)
@@ -520,6 +520,12 @@ cat input_file | mimedecode.py -o output_file</programlisting>
    earlier than -B */*.
 </para>
 
+<para>
+  Option -i can also ignore a multipart subpart of a MIME message. In that case
+  the entire subtree of that multipart is removed and replaced with ignore
+  warning.
+</para>
+
 <para>
    Initially all 5 lists are empty, so without any additional parameters
    the program always uses the default decoding (as -t */*).
index 6567e9926b562e0c7504cdd849c3ba183f447eba..7d96a3d50a3eacb030265ae0846e7509843793d6 100755 (executable)
@@ -377,6 +377,24 @@ def decode_multipart(msg):
     "Decode multipart"
 
     decode_headers(msg)
+    boundary = msg.get_boundary()
+
+    masks = []
+    ctype = msg.get_content_type()
+    if ctype:
+        masks.append(ctype)
+        mtype = ctype.split('/')[0]
+        masks.append(mtype + '/*')
+    masks.append('*/*')
+
+    for content_type in masks:
+        if content_type in g.ignore_mask:
+            output_headers(msg)
+            output("%sMessage body of type %s skipped.%s" % (os.linesep, ctype, os.linesep))
+            if boundary:
+                output("%s--%s--%s" % (os.linesep, boundary, os.linesep))
+            return
+
     output_headers(msg)
 
     if msg.preamble: # Preserve the first part, it is probably not a RFC822-message
@@ -385,8 +403,6 @@ def decode_multipart(msg):
         output(os.linesep)
 
     first_subpart = True
-    boundary = msg.get_boundary()
-
     for subpart in msg.get_payload():
         if boundary:
             if first_subpart:
diff --git a/test/expected/msg_36-1.txt b/test/expected/msg_36-1.txt
new file mode 100644 (file)
index 0000000..40c6d8b
--- /dev/null
@@ -0,0 +1,22 @@
+From test Sat Feb  1 00:00:00 2014
+Mime-Version: 1.0
+Content-Type: Multipart/Mixed; Boundary="NextPart"
+To: IETF-Announce:;
+From: Internet-Drafts@ietf.org
+Subject: I-D ACTION:draft-ietf-mboned-mix-00.txt
+Date: Tue, 22 Dec 1998 16:55:06 -0500
+
+--NextPart
+
+Blah blah blah
+
+--NextPart
+Content-Type: Multipart/Alternative; Boundary="OtherAccess"
+
+
+Message body of type multipart/alternative skipped.
+
+--OtherAccess--
+
+--NextPart--
+
index c6a5498f0e6b2756491ec667d73c85f8c26855f4..ff48accad783f89f20e6d346db5a5b42091ff2c1 100755 (executable)
@@ -60,6 +60,7 @@ test_file msg_02.txt msg_02-1.txt --set-param=X-Mailer:test=set
 test_file msg_02.txt msg_02-1.txt --set-param=X-Mailer:test:set
 test_file msg_13.txt msg_13-1.txt -B '*/*'
 test_file msg_13.txt msg_13.txt -t 'text/*' -b 'image/*' -B '*/*'
+test_file msg_36.txt msg_36-1.txt -i multipart/alternative
 
 # Test --save-*
 test2() {