diff options
| author | jvoisin | 2011-07-21 22:09:11 +0200 |
|---|---|---|
| committer | jvoisin | 2011-07-21 22:09:11 +0200 |
| commit | 3432cd8313e0165938f3dcdf3068be97eb924b13 (patch) | |
| tree | 22140c233cef8a73d07869b0f769f0c94ccca5dc /lib | |
| parent | ebc4b477e5dc5e80e73644ca855eb37767afdcdd (diff) | |
Add is_clean() tor zip archives (add fix a regression for tar.*)
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/archive.py | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/lib/archive.py b/lib/archive.py index c31fac6..2ee817e 100644 --- a/lib/archive.py +++ b/lib/archive.py | |||
| @@ -24,8 +24,39 @@ class GenericArchiveStripper(parser.Generic_parser): | |||
| 24 | [shutil.rmtree(folder) for folder in self.folder_list] | 24 | [shutil.rmtree(folder) for folder in self.folder_list] |
| 25 | self.folder_list = [] | 25 | self.folder_list = [] |
| 26 | 26 | ||
| 27 | |||
| 27 | class ZipStripper(GenericArchiveStripper): | 28 | class ZipStripper(GenericArchiveStripper): |
| 29 | def is_file_clean(self, file): | ||
| 30 | if file.comment is not '': | ||
| 31 | return False | ||
| 32 | elif file.date_time is not 0: | ||
| 33 | return False | ||
| 34 | elif file.create_system is not 0: | ||
| 35 | return False | ||
| 36 | elif file.create_version is not 0: | ||
| 37 | return False | ||
| 38 | else: | ||
| 39 | return True | ||
| 40 | |||
| 28 | def is_clean(self): | 41 | def is_clean(self): |
| 42 | zipin = zipfile.ZipFile(self.filename, 'r') | ||
| 43 | for item in zipin.infolist(): | ||
| 44 | if not self.is_file_clean(item): | ||
| 45 | return False | ||
| 46 | zipin.extract(item) | ||
| 47 | if os.path.isfile(item.filename): | ||
| 48 | try: | ||
| 49 | cfile = mat.create_class_file(item.filename, False, | ||
| 50 | self.add2archive) | ||
| 51 | except: | ||
| 52 | logging.error('%s is not supported' % item.filename) | ||
| 53 | #Returning false is the best solution imho | ||
| 54 | return False | ||
| 55 | mat.secure_remove(item.filename) | ||
| 56 | else: | ||
| 57 | self.folder_list.insert(0, item.filename) | ||
| 58 | zipin.close() | ||
| 59 | self.remove_folder() | ||
| 29 | return False | 60 | return False |
| 30 | 61 | ||
| 31 | def get_meta(self): | 62 | def get_meta(self): |
| @@ -42,7 +73,6 @@ class ZipStripper(GenericArchiveStripper): | |||
| 42 | return metadata | 73 | return metadata |
| 43 | 74 | ||
| 44 | def remove_all(self): | 75 | def remove_all(self): |
| 45 | folder_list = [] | ||
| 46 | zipin = zipfile.ZipFile(self.filename, 'r') | 76 | zipin = zipfile.ZipFile(self.filename, 'r') |
| 47 | zipout = zipfile.ZipFile(self.filename + parser.POSTFIX, 'w', | 77 | zipout = zipfile.ZipFile(self.filename + parser.POSTFIX, 'w', |
| 48 | allowZip64=True) | 78 | allowZip64=True) |
| @@ -69,6 +99,7 @@ class ZipStripper(GenericArchiveStripper): | |||
| 69 | zipin.close() | 99 | zipin.close() |
| 70 | zipout.close() | 100 | zipout.close() |
| 71 | 101 | ||
| 102 | |||
| 72 | class TarStripper(GenericArchiveStripper): | 103 | class TarStripper(GenericArchiveStripper): |
| 73 | def _remove(self, current_file): | 104 | def _remove(self, current_file): |
| 74 | ''' | 105 | ''' |
| @@ -130,6 +161,8 @@ class TarStripper(GenericArchiveStripper): | |||
| 130 | def is_clean(self): | 161 | def is_clean(self): |
| 131 | tarin = tarfile.open(self.filename, 'r' + self.compression) | 162 | tarin = tarfile.open(self.filename, 'r' + self.compression) |
| 132 | for current_file in tarin.getmembers(): | 163 | for current_file in tarin.getmembers(): |
| 164 | if not self.is_file_clean(current_file): | ||
| 165 | return False | ||
| 133 | tarin.extract(current_file) | 166 | tarin.extract(current_file) |
| 134 | if current_file.type is '0': #is current_file a regular file ? | 167 | if current_file.type is '0': #is current_file a regular file ? |
| 135 | #no backup file | 168 | #no backup file |
| @@ -139,8 +172,6 @@ class TarStripper(GenericArchiveStripper): | |||
| 139 | mat.secure_remove(current_file.name) #remove it | 172 | mat.secure_remove(current_file.name) #remove it |
| 140 | self.remove_folder() #remove all the remaining folders | 173 | self.remove_folder() #remove all the remaining folders |
| 141 | return False | 174 | return False |
| 142 | if not self.is_file_clean(current_file): | ||
| 143 | return False | ||
| 144 | mat.secure_remove(current_file.name) | 175 | mat.secure_remove(current_file.name) |
| 145 | else: | 176 | else: |
| 146 | self.folder_list.insert(0, current_file.name) | 177 | self.folder_list.insert(0, current_file.name) |
| @@ -166,14 +197,14 @@ class TarStripper(GenericArchiveStripper): | |||
| 166 | 197 | ||
| 167 | 198 | ||
| 168 | class GzipStripper(TarStripper): | 199 | class GzipStripper(TarStripper): |
| 169 | def __init__(self, realname, filename, parser, editor, backup): | 200 | def __init__(self, realname, filename, parser, editor, backup, add2archive): |
| 170 | super(GzipStripper, self).__init__(realname, | 201 | super(GzipStripper, self).__init__(realname, |
| 171 | filename, parser, editor, backup) | 202 | filename, parser, editor, backup, add2archive) |
| 172 | self.compression = ':gz' | 203 | self.compression = ':gz' |
| 173 | 204 | ||
| 174 | 205 | ||
| 175 | class Bzip2Stripper(TarStripper): | 206 | class Bzip2Stripper(TarStripper): |
| 176 | def __init__(self, realname, filename, parser, editor, backup): | 207 | def __init__(self, realname, filename, parser, editor, backup, add2archive): |
| 177 | super(Bzip2Stripper, self).__init__(realname, | 208 | super(Bzip2Stripper, self).__init__(realname, |
| 178 | filename, parser, editor, backup) | 209 | filename, parser, editor, backup, add2archive) |
| 179 | self.compression = ':bz2' | 210 | self.compression = ':bz2' |
