aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hillier <daniel.hillier@gmail.com>2021-09-24 07:37:53 +1000
committerGitHub <noreply@github.com>2021-09-23 23:37:53 +0200
commit91099e25446b214725f8e2ffffbec6f90553260c (patch)
treeaccd914e2f290a671b7448ea31ffd104ac9e453b
parentbpo-38415: Allow using @asynccontextmanager-made ctx managers as decorators (... (diff)
downloadcpython-91099e25446b214725f8e2ffffbec6f90553260c.tar.gz
cpython-91099e25446b214725f8e2ffffbec6f90553260c.tar.bz2
cpython-91099e25446b214725f8e2ffffbec6f90553260c.zip
bpo-39359: [zipfile] add missing "pwd: expected bytes, got str" exception (GH-18031)
-rw-r--r--Lib/test/test_zipfile.py21
-rw-r--r--Lib/zipfile.py4
-rw-r--r--Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst1
3 files changed, 20 insertions, 6 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index 325491fd80..df48fabff9 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -2190,10 +2190,23 @@ class DecryptionTests(unittest.TestCase):
self.assertEqual(self.zip2.read("zero"), self.plain2)
def test_unicode_password(self):
- self.assertRaises(TypeError, self.zip.setpassword, "unicode")
- self.assertRaises(TypeError, self.zip.read, "test.txt", "python")
- self.assertRaises(TypeError, self.zip.open, "test.txt", pwd="python")
- self.assertRaises(TypeError, self.zip.extract, "test.txt", pwd="python")
+ expected_msg = "pwd: expected bytes, got str"
+
+ with self.assertRaisesRegex(TypeError, expected_msg):
+ self.zip.setpassword("unicode")
+
+ with self.assertRaisesRegex(TypeError, expected_msg):
+ self.zip.read("test.txt", "python")
+
+ with self.assertRaisesRegex(TypeError, expected_msg):
+ self.zip.open("test.txt", pwd="python")
+
+ with self.assertRaisesRegex(TypeError, expected_msg):
+ self.zip.extract("test.txt", pwd="python")
+
+ with self.assertRaisesRegex(TypeError, expected_msg):
+ self.zip.pwd = "python"
+ self.zip.open("test.txt")
def test_seek_tell(self):
self.zip.setpassword(b"python")
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 3efeecb13b..8e9325b934 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -1508,8 +1508,6 @@ class ZipFile:
"""
if mode not in {"r", "w"}:
raise ValueError('open() requires mode "r" or "w"')
- if pwd and not isinstance(pwd, bytes):
- raise TypeError("pwd: expected bytes, got %s" % type(pwd).__name__)
if pwd and (mode == "w"):
raise ValueError("pwd is only supported for reading files")
if not self.fp:
@@ -1577,6 +1575,8 @@ class ZipFile:
if is_encrypted:
if not pwd:
pwd = self.pwd
+ if pwd and not isinstance(pwd, bytes):
+ raise TypeError("pwd: expected bytes, got %s" % type(pwd).__name__)
if not pwd:
raise RuntimeError("File %r is encrypted, password "
"required for extraction" % name)
diff --git a/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst b/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst
new file mode 100644
index 0000000000..ed4eb0c873
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst
@@ -0,0 +1 @@
+Add one missing check that the password is a bytes object for an encrypted zipfile. \ No newline at end of file