]> git.phdru.name Git - mimedecode.git/commitdiff
Add option -I to completely ignore a part
authorOleg Broytman <phd@phdru.name>
Sun, 8 Jun 2014 14:20:53 +0000 (18:20 +0400)
committerOleg Broytman <phd@phdru.name>
Sun, 8 Jun 2014 14:23:42 +0000 (18:23 +0400)
ChangeLog
TODO
mimedecode.docbook
mimedecode.py
test/expected/msg_36-2.txt [new file with mode: 0644]
test/test_all

index 4011e270d182fab5836ba4480d2c74de1d1babfd..dfcac6eb6ea67d8a9fc28d933243e1cd1e8ac686 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,9 @@ Version 2.5.1 (2014-04-??)
 
    Make options -e/-i to work with multipart messages.
 
+   Add option -I to completely ignore a part - no headers, no body,
+   no warning.
+
    Open all output 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 864a50ff3980f3abde92ddd0f78eb564cd4d4c3d..ff19c32d81870f8b3df6e3487b9dc5153ecb8010 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,3 @@
-Add option -I to completely skip (remove) subparts -- no headers, no body,
-no boundary, nothing.
-
-
 Never touch multipart/encrypted and multipart/signed (but allow -I).
 
 
index d01f49226af55735cd35bbcfcb8fec98c3640f94..61a30b863710625d4256011ababe3435c5f589c3 100644 (file)
@@ -90,7 +90,7 @@
          <option>--set-param header:param=value</option>
       </arg>
       <arg choice="opt">
-         <option>-Bbeit mask</option>
+         <option>-BbeIit mask</option>
       </arg>
       <arg choice="opt">
          <option>--save-headers|body|message mask</option>
       </listitem>
    </varlistentry>
 
+   <varlistentry>
+      <term>-I mask</term>
+      <listitem>
+         <para>
+            Append mask to the list of content types to completely ignore.
+            There will be no output - no headers, no body, no warning. For a
+            multipart part the entire subtree is removed.
+         </para>
+      </listitem>
+   </varlistentry>
+
    <varlistentry>
       <term>-i mask</term>
       <listitem>
@@ -521,9 +532,9 @@ cat input_file | mimedecode.py -o output_file</programlisting>
 </para>
 
 <para>
-  Options -e/-i can also work with multipart subparts of a MIME message. In
-  case of -i the entire subtree of that multipart is removed and replaced with
-  ignore warning.
+  Options -e/-I/-i can also work with multipart subparts of a MIME message. In
+  case of -I/-i the entire subtree of that multipart is removed; with -i it's
+  replaced with ignore warning.
 </para>
 
 <para>
index d239a1fe2234e332cb78b7d96387c687c98c6e70..8d50b7d0d56453ab0d148cc0d66311c2d6b13081 100755 (executable)
@@ -333,6 +333,8 @@ def decode_part(msg):
         elif content_type in g.binary_mask:
             left_binary = True
             break
+        elif content_type in g.fully_ignore_mask:
+            return
 
     encoding = msg["Content-Transfer-Encoding"]
     if left_binary or encoding in (None, '', '7bit', '8bit', 'binary'):
@@ -388,7 +390,9 @@ def decode_multipart(msg):
     masks.append('*/*')
 
     for content_type in masks:
-        if content_type in g.ignore_mask:
+        if content_type in g.fully_ignore_mask:
+            return
+        elif content_type in g.ignore_mask:
             output_headers(msg)
             output("%sMessage body of type %s skipped.%s" % (os.linesep, ctype, os.linesep))
             if boundary:
@@ -476,7 +480,8 @@ class GlobalOptions:
     totext_mask = [] # A list of content-types to decode
     binary_mask = [] # A list of content-types to pass through
     decoded_binary_mask = [] # A list of content-types to pass through (content-transfer-decoded)
-    ignore_mask = [] # Ignore (skip, do not decode and do not include into output)
+    ignore_mask = [] # Ignore (do not decode and do not include into output) but output a warning instead of the body
+    fully_ignore_mask = [] # Completely ignore - no headers, no body, no warning
     error_mask = []  # Raise error if encounter one of these
 
     save_counter = 0
@@ -496,7 +501,7 @@ def get_opts():
 
     try:
         options, arguments = getopt(sys.argv[1:],
-            'hVcCDPH:f:d:p:r:R:b:B:e:i:t:O:o:',
+            'hVcCDPH:f:d:p:r:R:b:B:e:I:i:t:O:o:',
             ['help', 'version', 'host=',
              'save-headers=', 'save-body=', 'save-message=',
              'set-header=', 'set-param='])
@@ -545,6 +550,8 @@ def get_opts():
             g.binary_mask.append(value)
         elif option == '-b':
             g.decoded_binary_mask.append(value)
+        elif option == '-I':
+            g.fully_ignore_mask.append(value)
         elif option == '-i':
             g.ignore_mask.append(value)
         elif option == '-e':
diff --git a/test/expected/msg_36-2.txt b/test/expected/msg_36-2.txt
new file mode 100644 (file)
index 0000000..e44d9c4
--- /dev/null
@@ -0,0 +1,16 @@
+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
+
+--NextPart--
+
index ff48accad783f89f20e6d346db5a5b42091ff2c1..7eb656e6ef108f268193283a39d102402d95c4cf 100755 (executable)
@@ -61,6 +61,7 @@ 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_file msg_36.txt msg_36-2.txt -I multipart/alternative
 
 # Test --save-*
 test2() {