]> granicus.if.org Git - python/commitdiff
Fixes Issue #12059: Properly handle missing hash functions even when
authorGregory P. Smith <greg@krypto.org>
Sat, 14 May 2011 22:07:53 +0000 (15:07 -0700)
committerGregory P. Smith <greg@krypto.org>
Sat, 14 May 2011 22:07:53 +0000 (15:07 -0700)
the expected builtin modules are not present.

This includes a unittest for __get_builtin_constructor() in the face
of such an error.

Lib/hashlib.py
Lib/test/test_hashlib.py

index 48f2cfddbd76f09406c101d9f25051e13696b35c..2732d184aaf2c5db6a3ba5b554fe84d1f3d9c6eb 100644 (file)
@@ -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)
 
index ed41672ef032f3a793c0ab3519476654bf99873e..855ecbfb4e4af4dab55072f2a19841669eb2b168 100644 (file)
@@ -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)