summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2011-05-14 22:07:53 (GMT)
committerGregory P. Smith <greg@krypto.org>2011-05-14 22:07:53 (GMT)
commitfb1d60c800bd833e2d32c859df206e267ad62637 (patch)
tree83cc623fdc6c7ab2b1aee142174958fea58b4392
parent0cc4fd9df7e2a6d6a47c20e66c5b22d590c6be51 (diff)
downloadcpython-fb1d60c800bd833e2d32c859df206e267ad62637.zip
cpython-fb1d60c800bd833e2d32c859df206e267ad62637.tar.gz
cpython-fb1d60c800bd833e2d32c859df206e267ad62637.tar.bz2
Fixes Issue #12059: Properly handle missing hash functions even when
the expected builtin modules are not present. This includes a unittest for __get_builtin_constructor() in the face of such an error.
-rw-r--r--Lib/hashlib.py43
-rw-r--r--Lib/test/test_hashlib.py18
2 files changed, 41 insertions, 20 deletions
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index 48f2cfd..2732d18 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -64,26 +64,29 @@ __all__ = __always_supported + ('new', 'algorithms')
def __get_builtin_constructor(name):
- if name in ('SHA1', 'sha1'):
- import _sha
- return _sha.new
- elif name in ('MD5', 'md5'):
- import _md5
- return _md5.new
- elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
- import _sha256
- bs = name[3:]
- if bs == '256':
- return _sha256.sha256
- elif bs == '224':
- return _sha256.sha224
- elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
- import _sha512
- bs = name[3:]
- if bs == '512':
- return _sha512.sha512
- elif bs == '384':
- return _sha512.sha384
+ try:
+ if name in ('SHA1', 'sha1'):
+ import _sha
+ return _sha.new
+ elif name in ('MD5', 'md5'):
+ import _md5
+ return _md5.new
+ elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
+ import _sha256
+ bs = name[3:]
+ if bs == '256':
+ return _sha256.sha256
+ elif bs == '224':
+ return _sha256.sha224
+ elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
+ import _sha512
+ bs = name[3:]
+ if bs == '512':
+ return _sha512.sha512
+ elif bs == '384':
+ return _sha512.sha384
+ except ImportError:
+ pass # no extension module, this hash is unsupported.
raise ValueError('unsupported hash type %s' % name)
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index ed41672..855ecbf 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -115,6 +115,24 @@ class HashLibTestCase(unittest.TestCase):
else:
self.assertTrue(0 == "hashlib didn't reject bogus hash name")
+ def test_get_builtin_constructor(self):
+ get_builtin_constructor = hashlib.__dict__[
+ '__get_builtin_constructor']
+ self.assertRaises(ValueError, get_builtin_constructor, 'test')
+ try:
+ import _md5
+ except ImportError:
+ pass
+ # This forces an ImportError for "import _md5" statements
+ sys.modules['_md5'] = None
+ try:
+ self.assertRaises(ValueError, get_builtin_constructor, 'md5')
+ finally:
+ if '_md5' in locals():
+ sys.modules['_md5'] = _md5
+ else:
+ del sys.modules['_md5']
+
def test_hexdigest(self):
for name in self.supported_hash_names:
h = hashlib.new(name)