def extract(self, password=None): command = "x" if self.fullpath else "e" p = self.call_cmd(command, fs_encode(self.filename), self.out, password=password) renice(p.pid, self.renice) # communicate and retrieve stderr self._progress(p) err = p.stderr.read().strip() if err: if self.re_wrongpwd.search(err): raise PasswordError elif self.re_wrongcrc.search(err): raise CRCError(err) else: #: raise error if anything is on stderr raise ArchiveError(err) if p.returncode: raise ArchiveError(_("Process return code: %d") % p.returncode) self.files = self.list(password)
def list(self, password=None): command = "vb" if self.fullpath else "lb" p = self.call_cmd(command, "-v", fs_encode(self.filename), password=password) out, err = p.communicate() if "Cannot open" in err: raise ArchiveError(_("Cannot open file")) if err.strip(): #: only log error at this point self.manager.logError(err.strip()) result = set() if not self.fullpath and self.VERSION.startswith('5'): # NOTE: Unrar 5 always list full path for f in fs_decode(out).splitlines(): f = fs_join(self.out, os.path.basename(f.strip())) if os.path.isfile(f): result.add(fs_join(self.out, os.path.basename(f))) else: for f in fs_decode(out).splitlines(): f = f.strip() result.add(fs_join(self.out, f)) return list(result)
class UnZip(Extractor): __name = "UnZip" __type = "extractor" __version = "1.12" __description = """Zip extractor plugin""" __license = "GPLv3" __authors = [("Walter Purcaro", "*****@*****.**")] EXTENSIONS = [".zip", ".zip64"] NAME = __name__.rsplit('.', 1)[1] VERSION = "(python %s.%s.%s)" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]) @classmethod def isUsable(cls): return sys.version_info[:2] >= (2, 6) def list(self, password=None): with zipfile.ZipFile(fs_encode(self.filename), 'r', allowZip64=True) as z: z.setpassword(password) return z.namelist() def check(self, password): pass def verify(self): with zipfile.ZipFile(fs_encode(self.filename), 'r', allowZip64=True) as z: badfile = z.testzip() if badfile: raise CRCError(badfile) else: raise PasswordError def extract(self, password=None): try: with zipfile.ZipFile(fs_encode(self.filename), 'r', allowZip64=True) as z: z.setpassword(password) badfile = z.testzip() if badfile: raise CRCError(badfile) else: z.extractall(self.out) except (zipfile.BadZipfile, zipfile.LargeZipFile), e: raise ArchiveError(e) except RuntimeError, e: if "encrypted" in e: raise PasswordError else: raise ArchiveError(e)
def _extract(self, pyfile, archive, password): name = os.path.basename(archive.filename) pyfile.setStatus("processing") encrypted = False try: self.logDebug("Password: %s" % (password or "None provided")) passwords = uniqify([password] + self.getPasswords(False)) if self.getConfig( 'usepasswordfile') else [password] for pw in passwords: try: if self.getConfig('test') or self.repair: pyfile.setCustomStatus(_("archive testing")) if pw: self.logDebug("Testing with password: %s" % pw) pyfile.setProgress(0) archive.verify(pw) pyfile.setProgress(100) else: archive.check(pw) self.addPassword(pw) break except PasswordError: if not encrypted: self.logInfo(name, _("Password protected")) encrypted = True except CRCError, e: self.logDebug(name, e) self.logInfo(name, _("CRC Error")) if self.repair: self.logWarning(name, _("Repairing...")) pyfile.setCustomStatus(_("archive repairing")) pyfile.setProgress(0) repaired = archive.repair() pyfile.setProgress(100) if not repaired and not self.getConfig('keepbroken'): raise CRCError("Archive damaged") self.addPassword(pw) break raise CRCError("Archive damaged") except ArchiveError, e: raise ArchiveError(e)
def extract(self, password=None): try: with zipfile.ZipFile(fs_encode(self.filename), 'r', allowZip64=True) as z: z.setpassword(password) badfile = z.testzip() if badfile: raise CRCError(badfile) else: z.extractall(self.out) except (zipfile.BadZipfile, zipfile.LargeZipFile), e: raise ArchiveError(e)