]> git.phdru.name Git - mimedecode.git/commitdiff
Check filenames for --save-* for forbidden characters
authorOleg Broytman <phd@phdru.name>
Sat, 15 Mar 2014 17:43:16 +0000 (21:43 +0400)
committerOleg Broytman <phd@phdru.name>
Sat, 15 Mar 2014 17:43:16 +0000 (21:43 +0400)
TODO
mimedecode.docbook
mimedecode.py

diff --git a/TODO b/TODO
index 17dc389cf04fa37ba8ab1f4e55ed14ed9a8ff38a..70b4158c4681aed2a417917ae8263c692d2e6863 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,3 @@
-Check filenames for --save-* for forbidden characters.
-
-
 Add tests for --save-*.
 
 
index d61acaef38957d1dc203027ea23302cb717bb267..02ee7a5b3ccfaddacdbb87bd1c4eb1e7b51b330b 100644 (file)
@@ -521,16 +521,18 @@ the program always uses the default decoding.
 </para>
 
 <para>
-  The 3 save list options (--save-headers/body/message) are similar. They make
-  the program to save every non-multipart subpart (only headers, or body, or
-  the entire subpart) that corresponds to the given mask to a file. Before
-  saving the message (or the subpart) is decoded according to all other options
-  and placed to the output stream as usual. Filename for the file is created
-  using "filename" parameter from the Content-Disposition header, or "name"
-  parameter from the Content-Type header if one of those exist; a serial
+  The 3 save options (--save-headers/body/message) are similar. They make the
+  program to save every non-multipart subpart (only headers, or body, or the
+  entire subpart: headers + body) that corresponds to the given mask to a file.
+  Before saving the message (or the subpart) is decoded according to all other
+  options and placed to the output stream as usual. Filename for the file is
+  created using "filename" parameter from the Content-Disposition header, or
+  "name" parameter from the Content-Type header if one of those exist; a serial
   counter is prepended to the filename to avoid collisions; if there are no
-  name/filename parameters, the filename is just the serial counter. The file
-  is saved in the directory set with -O (default is the current directory).
+  name/filename parameters, or the name/filename parameters contain forbidden
+  characters (null, slash, backslash) the filename is just the serial counter.
+  The file is saved in the directory set with -O (default is the current
+  directory).
 </para>
 </refsect1>
 
index c1731d6336c5ab8eff9e5928a61a9cce1181ddc2..da63350485e7981713b88257bbccc12bb711efd2 100755 (executable)
@@ -270,6 +270,12 @@ def _save_message(msg, outstring, save_headers=False, save_body=False):
     ):
         fname = msg.get_param(param, header=header)
         if fname:
+            try:
+                    for forbidden in chr(0), '/', '\\':
+                        if forbidden in fname:
+                            raise ValueError
+            except ValueError:
+                continue
             fname = '-' + fname
             break
     else: