def test_should_raise_if_zipfile_raised_LargeZipFile( self, zipfile_mock, tmpfile): zipfile_mock.side_effect = zipfile.LargeZipFile() dp = datapackage.DataPackage({}, {}) with pytest.raises(datapackage.exceptions.DataPackageException): dp.save(tmpfile)
def FileHeader(self, zip64=None): """Return the per-file header as a string.""" dt = self.date_time dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) if self.flag_bits & 0x08: # Set these to zero because we write them after the file data CRC = compress_size = file_size = 0 else: CRC = self.CRC compress_size = self.compress_size file_size = self.file_size extra = self.extra min_version = 0 if zip64 is None: zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT if zip64: fmt = '<HHQQ' extra = extra + struct.pack(fmt, 1, struct.calcsize(fmt)-4, file_size, compress_size) if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT: if not zip64: raise zipfile.LargeZipFile("Filesize would require ZIP64 extensions") # File is larger than what fits into a 4 byte integer, # fall back to the ZIP64 extension file_size = 0xffffffff compress_size = 0xffffffff min_version = ZIP64_VERSION if self.compress_type == ZIP_BZIP2: min_version = max(BZIP2_VERSION, min_version) elif self.compress_type == ZIP_LZMA: min_version = max(LZMA_VERSION, min_version) self.extract_version = max(min_version, self.extract_version) self.create_version = max(min_version, self.create_version) filename, flag_bits = self._encodeFilenameFlags() header = struct.pack(structFileHeader, stringFileHeader, self.extract_version, self.reserved, flag_bits, self.compress_type, dostime, dosdate, CRC, compress_size, file_size, len(filename), len(extra)) return header + filename + extra
def writestr(self, zinfo_or_arcname, _bytes, compress_type=None, pwd=None): """Write a file into the archive. The contents is the string 'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or the name of the file in the archive.""" if not isinstance(zinfo_or_arcname, zipfile.ZipInfo): zinfo = zipfile.ZipInfo(filename=zinfo_or_arcname, date_time=time.localtime(time.time())[:6]) zinfo.compress_type = self.compression if zinfo.filename[-1] == '/': zinfo.external_attr = 0o40775 << 16 # drwxrwxr-x zinfo.external_attr |= 0x10 # MS-DOS directory flag else: zinfo.external_attr = 0o600 << 16 # ?rw------- else: zinfo = zinfo_or_arcname if not self.fp: raise RuntimeError( "Attempt to write to ZIP archive that was already closed") if compress_type is not None: zinfo.compress_type = compress_type zinfo.file_size = len(_bytes) # Uncompressed size zinfo.header_offset = self.fp.tell() # Start of header bytes self._writecheck(zinfo) self._didModify = True zinfo.CRC = zipfile.crc32(_bytes) & 0xffffffff # CRC-32 checksum if zinfo.compress_type == zipfile.ZIP_DEFLATED: co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15) _bytes = co.compress(_bytes) + co.flush() zinfo.compress_size = len(_bytes) # Compressed size else: zinfo.compress_size = zinfo.file_size zip64 = zinfo.file_size > zipfile.ZIP64_LIMIT or zinfo.compress_size > zipfile.ZIP64_LIMIT if zip64 and not self._allowZip64: raise zipfile.LargeZipFile( "Filesize would require ZIP64 extensions") pwd = pwd or self.pwd if pwd: zinfo.flag_bits |= 0x01 zinfo.compress_size += 12 # 12 extra bytes for the header if zinfo.flag_bits & 0x8: zinfo._raw_time = (zinfo.date_time[3] << 11 | zinfo.date_time[4] << 5 | (zinfo.date_time[5] // 2)) check_byte = (zinfo._raw_time >> 8) & 0xff else: check_byte = (zinfo.CRC >> 24) & 0xff enryption_header = os.urandom(11) + chr(check_byte) ze = _ZipEncrypter(pwd) _bytes = "".join(map(ze, enryption_header + _bytes)) self.fp.write(zinfo.FileHeader(zip64)) self.fp.write(_bytes) if zinfo.flag_bits & 0x08: # Write CRC and file sizes after the file data fmt = '<LQQ' if zip64 else '<LLL' self.fp.write( struct.pack(fmt, zinfo.CRC, zinfo.compress_size, zinfo.file_size)) self.fp.flush() self.filelist.append(zinfo) self.NameToInfo[zinfo.filename] = zinfo
def test_should_raise_if_zipfile_raised_LargeZipFile(zipfile_mock, tmpfile): zipfile_mock.side_effect = zipfile.LargeZipFile() package = Package({}, {}) with pytest.raises(exceptions.DataPackageException): package.save(tmpfile)