X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=mimedecode.py;h=8c18c6ae0cbc1ff752092c07f24ae6759ce57949;hb=85d70ec62cddedc9c2d48bf44d280af266ac0c7f;hp=d239a1fe2234e332cb78b7d96387c687c98c6e70;hpb=f0f753ad009f6bd7089e0d6d3fce3ffd111734f5;p=mimedecode.git diff --git a/mimedecode.py b/mimedecode.py index d239a1f..8c18c6a 100755 --- a/mimedecode.py +++ b/mimedecode.py @@ -34,7 +34,7 @@ def output_headers(msg): def recode_if_needed(s, charset): - if charset and charset.lower() <> g.default_encoding: + if charset and charset.lower() != g.default_encoding: s = unicode(s, charset, "replace").encode(g.default_encoding, "replace") return s @@ -69,7 +69,7 @@ def decode_header(msg, header): if msg.has_key(header): value = msg[header] new_value = _decode_header(value) - if new_value <> value: # do not bother to touch msg if not changed + if new_value != value: # do not bother to touch msg if not changed set_header(msg, header, new_value) @@ -83,7 +83,7 @@ def decode_header_param(msg, header, param): new_value = recode_if_needed(value[2], value[0]) else: new_value = _decode_header(value) - if new_value <> value: # do not bother to touch msg if not changed + if new_value != value: # do not bother to touch msg if not changed msg.set_param(param, new_value, header) @@ -241,7 +241,7 @@ def recode_charset(msg, s): "Recode charset of the message to the default charset" save_charset = charset = msg.get_content_charset() - if charset and charset.lower() <> g.default_encoding: + if charset and charset.lower() != g.default_encoding: s = recode_if_needed(s, charset) content_type = msg.get_content_type() set_content_type(msg, content_type, g.default_encoding) @@ -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'): @@ -371,7 +373,7 @@ def decode_part(msg): for content_type in masks: if content_type in g.error_mask: - raise ValueError, "content type %s prohibited" % ctype + raise ValueError("content type %s prohibited" % ctype) def decode_multipart(msg): "Decode multipart" @@ -388,14 +390,44 @@ 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: output("%s--%s--%s" % (os.linesep, boundary, os.linesep)) return - elif content_type in g.error_mask: - raise ValueError, "content type %s prohibited" % ctype + + for content_type in masks: + if content_type in g.save_body_mask or \ + content_type in g.save_message_mask: + _out_l = [] + first_subpart = True + for subpart in msg.get_payload(): + if first_subpart: + first_subpart = False + else: + _out_l.append(os.linesep) + _out_l.append("--%s%s" % (boundary, os.linesep)) + _out_l.append(subpart.as_string()) + _out_l.append("%s--%s--%s" % (os.linesep, boundary, os.linesep)) + outstring = ''.join(_out_l) + break + else: + outstring = None + + for content_type in masks: + if content_type in g.save_headers_mask: + _save_message(msg, outstring, save_headers=True, save_body=False) + if content_type in g.save_body_mask: + _save_message(msg, outstring, save_headers=False, save_body=True) + if content_type in g.save_message_mask: + _save_message(msg, outstring, save_headers=True, save_body=True) + + for content_type in masks: + if content_type in g.error_mask: + raise ValueError("content type %s prohibited" % ctype) output_headers(msg) @@ -476,7 +508,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 +529,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 +578,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':