summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjvoisin2011-07-21 22:09:11 +0200
committerjvoisin2011-07-21 22:09:11 +0200
commit3432cd8313e0165938f3dcdf3068be97eb924b13 (patch)
tree22140c233cef8a73d07869b0f769f0c94ccca5dc /lib
parentebc4b477e5dc5e80e73644ca855eb37767afdcdd (diff)
Add is_clean() tor zip archives (add fix a regression for tar.*)
Diffstat (limited to 'lib')
-rw-r--r--lib/archive.py45
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
27class ZipStripper(GenericArchiveStripper): 28class 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
72class TarStripper(GenericArchiveStripper): 103class 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
168class GzipStripper(TarStripper): 199class 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
175class Bzip2Stripper(TarStripper): 206class 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'