114 def check_contents(self): |
114 def check_contents(self): |
115 self.archive.seek(0, 0) |
115 self.archive.seek(0, 0) |
116 filenames = self.get_filenames() |
116 filenames = self.get_filenames() |
117 try: |
117 try: |
118 first_part = filenames.next().split('/', 1)[0] + '/' |
118 first_part = filenames.next().split('/', 1)[0] + '/' |
119 except IndexError: |
119 except StopIteration: |
120 filenames.stop() |
120 filenames.stop() |
121 return EMPTY |
121 return EMPTY |
122 for filename in filenames: |
122 for filename in filenames: |
123 if not filename.startswith(first_part): |
123 if not filename.startswith(first_part): |
124 filenames.stop() |
124 filenames.stop() |
128 return MATCHING_DIRECTORY |
128 return MATCHING_DIRECTORY |
129 return ONE_DIRECTORY |
129 return ONE_DIRECTORY |
130 |
130 |
131 def basename(self): |
131 def basename(self): |
132 pieces = self.filename.split('.') |
132 pieces = self.filename.split('.') |
133 if mimetypes.encodings_map.has_key('.' + pieces.pop()): |
133 extension = '.' + pieces[-1] |
|
134 if mimetypes.encodings_map.has_key(extension): |
|
135 pieces.pop() |
|
136 extension = '.' + pieces[-1] |
|
137 if (mimetypes.types_map.has_key(extension) or |
|
138 mimetypes.common_types.has_key(extension) or |
|
139 mimetypes.suffix_map.has_key(extension)): |
134 pieces.pop() |
140 pieces.pop() |
135 return '.'.join(pieces) |
141 return '.'.join(pieces) |
136 |
142 |
137 def extract(self, path): |
143 def extract(self, path): |
138 self.archive.seek(0, 0) |
144 self.archive.seek(0, 0) |
175 class RPMExtractor(CpioExtractor): |
181 class RPMExtractor(CpioExtractor): |
176 def prepare(self): |
182 def prepare(self): |
177 self.pipe(['rpm2cpio', '-'], "rpm2cpio") |
183 self.pipe(['rpm2cpio', '-'], "rpm2cpio") |
178 |
184 |
179 def basename(self): |
185 def basename(self): |
180 return self.filename.rsplit('.', 2)[0] |
186 pieces = self.filename.rsplit('.', 2) |
|
187 if len(pieces) == 1: |
|
188 return pieces[0] |
|
189 elif pieces[-1] != 'rpm': |
|
190 return BaseExtractor.basename(self) |
|
191 pieces.pop() |
|
192 if len(pieces) == 1: |
|
193 return pieces[0] |
|
194 elif len(pieces[-1]) < 6: |
|
195 pieces.pop() |
|
196 return '.'.join(pieces) |
181 |
197 |
182 def check_contents(self): |
198 def check_contents(self): |
183 return BOMB |
199 return BOMB |
184 |
200 |
185 |
201 |
189 "data.tar.gz extraction") |
205 "data.tar.gz extraction") |
190 self.archive.seek(0, 0) |
206 self.archive.seek(0, 0) |
191 self.pipe(['zcat'], "data.tar.gz decompression") |
207 self.pipe(['zcat'], "data.tar.gz decompression") |
192 |
208 |
193 def basename(self): |
209 def basename(self): |
194 return self.filename.rsplit('_', 1)[0] |
210 pieces = self.filename.rsplit('_', 1) |
|
211 if len(pieces) == 1: |
|
212 return pieces[0] |
|
213 elif (len(pieces[-1]) > 10) or (not pieces[-1].endswith('.deb')): |
|
214 return BaseExtractor.basename(self) |
|
215 return pieces[0] |
195 |
216 |
196 def check_contents(self): |
217 def check_contents(self): |
197 return BOMB |
218 return BOMB |
198 |
219 |
199 |
220 |
200 extractor_map = {'application/x-tar': TarExtractor, |
221 extractor_map = {'application/x-tar': TarExtractor, |
201 'application/zip': ZipExtractor, |
222 'application/zip': ZipExtractor, |
|
223 'application/x-msdos-program': ZipExtractor, |
202 'application/x-debian-package': DebExtractor, |
224 'application/x-debian-package': DebExtractor, |
203 'application/x-redhat-package-manager': RPMExtractor, |
225 'application/x-redhat-package-manager': RPMExtractor, |
204 'application/x-shar': None, |
226 'application/x-shar': None, |
205 'application/x-cpio': CpioExtractor} |
227 'application/x-cpio': CpioExtractor} |
206 |
228 |