From 49058d6afeb5ed7df0cda2815d41edfa2474dd17 Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Mon, 17 Mar 2014 23:40:25 +0400 Subject: [PATCH 1/1] Guess filename extension for --save-* from the content type --- mimedecode.docbook | 16 +++++- mimedecode.py | 21 ++++++-- test/expected-save/msg_07-4.txt | Bin 0 -> 3710 bytes test/expected/msg_07-1.txt | Bin 0 -> 4170 bytes test/input/msg_07-1.txt | 84 ++++++++++++++++++++++++++++++++ test/test_all | 1 + 6 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 test/expected-save/msg_07-4.txt create mode 100644 test/expected/msg_07-1.txt create mode 100644 test/input/msg_07-1.txt diff --git a/mimedecode.docbook b/mimedecode.docbook index 7d767f3..e8a0b23 100644 --- a/mimedecode.docbook +++ b/mimedecode.docbook @@ -536,9 +536,21 @@ cat input_file | mimedecode.py -o output_file counter is prepended to the filename to avoid collisions; if there are no name/filename parameters, or the name/filename parameters contain forbidden characters (null, slash, backslash) the filename is just the serial counter. + + + + If the file doesn't have any extensions (no dots in the value of the + name/filename parameters, or the name is just the counter) the program tries + to guess an extension by looking up the content type in mime.types files + including .mime.types file in the user's home directory (if it exists). If + the file has an extension the program doesn't try to verify that it + corresponds to the content type. + + + The file is saved in the directory set with -O (default is the current - directory). The save options are processed before option -e so the user can - save the message that causes the error. + directory). The save options are proceeded before -e options so the user can + save the message that causes an error. diff --git a/mimedecode.py b/mimedecode.py index 50f8a18..48f6f7e 100755 --- a/mimedecode.py +++ b/mimedecode.py @@ -1,10 +1,9 @@ #! /usr/bin/env python """Decode MIME message""" -from mimedecode_version import __version__, __author__, __copyright__, __license__ - import sys, os -import email +from mimedecode_version import __version__, \ + __author__, __copyright__, __license__ me = os.path.basename(sys.argv[0]) @@ -263,6 +262,18 @@ def totext(msg, instring): return s +mimetypes = None + +def _guess_extension(ctype): + global mimetypes + if mimetypes is None: + import mimetypes + mimetypes.init() + user_mime_type = os.path.expanduser('~/.mime.types') + if os.path.exists(user_mime_type): + mimetypes._db.read(user_mime_type) + return mimetypes.guess_extension(ctype) + def _save_message(msg, outstring, save_headers=False, save_body=False): for header, param in ( ("Content-Disposition", "filename"), @@ -284,6 +295,9 @@ def _save_message(msg, outstring, save_headers=False, save_body=False): fname = '' g.save_counter += 1 fname = str(g.save_counter) + fname + if '.' not in fname: + ext = _guess_extension(msg.get_content_type()) + if ext: fname += ext global output save_output = output @@ -583,6 +597,7 @@ if __name__ == "__main__": g.outfile = outfile output = outfile.write + import email msg = email.message_from_file(infile) for header, value in g.set_header_value: diff --git a/test/expected-save/msg_07-4.txt b/test/expected-save/msg_07-4.txt new file mode 100644 index 0000000000000000000000000000000000000000..047192840e2e1aa92113499e30617a2fe938420f GIT binary patch literal 3710 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 literal 0 HcmV?d00001 diff --git a/test/expected/msg_07-1.txt b/test/expected/msg_07-1.txt new file mode 100644 index 0000000000000000000000000000000000000000..9ed3c2fa6d237c09607e059dd523102cb129d260 GIT binary patch literal 4170 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 Y_Dw466Du5pxtJLk)c@`C3<3fE2ee$0aR2}S literal 0 HcmV?d00001 diff --git a/test/input/msg_07-1.txt b/test/input/msg_07-1.txt new file mode 100644 index 0000000..aa0dc63 --- /dev/null +++ b/test/input/msg_07-1.txt @@ -0,0 +1,84 @@ +From test Sat Feb 1 00:00:00 2014 +MIME-Version: 1.0 +From: Barry +To: Dingus Lovers +Subject: Here is your dingus fish +Date: Fri, 20 Apr 2001 19:35:02 -0400 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain; charset="us-ascii" + +Hi there, + +This is the dingus fish. + +--BOUNDARY +Content-Type: image/gif; name="dingusfish" +Content-Transfer-Encoding: base64 +content-disposition: attachment; filename="dingusfish" + +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 + +--BOUNDARY-- diff --git a/test/test_all b/test/test_all index 5009f70..c6a5498 100755 --- a/test/test_all +++ b/test/test_all @@ -93,6 +93,7 @@ test_save() { test_save msg_07.txt msg_07.txt 1-dingusfish.gif msg_07-1.txt --save-headers image/gif test_save msg_07.txt msg_07.txt 1-dingusfish.gif msg_07-2.txt --save-body image/gif test_save msg_07.txt msg_07.txt 1-dingusfish.gif msg_07-3.txt --save-message image/gif +test_save msg_07-1.txt msg_07-1.txt 1-dingusfish.gif msg_07-4.txt --save-message image/gif if [ "$RC" -eq 0 ]; then echo "All tests passed!" -- 2.39.2