X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=mimedecode.py;h=50f8a18675a5265700f2f4928208e169dc116f8d;hb=2f5f5a47bcc3cc87ba568ca1ee3107218cb1d6b6;hp=fdea039d04f0fc6ee9716137d86dc3763f72e0d4;hpb=b068be834a5be5407c5ab2cf18910bc03fddc9ef;p=mimedecode.git diff --git a/mimedecode.py b/mimedecode.py index fdea039..50f8a18 100755 --- a/mimedecode.py +++ b/mimedecode.py @@ -270,6 +270,14 @@ def _save_message(msg, outstring, save_headers=False, save_body=False): ): fname = msg.get_param(param, header=header) if fname: + if isinstance(fname, tuple): + fname = fname[2] # Do not recode if it isn't recoded yet + try: + for forbidden in chr(0), '/', '\\': + if forbidden in fname: + raise ValueError + except ValueError: + continue fname = '-' + fname break else: @@ -279,7 +287,7 @@ def _save_message(msg, outstring, save_headers=False, save_body=False): global output save_output = output - outfile = open(os.path.join(g.destination_dir, fname), 'w') + outfile = open_output_file(fname) output = outfile.write if save_headers: output_headers(msg) @@ -395,6 +403,19 @@ def decode_message(msg): output(msg.as_string()) +def open_output_file(filename): + fullpath = os.path.abspath(os.path.join(g.destination_dir, filename)) + full_dir = os.path.dirname(fullpath) + create = not os.path.isdir(full_dir) + if create: + os.makedirs(full_dir) + try: + return open(fullpath, 'w') + except: + if create: + os.removedirs(full_dir) + + class GlobalOptions: from m_lib.defenc import default_encoding recode_charset = 1 # recode charset of message body @@ -521,7 +542,7 @@ if __name__ == "__main__": g.input_filename = '-' infile = sys.stdin if g.output_filename: - outfile = open(os.path.join(g.destination_dir, g.output_filename), 'w') + outfile = open_output_file(g.output_filename) else: g.output_filename = '-' outfile = sys.stdout @@ -534,7 +555,7 @@ if __name__ == "__main__": infile = open(arguments[0], 'r') if la == 1: if g.output_filename: - outfile = open(os.path.join(g.destination_dir, g.output_filename), 'w') + outfile = open_output_file(g.output_filename) else: g.output_filename = '-' outfile = sys.stdout @@ -546,7 +567,7 @@ if __name__ == "__main__": outfile = sys.stdout else: g.output_filename = arguments[1] - outfile = open(os.path.join(g.destination_dir, g.output_filename), 'w') + outfile = open_output_file(g.output_filename) else: usage(1, 'Too many arguments') @@ -565,7 +586,7 @@ if __name__ == "__main__": msg = email.message_from_file(infile) for header, value in g.set_header_value: - msg[header] = value + set_header(msg, header, value) for header, param, value in g.set_header_param: if header in msg: