mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
add a filterfunc to zip file.PyZipFile.writepy, issue 19274
This commit is contained in:
parent
47f1b762fd
commit
59202e5fc7
4 changed files with 204 additions and 159 deletions
|
@ -591,6 +591,28 @@ class PyZipFileTests(unittest.TestCase):
|
|||
self.assertCompiledIn('email/__init__.py', names)
|
||||
self.assertCompiledIn('email/mime/text.py', names)
|
||||
|
||||
def test_write_filtered_python_package(self):
|
||||
import test
|
||||
packagedir = os.path.dirname(test.__file__)
|
||||
|
||||
with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
|
||||
|
||||
stdout = sys.stdout
|
||||
|
||||
# first make sure that the test folder gives error messages
|
||||
sys.stdout = reportSIO = io.StringIO()
|
||||
zipfp.writepy(packagedir)
|
||||
reportStr = reportSIO.getvalue()
|
||||
self.assertTrue('SyntaxError' in reportStr)
|
||||
|
||||
# then check that the filter works
|
||||
sys.stdout = reportSIO = io.StringIO()
|
||||
zipfp.writepy(packagedir, filterfunc=lambda whatever:False)
|
||||
reportStr = reportSIO.getvalue()
|
||||
self.assertTrue('SyntaxError' not in reportStr)
|
||||
|
||||
sys.stdout = stdout
|
||||
|
||||
def test_write_with_optimization(self):
|
||||
import email
|
||||
packagedir = os.path.dirname(email.__file__)
|
||||
|
@ -600,7 +622,7 @@ class PyZipFileTests(unittest.TestCase):
|
|||
ext = '.pyo' if optlevel == 1 else '.pyc'
|
||||
|
||||
with TemporaryFile() as t, \
|
||||
zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp:
|
||||
zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp:
|
||||
zipfp.writepy(packagedir)
|
||||
|
||||
names = zipfp.namelist()
|
||||
|
@ -733,25 +755,25 @@ class ExtractTests(unittest.TestCase):
|
|||
def test_extract_hackers_arcnames_windows_only(self):
|
||||
"""Test combination of path fixing and windows name sanitization."""
|
||||
windows_hacknames = [
|
||||
(r'..\foo\bar', 'foo/bar'),
|
||||
(r'..\/foo\/bar', 'foo/bar'),
|
||||
(r'foo/\..\/bar', 'foo/bar'),
|
||||
(r'foo\/../\bar', 'foo/bar'),
|
||||
(r'C:foo/bar', 'foo/bar'),
|
||||
(r'C:/foo/bar', 'foo/bar'),
|
||||
(r'C://foo/bar', 'foo/bar'),
|
||||
(r'C:\foo\bar', 'foo/bar'),
|
||||
(r'//conky/mountpoint/foo/bar', 'foo/bar'),
|
||||
(r'\\conky\mountpoint\foo\bar', 'foo/bar'),
|
||||
(r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'//?/C:/foo/bar', 'foo/bar'),
|
||||
(r'\\?\C:\foo\bar', 'foo/bar'),
|
||||
(r'C:/../C:/foo/bar', 'C_/foo/bar'),
|
||||
(r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'),
|
||||
('../../foo../../ba..r', 'foo/ba..r'),
|
||||
(r'..\foo\bar', 'foo/bar'),
|
||||
(r'..\/foo\/bar', 'foo/bar'),
|
||||
(r'foo/\..\/bar', 'foo/bar'),
|
||||
(r'foo\/../\bar', 'foo/bar'),
|
||||
(r'C:foo/bar', 'foo/bar'),
|
||||
(r'C:/foo/bar', 'foo/bar'),
|
||||
(r'C://foo/bar', 'foo/bar'),
|
||||
(r'C:\foo\bar', 'foo/bar'),
|
||||
(r'//conky/mountpoint/foo/bar', 'foo/bar'),
|
||||
(r'\\conky\mountpoint\foo\bar', 'foo/bar'),
|
||||
(r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'),
|
||||
(r'//?/C:/foo/bar', 'foo/bar'),
|
||||
(r'\\?\C:\foo\bar', 'foo/bar'),
|
||||
(r'C:/../C:/foo/bar', 'C_/foo/bar'),
|
||||
(r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'),
|
||||
('../../foo../../ba..r', 'foo/ba..r'),
|
||||
]
|
||||
self._test_extract_hackers_arcnames(windows_hacknames)
|
||||
|
||||
|
@ -877,10 +899,10 @@ class OtherTests(unittest.TestCase):
|
|||
def test_unsupported_version(self):
|
||||
# File has an extract_version of 120
|
||||
data = (b'PK\x03\x04x\x00\x00\x00\x00\x00!p\xa1@\x00\x00\x00\x00\x00\x00'
|
||||
b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00'
|
||||
b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00'
|
||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06'
|
||||
b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00')
|
||||
b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00'
|
||||
b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00'
|
||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06'
|
||||
b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00')
|
||||
|
||||
self.assertRaises(NotImplementedError, zipfile.ZipFile,
|
||||
io.BytesIO(data), 'r')
|
||||
|
@ -1066,11 +1088,11 @@ class OtherTests(unittest.TestCase):
|
|||
def test_unsupported_compression(self):
|
||||
# data is declared as shrunk, but actually deflated
|
||||
data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00'
|
||||
b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01'
|
||||
b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00'
|
||||
b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00'
|
||||
b'/\x00\x00\x00!\x00\x00\x00\x00\x00')
|
||||
b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01'
|
||||
b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00'
|
||||
b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00'
|
||||
b'/\x00\x00\x00!\x00\x00\x00\x00\x00')
|
||||
with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf:
|
||||
self.assertRaises(NotImplementedError, zipf.open, 'x')
|
||||
|
||||
|
@ -1232,57 +1254,57 @@ class AbstractBadCrcTests:
|
|||
class StoredBadCrcTests(AbstractBadCrcTests, unittest.TestCase):
|
||||
compression = zipfile.ZIP_STORED
|
||||
zip_with_bad_crc = (
|
||||
b'PK\003\004\024\0\0\0\0\0 \213\212;:r'
|
||||
b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af'
|
||||
b'ilehello,AworldP'
|
||||
b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:'
|
||||
b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0'
|
||||
b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi'
|
||||
b'lePK\005\006\0\0\0\0\001\0\001\0003\000'
|
||||
b'\0\0/\0\0\0\0\0')
|
||||
b'PK\003\004\024\0\0\0\0\0 \213\212;:r'
|
||||
b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af'
|
||||
b'ilehello,AworldP'
|
||||
b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:'
|
||||
b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0'
|
||||
b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi'
|
||||
b'lePK\005\006\0\0\0\0\001\0\001\0003\000'
|
||||
b'\0\0/\0\0\0\0\0')
|
||||
|
||||
@requires_zlib
|
||||
class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase):
|
||||
compression = zipfile.ZIP_DEFLATED
|
||||
zip_with_bad_crc = (
|
||||
b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA'
|
||||
b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0'
|
||||
b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n'
|
||||
b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05'
|
||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00'
|
||||
b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00'
|
||||
b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00')
|
||||
b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA'
|
||||
b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0'
|
||||
b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n'
|
||||
b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05'
|
||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00'
|
||||
b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00'
|
||||
b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00')
|
||||
|
||||
@requires_bz2
|
||||
class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase):
|
||||
compression = zipfile.ZIP_BZIP2
|
||||
zip_with_bad_crc = (
|
||||
b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA'
|
||||
b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ileBZh91AY&SY\xd4\xa8\xca'
|
||||
b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5'
|
||||
b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f'
|
||||
b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14'
|
||||
b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8'
|
||||
b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK'
|
||||
b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00'
|
||||
b'\x00\x00\x00\x00')
|
||||
b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA'
|
||||
b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ileBZh91AY&SY\xd4\xa8\xca'
|
||||
b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5'
|
||||
b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f'
|
||||
b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14'
|
||||
b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8'
|
||||
b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK'
|
||||
b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00'
|
||||
b'\x00\x00\x00\x00')
|
||||
|
||||
@requires_lzma
|
||||
class LzmaBadCrcTests(AbstractBadCrcTests, unittest.TestCase):
|
||||
compression = zipfile.ZIP_LZMA
|
||||
zip_with_bad_crc = (
|
||||
b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I'
|
||||
b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK'
|
||||
b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00'
|
||||
b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil'
|
||||
b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00'
|
||||
b'\x00>\x00\x00\x00\x00\x00')
|
||||
b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I'
|
||||
b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK'
|
||||
b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00'
|
||||
b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil'
|
||||
b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00'
|
||||
b'\x00>\x00\x00\x00\x00\x00')
|
||||
|
||||
|
||||
class DecryptionTests(unittest.TestCase):
|
||||
|
@ -1291,22 +1313,22 @@ class DecryptionTests(unittest.TestCase):
|
|||
ZIP file."""
|
||||
|
||||
data = (
|
||||
b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00'
|
||||
b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y'
|
||||
b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl'
|
||||
b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00'
|
||||
b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81'
|
||||
b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00'
|
||||
b'\x00\x00L\x00\x00\x00\x00\x00' )
|
||||
b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00'
|
||||
b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y'
|
||||
b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl'
|
||||
b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00'
|
||||
b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81'
|
||||
b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00'
|
||||
b'\x00\x00L\x00\x00\x00\x00\x00' )
|
||||
data2 = (
|
||||
b'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02'
|
||||
b'\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04'
|
||||
b'\x00\xe8\x03\xe8\x03\xc7<M\xb5a\xceX\xa3Y&\x8b{oE\xd7\x9d\x8c\x98\x02\xc0'
|
||||
b'PK\x07\x08xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00PK\x01\x02\x17\x03'
|
||||
b'\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00'
|
||||
b'\x04\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00ze'
|
||||
b'roUT\x05\x00\x03\xd6\x8b\x92GUx\x00\x00PK\x05\x06\x00\x00\x00\x00\x01'
|
||||
b'\x00\x01\x00?\x00\x00\x00[\x00\x00\x00\x00\x00' )
|
||||
b'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02'
|
||||
b'\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04'
|
||||
b'\x00\xe8\x03\xe8\x03\xc7<M\xb5a\xceX\xa3Y&\x8b{oE\xd7\x9d\x8c\x98\x02\xc0'
|
||||
b'PK\x07\x08xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00PK\x01\x02\x17\x03'
|
||||
b'\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00'
|
||||
b'\x04\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00ze'
|
||||
b'roUT\x05\x00\x03\xd6\x8b\x92GUx\x00\x00PK\x05\x06\x00\x00\x00\x00\x01'
|
||||
b'\x00\x01\x00?\x00\x00\x00[\x00\x00\x00\x00\x00' )
|
||||
|
||||
plain = b'zipfile.py encryption test'
|
||||
plain2 = b'\x00'*512
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue