From 91099e25446b214725f8e2ffffbec6f90553260c Mon Sep 17 00:00:00 2001 From: Daniel Hillier Date: Fri, 24 Sep 2021 07:37:53 +1000 Subject: [PATCH] bpo-39359: [zipfile] add missing "pwd: expected bytes, got str" exception (GH-18031) --- Lib/test/test_zipfile.py | 21 +++++++++++++++---- Lib/zipfile.py | 4 ++-- .../2020-01-16-13-54-28.bpo-39359.hzTu0h.rst | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 325491fd809..df48fabff95 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2190,10 +2190,23 @@ def test_good_password(self): 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 3efeecb13bd..8e9325b9343 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1508,8 +1508,6 @@ def open(self, name, mode="r", pwd=None, *, force_zip64=False): """ 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 @@ def open(self, name, mode="r", pwd=None, *, force_zip64=False): 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 00000000000..ed4eb0c873d --- /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