From 6c5cad3f96a1bbe20b668730ba66dfb43eb14b08 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Mon, 27 Jun 2011 17:42:42 +0200 Subject: Add is_clean() method to archives, and move the 'secure_remove' function from parser.py to mat.py --- lib/archive.py | 58 +++++++++++++++++++++++++++++++++++++--------------------- lib/mat.py | 12 ++++++++++++ lib/parser.py | 15 +++------------ 3 files changed, 52 insertions(+), 33 deletions(-) (limited to 'lib') diff --git a/lib/archive.py b/lib/archive.py index 89425cf..446e493 100644 --- a/lib/archive.py +++ b/lib/archive.py @@ -5,47 +5,63 @@ import mat import shutil class TarStripper(parser.Generic_parser): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(TarStripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = '' + self.tarin = tarfile.open(self.filename, 'r' + self.compression) + self.folder_list = [] def remove_all(self): - self.compression_type() - if not tarfile.is_tarfile(self.filename): - print('%s is not a valid tar file' % self.filename) - sys.exit(1) - - tarin = tarfile.open(self.filename, 'r' + self.compression) - tarout = tarfile.open(self.filename + parser.POSTFIX, + self.tarout = tarfile.open(self.filename + parser.POSTFIX, 'w' + self.compression) - folder_list = [] - - for current_file in tarin.getmembers(): - tarin.extract(current_file) + for current_file in self.tarin.getmembers(): + self.tarin.extract(current_file) if current_file.type is '0': #is current_file a regular file ? #no backup file class_file = mat.create_class_file(current_file.name, False) class_file.remove_all() - tarout.add(current_file.name) - class_file.secure_remove() + self.tarout.add(current_file.name) + mat.secure_remove(current_file.name) else: - folder_list.insert(0, current_file.name) + self.folder_list.insert(0, current_file.name) - for folder in folder_list: #delete remainings folders + for folder in self.folder_list: #delete remainings folders shutil.rmtree(folder) #meta from the tar itself - tarout.mtime = None + self.tarout.mtime = None - tarout.close() - tarin.close() + self.tarout.close() + self.tarin.close() def is_clean(self): + for current_file in self.tarin.getmembers(): + self.tarin.extract(current_file) + if current_file.type is '0': #is current_file a regular file ? + #no backup file + class_file = mat.create_class_file(current_file.name, False) + if not class_file.is_clean(): + self.folder_list = [] + return False + mat.secure_remove(current_file.name) + else: + self.folder_list.insert(0, current_file.name) + self.tarin.close() + + for folder in self.folder_list: #delete remainings folders + shutil.rmtree(folder) + self.folder_list = [] return False class GzipStripper(TarStripper): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(GzipStripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = ':gz' class Bzip2Stripper(TarStripper): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(Bzip2Stripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = ':bz2' diff --git a/lib/mat.py b/lib/mat.py index 9624511..c9547c1 100644 --- a/lib/mat.py +++ b/lib/mat.py @@ -6,6 +6,7 @@ import sys import os +import subprocess import hachoir_core.cmd_line import hachoir_parser @@ -29,6 +30,17 @@ strippers = { hachoir_parser.archive.bzip2_parser.Bzip2Parser: archive.Bzip2Stripper, } +def secure_remove(filename): + ''' + securely remove the file + ''' + #FIXME : Vulnerable to shell injection ? + try: + subprocess.call('shred --remove %s' % filename, shell=True) + except: + print('Unable to remove %s' % filename) + + def is_secure(filename): ''' Prevent shell injection diff --git a/lib/parser.py b/lib/parser.py index c7e189e..6b899f3 100644 --- a/lib/parser.py +++ b/lib/parser.py @@ -8,10 +8,11 @@ import hachoir_editor import sys import os import subprocess +import mat POSTFIX = ".cleaned" -class Generic_parser(): +class Generic_parser(object): def __init__(self, realname, filename, parser, editor, backup): self.filename = filename self.realname = realname @@ -19,16 +20,6 @@ class Generic_parser(): self.editor = editor self.backup = backup - def secure_remove(self): - ''' - securely remove the file - ''' - #FIXME : Vulnerable to shell injection ? - try: - subprocess.call('shred --remove %s' % self.filename, shell=True) - except: - print('Unable to remove %s' % self.filename) - def is_clean(self): ''' Check if the file is clean from harmful metadatas @@ -47,7 +38,7 @@ class Generic_parser(): self._remove(field) hachoir_core.field.writeIntoFile(self.editor, self.filename + POSTFIX) if self.backup is False: - self.secure_remove() #remove the old file + mat.secure_remove(self.filename) #remove the old file os.rename(self.filename+ POSTFIX, self.filename)#rename the new def remove_all_ugly(self): -- cgit v1.3