parent
f458a03617
commit
e5e6444497
|
@ -456,8 +456,6 @@ class TestsWithSourceFile(unittest.TestCase):
|
||||||
('/foo/bar', 'foo/bar'),
|
('/foo/bar', 'foo/bar'),
|
||||||
('/foo/../bar', 'foo/bar'),
|
('/foo/../bar', 'foo/bar'),
|
||||||
('/foo/../../bar', 'foo/bar'),
|
('/foo/../../bar', 'foo/bar'),
|
||||||
('//foo/bar', 'foo/bar'),
|
|
||||||
('../../foo../../ba..r', 'foo../ba..r'),
|
|
||||||
]
|
]
|
||||||
if os.path.sep == '\\': # Windows.
|
if os.path.sep == '\\': # Windows.
|
||||||
hacknames.extend([
|
hacknames.extend([
|
||||||
|
@ -479,19 +477,32 @@ class TestsWithSourceFile(unittest.TestCase):
|
||||||
(r'\\?\C:\foo\bar', 'foo/bar'),
|
(r'\\?\C:\foo\bar', 'foo/bar'),
|
||||||
(r'C:/../C:/foo/bar', 'C_/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'),
|
(r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'),
|
||||||
|
('../../foo../../ba..r', 'foo/ba..r'),
|
||||||
|
])
|
||||||
|
else: # Unix
|
||||||
|
hacknames.extend([
|
||||||
|
('//foo/bar', 'foo/bar'),
|
||||||
|
('../../foo../../ba..r', 'foo../ba..r'),
|
||||||
|
(r'foo/..\bar', r'foo/..\bar'),
|
||||||
])
|
])
|
||||||
|
|
||||||
for arcname, fixedname in hacknames:
|
for arcname, fixedname in hacknames:
|
||||||
content = b'foobar' + arcname.encode()
|
content = b'foobar' + arcname.encode()
|
||||||
with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp:
|
with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp:
|
||||||
zipfp.writestr(arcname, content)
|
zinfo = zipfile.ZipInfo()
|
||||||
|
# preserve backslashes
|
||||||
|
zinfo.filename = arcname
|
||||||
|
zinfo.external_attr = 0o600 << 16
|
||||||
|
zipfp.writestr(zinfo, content)
|
||||||
|
|
||||||
|
arcname = arcname.replace(os.sep, "/")
|
||||||
targetpath = os.path.join('target', 'subdir', 'subsub')
|
targetpath = os.path.join('target', 'subdir', 'subsub')
|
||||||
correctfile = os.path.join(targetpath, *fixedname.split('/'))
|
correctfile = os.path.join(targetpath, *fixedname.split('/'))
|
||||||
|
|
||||||
with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
|
with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
|
||||||
writtenfile = zipfp.extract(arcname, targetpath)
|
writtenfile = zipfp.extract(arcname, targetpath)
|
||||||
self.assertEqual(writtenfile, correctfile)
|
self.assertEqual(writtenfile, correctfile,
|
||||||
|
msg="extract %r" % arcname)
|
||||||
self.check_file(correctfile, content)
|
self.check_file(correctfile, content)
|
||||||
shutil.rmtree('target')
|
shutil.rmtree('target')
|
||||||
|
|
||||||
|
@ -504,7 +515,8 @@ class TestsWithSourceFile(unittest.TestCase):
|
||||||
|
|
||||||
with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
|
with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
|
||||||
writtenfile = zipfp.extract(arcname)
|
writtenfile = zipfp.extract(arcname)
|
||||||
self.assertEqual(writtenfile, correctfile)
|
self.assertEqual(writtenfile, correctfile,
|
||||||
|
msg="extract %r" % arcname)
|
||||||
self.check_file(correctfile, content)
|
self.check_file(correctfile, content)
|
||||||
shutil.rmtree(fixedname.split('/')[0])
|
shutil.rmtree(fixedname.split('/')[0])
|
||||||
|
|
||||||
|
|
|
@ -1071,11 +1071,14 @@ class ZipFile:
|
||||||
arcname = os.path.splitdrive(arcname)[1]
|
arcname = os.path.splitdrive(arcname)[1]
|
||||||
arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
|
arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
|
||||||
if x not in ('', os.path.curdir, os.path.pardir))
|
if x not in ('', os.path.curdir, os.path.pardir))
|
||||||
# filter illegal characters on Windows
|
|
||||||
if os.path.sep == '\\':
|
if os.path.sep == '\\':
|
||||||
|
# filter illegal characters on Windows
|
||||||
illegal = ':<>|"?*'
|
illegal = ':<>|"?*'
|
||||||
table = str.maketrans(illegal, '_' * len(illegal))
|
table = str.maketrans(illegal, '_' * len(illegal))
|
||||||
arcname = arcname.translate(table)
|
arcname = arcname.translate(table)
|
||||||
|
# remove trailing dots
|
||||||
|
arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
|
||||||
|
arcname = os.path.sep.join(x for x in arcname if x)
|
||||||
|
|
||||||
targetpath = os.path.join(targetpath, arcname)
|
targetpath = os.path.join(targetpath, arcname)
|
||||||
targetpath = os.path.normpath(targetpath)
|
targetpath = os.path.normpath(targetpath)
|
||||||
|
|
Loading…
Reference in New Issue