]> granicus.if.org Git - python/commitdiff
Issue #21068: The ssl.PROTOCOL* constants are now enum members.
authorAntoine Pitrou <solipsis@pitrou.net>
Fri, 18 Apr 2014 18:33:08 +0000 (20:33 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Fri, 18 Apr 2014 18:33:08 +0000 (20:33 +0200)
Lib/ssl.py
Lib/test/test_ssl.py
Misc/NEWS

index d2be3ce5acd2ad4299ffe37036fa70980a1a8b92..d6a63dbb992aa3e73a4b23cb0ececf6b212991a6 100644 (file)
@@ -92,7 +92,7 @@ import re
 import sys
 import os
 from collections import namedtuple
-from enum import Enum as _Enum
+from enum import Enum as _Enum, IntEnum as _IntEnum
 
 import _ssl             # if we can't import it, let the error propagate
 
@@ -119,30 +119,19 @@ _import_symbols('SSL_ERROR_')
 
 from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN
 
-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
 from _ssl import _OPENSSL_API_VERSION
 
+_SSLMethod = _IntEnum('_SSLMethod',
+                      {name: value for name, value in vars(_ssl).items()
+                       if name.startswith('PROTOCOL_')})
+globals().update(_SSLMethod.__members__)
+
+_PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
 
-_PROTOCOL_NAMES = {
-    PROTOCOL_TLSv1: "TLSv1",
-    PROTOCOL_SSLv23: "SSLv23",
-    PROTOCOL_SSLv3: "SSLv3",
-}
 try:
-    from _ssl import PROTOCOL_SSLv2
     _SSLv2_IF_EXISTS = PROTOCOL_SSLv2
-except ImportError:
+except NameError:
     _SSLv2_IF_EXISTS = None
-else:
-    _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2"
-
-try:
-    from _ssl import PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2
-except ImportError:
-    pass
-else:
-    _PROTOCOL_NAMES[PROTOCOL_TLSv1_1] = "TLSv1.1"
-    _PROTOCOL_NAMES[PROTOCOL_TLSv1_2] = "TLSv1.2"
 
 if sys.platform == "win32":
     from _ssl import enum_certificates, enum_crls
index 9f5bd09b99df49b945c5b52689f4c2a7f82112e7..a2ab79577ddd1ac2915cbff1ee4a6067fc424461 100644 (file)
@@ -134,6 +134,14 @@ class BasicSocketTests(unittest.TestCase):
         self.assertIn(ssl.HAS_SNI, {True, False})
         self.assertIn(ssl.HAS_ECDH, {True, False})
 
+    def test_str_for_enums(self):
+        # Make sure that the PROTOCOL_* constants have enum-like string
+        # reprs.
+        proto = ssl.PROTOCOL_SSLv3
+        self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_SSLv3')
+        ctx = ssl.SSLContext(proto)
+        self.assertIs(ctx.protocol, proto)
+
     def test_random(self):
         v = ssl.RAND_status()
         if support.verbose:
index 0c1a573a5b542f855217afd172af8c0a8bea0993..76fc436bfcfd15762cb99089238a7d2ec7eee78e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -54,6 +54,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #21068: The ssl.PROTOCOL* constants are now enum members.
+
 - Issue #21262: New method assert_not_called for Mock.
   It raises AssertionError if the mock has been called.