diff options
author | 2021-09-24 07:37:53 +1000 | |
---|---|---|
committer | 2021-09-23 23:37:53 +0200 | |
commit | 91099e25446b214725f8e2ffffbec6f90553260c (patch) | |
tree | accd914e2f290a671b7448ea31ffd104ac9e453b | |
parent | bpo-38415: Allow using @asynccontextmanager-made ctx managers as decorators (... (diff) | |
download | cpython-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.py | 21 | ||||
-rw-r--r-- | Lib/zipfile.py | 4 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst | 1 |
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 |