aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmat2/archive.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/libmat2/archive.py b/libmat2/archive.py
index 48c1594..3f9c8a7 100644
--- a/libmat2/archive.py
+++ b/libmat2/archive.py
@@ -120,6 +120,15 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
# pylint: disable=unused-argument
return member
+ @staticmethod
+ def _get_member_compression(member: ArchiveMember):
+ """Get the compression of the archive member."""
+
+ @staticmethod
+ def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember:
+ """Set the compression of the archive member."""
+ return member
+
def get_meta(self) -> Dict[str, Union[str, dict]]:
meta = dict() # type: Dict[str, Union[str, dict]]
@@ -184,6 +193,8 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
original_permissions = os.stat(full_path).st_mode
os.chmod(full_path, original_permissions | stat.S_IWUSR | stat.S_IRUSR)
+ original_compression = self._get_member_compression(item)
+
if self._specific_cleanup(full_path) is False:
logging.warning("Something went wrong during deep cleaning of %s",
member_name)
@@ -223,6 +234,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
zinfo = self.member_class(member_name) # type: ignore
zinfo = self._set_member_permissions(zinfo, original_permissions)
+ zinfo = self._set_member_compression(zinfo, original_compression)
clean_zinfo = self._clean_member(zinfo)
self._add_file_to_archive(zout, clean_zinfo, full_path)
@@ -368,7 +380,6 @@ class ZipParser(ArchiveBasedAbstractParser):
super().__init__(filename)
self.archive_class = zipfile.ZipFile
self.member_class = zipfile.ZipInfo
- self.zip_compression_type = zipfile.ZIP_DEFLATED
def is_archive_valid(self):
try:
@@ -410,7 +421,7 @@ class ZipParser(ArchiveBasedAbstractParser):
assert isinstance(member, zipfile.ZipInfo) # please mypy
with open(full_path, 'rb') as f:
archive.writestr(member, f.read(),
- compress_type=self.zip_compression_type)
+ compress_type=member.compress_type)
@staticmethod
def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]:
@@ -421,3 +432,12 @@ class ZipParser(ArchiveBasedAbstractParser):
def _get_member_name(member: ArchiveMember) -> str:
assert isinstance(member, zipfile.ZipInfo) # please mypy
return member.filename
+
+ @staticmethod
+ def _get_member_compression(member: ArchiveMember):
+ return member.compress_type
+
+ @staticmethod
+ def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember:
+ member.compress_type = compression
+ return member