Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Open
Description
Feature or enhancement
Proposal:
This is follow up from#53416
Even ifstdlib
will never support WinZIP AES encrpyption, it would be useful to allow for downstream project to implement it.
There ispyzipper based on a fork but the code is now very different to what we have in stdlib.
it would help if thestdlib
zipfile code is written to allow dependency injection
A very simple proof of concept downstream code is here that canonly read AES ZIP files is here
https://github.com/chevah/zipfile-aes
It is using a patch for stdblib that looks like this
--- lib/python3.12/zipfile/__init__.py 2025-07-17 11:19:59.376677338 +0100+++ src/dev_tools/zipfile_init.py 2025-07-17 11:21:50.797894299 +0100@@ -1286,6 +1286,9 @@ """+ _ZipInfo = ZipInfo+ _ZipExtFile = ZipExtFile+ fp = None # Set here since __del__ checks it _windows_illegal_name_trans_table = None@@ -1456,7 +1459,7 @@ # Historical ZIP filename encoding filename = filename.decode(self.metadata_encoding or 'cp437') # Create ZipInfo instance to store file information- x = ZipInfo(filename)+ x = self._ZipInfo(filename) x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) x.comment = fp.read(centdir[_CD_COMMENT_LENGTH]) x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]@@ -1592,11 +1595,11 @@ "Attempt to use ZIP archive that was already closed") # Make sure we have an info object- if isinstance(name, ZipInfo):+ if isinstance(name, self._ZipInfo): # 'name' is already an info object zinfo = name elif mode == 'w':- zinfo = ZipInfo(name)+ zinfo = self._ZipInfo(name) zinfo.compress_type = self.compression zinfo._compresslevel = self.compresslevel else:@@ -1664,7 +1667,7 @@ else: pwd = None- return ZipExtFile(zef_file, mode, zinfo, pwd, True)+ return self._ZipExtFile(zef_file, mode, zinfo, pwd, True) except: zef_file.close() raise@@ -1762,7 +1765,7 @@ """Extract the ZipInfo object 'member' to a physical file on the path targetpath. """- if not isinstance(member, ZipInfo):+ if not isinstance(member, self._ZipInfo): member = self.getinfo(member) # build the destination pathname, replacing@@ -1838,7 +1841,7 @@ "Can't write to ZIP archive while an open writing handle exists" )- zinfo = ZipInfo.from_file(filename, arcname,+ zinfo = self._ZipInfo.from_file(filename, arcname, strict_timestamps=self._strict_timestamps) if zinfo.is_dir():@@ -1868,8 +1871,8 @@ the name of the file in the archive.""" if isinstance(data, str): data = data.encode("utf-8")- if not isinstance(zinfo_or_arcname, ZipInfo):- zinfo = ZipInfo(filename=zinfo_or_arcname,+ if not isinstance(zinfo_or_arcname, self._ZipInfo):+ zinfo = self._ZipInfo(filename=zinfo_or_arcname, date_time=time.localtime(time.time())[:6]) zinfo.compress_type = self.compression zinfo._compresslevel = self.compresslevel@@ -1910,7 +1913,7 @@ directory_name = zinfo_or_directory_name if not directory_name.endswith("/"): directory_name += "/"- zinfo = ZipInfo(directory_name)+ zinfo = self._ZipInfo(directory_name) zinfo.compress_size = 0 zinfo.CRC = 0 zinfo.external_attr = ((0o40000 | mode) & 0xFFFF) << 16
Would you consider such a patch ?
Thanks
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
PR at#14957
Metadata
Metadata
Assignees
Projects
Status
No status