An interpreted, interactive, object-oriented programming language
CentOS Sources
2017-08-01 71084d584ff953f5463757ec6536406320560b4d
commit | author | age
04a680 1 @@ -, +, @@ 
CS 2 ---
3  Lib/ssl.py | 53 ++++++++++++++++++++++++++++++++++++++---------------
4  1 file changed, 38 insertions(+), 15 deletions(-)
5 --- a/Lib/ssl.py    
6 +++ a/Lib/ssl.py    
7 @@ -466,24 +466,47 @@ def _create_unverified_context(protocol=PROTOCOL_SSLv23, cert_reqs=None,
8  
9      return context
10  
11 +_https_verify_envvar = 'PYTHONHTTPSVERIFY'
12  _cert_verification_config = '/etc/python/cert-verification.cfg'
13  
14 -def _get_verify_status(protocol):
15 -   context_factory = {
16 -       'platform_default': _create_unverified_context,
17 -       'enable': create_default_context,
18 -       'disable': _create_unverified_context
19 -   }
20 -   import ConfigParser
21 -   try:
22 -       config = ConfigParser.RawConfigParser()
23 -       config.read(_cert_verification_config)
24 -       status = config.get(protocol, 'verify')
25 -   except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
26 -       status = 'platform_default'
27 -   default = context_factory.get('platform_default')
28 -   return context_factory.get(status, default)
29 +# To provide same function name as specified in PEP493 with keeping
30 +# the old name as defined in our previous patch
31 +_get_https_context_factory = lambda: _get_verify_status('https')
32  
33 +def _get_verify_status(protocol):
34 +    # See https://www.python.org/dev/peps/pep-0493/#recommendation-for-combined-feature-backports
35 +    # Check for an environmental override of the default behaviour
36 +    if not sys.flags.ignore_environment:
37 +        config_setting = os.environ.get(_https_verify_envvar)
38 +        if config_setting is not None:
39 +            if config_setting == '0':
40 +                return _create_unverified_context
41 +            return create_default_context
42 +
43 +    # Check for a system-wide override of the default behaviour
44 +    context_factory = {
71084d 45 +        'platform_default': create_default_context,
04a680 46 +        'enable': create_default_context,
CS 47 +        'disable': _create_unverified_context
48 +    }
49 +    import ConfigParser
50 +    try:
51 +        config = ConfigParser.RawConfigParser()
52 +        config.read(_cert_verification_config)
53 +        status = config.get(protocol, 'verify')
54 +    except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
55 +        status = 'platform_default'
56 +    default = context_factory.get('platform_default')
57 +    return context_factory.get(status, default)
58 +
59 +# See https://www.python.org/dev/peps/pep-0493/#feature-configuration-api
60 +def _https_verify_certificates(enable=True):
61 +    """Verify server HTTPS certificates by default?"""
62 +    global _create_default_https_context
63 +    if enable:
64 +        _create_default_https_context = create_default_context
65 +    else:
66 +        _create_default_https_context = _create_unverified_context
67  
68  # Used by http.client if no context is explicitly passed.
69  _create_default_https_context = _get_verify_status('https')
70 --- a/Lib/test/test_ssl.py    Thu Jan 14 21:57:57 2016 -0800
71 +++ a/Lib/test/test_ssl.py    Fri Jan 15 17:41:37 2016 +1000
72 @@ -4,6 +4,7 @@
73  import sys
74  import unittest
75  from test import test_support as support
76 +from test.script_helper import assert_python_ok
77  import asyncore
78  import socket
79  import select
71084d 80 @@ -1149,6 +1149,57 @@
04a680 81          self.assertEqual(ctx.verify_mode, ssl.CERT_NONE)
CS 82          self.assertEqual(ctx.options & ssl.OP_NO_SSLv2, ssl.OP_NO_SSLv2)
83  
84 +    def test__https_verify_certificates(self):
85 +        # Unit test to check the contect factory mapping
86 +        # The factories themselves are tested above
87 +        # This test will fail by design if run under PYTHONHTTPSVERIFY=0
88 +        # (as will various test_httplib tests)
89 +
90 +        # Uses a fresh SSL module to avoid affecting the real one
91 +        local_ssl = support.import_fresh_module("ssl")
92 +        # Certificate verification is enabled by default
93 +        self.assertIs(local_ssl._create_default_https_context,
94 +                      local_ssl.create_default_context)
71084d 95 +        # Turn default verification off
04a680 96 +        local_ssl._https_verify_certificates(enable=False)
CS 97 +        self.assertIs(local_ssl._create_default_https_context,
98 +                      local_ssl._create_unverified_context)
71084d 99 +        # And back on
04a680 100 +        local_ssl._https_verify_certificates(enable=True)
71084d 101 +        self.assertIs(local_ssl._create_default_https_context,
CS 102 +                      local_ssl.create_default_context)
103 +        # The default behaviour is to enable
104 +        local_ssl._https_verify_certificates(enable=False)
04a680 105 +        local_ssl._https_verify_certificates()
CS 106 +        self.assertIs(local_ssl._create_default_https_context,
107 +                      local_ssl.create_default_context)
108 +
109 +    def test__https_verify_envvar(self):
110 +        # Unit test to check the PYTHONHTTPSVERIFY handling
111 +        # Need to use a subprocess so it can still be run under -E
71084d 112 +        https_is_verified = """import ssl, sys; \
CS 113 +            status = "Error: _create_default_https_context does not verify certs" \
114 +                       if ssl._create_default_https_context is \
115 +                          ssl._create_unverified_context \
116 +                     else None; \
117 +            sys.exit(status)"""
118 +        https_is_not_verified = """import ssl, sys; \
119 +            status = "Error: _create_default_https_context verifies certs" \
120 +                       if ssl._create_default_https_context is \
121 +                          ssl.create_default_context \
122 +                     else None; \
123 +            sys.exit(status)"""
04a680 124 +        extra_env = {}
71084d 125 +        # Omitting it leaves verification on
CS 126 +        assert_python_ok("-c", https_is_verified, **extra_env)
04a680 127 +        # Setting it to zero turns verification off
CS 128 +        extra_env[ssl._https_verify_envvar] = "0"
129 +        assert_python_ok("-c", https_is_not_verified, **extra_env)
130 +        # Any other value should also leave it on
131 +        for setting in ("", "1", "enabled", "foo"):
132 +            extra_env[ssl._https_verify_envvar] = setting
133 +            assert_python_ok("-c", https_is_verified, **extra_env)
134 +
135      def test_check_hostname(self):
136          ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
137          self.assertFalse(ctx.check_hostname)