mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-94172: Remove keyfile, certfile and check_hostname parameters (#94173)
Remove the keyfile, certfile and check_hostname parameters, deprecated since Python 3.6, in modules: ftplib, http.client, imaplib, poplib and smtplib. Use the context parameter (ssl_context in imaplib) instead. Parameters following the removed parameters become keyword-only parameters. ftplib: Remove the FTP_TLS.ssl_version class attribute: use the context parameter instead.
This commit is contained in:
parent
9c4ae037b9
commit
ef0e72b31d
12 changed files with 55 additions and 181 deletions
|
@ -984,11 +984,11 @@ class TestTLS_FTPClass(TestCase):
|
|||
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
self.assertRaises(ValueError, ftplib.FTP_TLS, keyfile=CERTFILE,
|
||||
self.assertRaises(TypeError, ftplib.FTP_TLS, keyfile=CERTFILE,
|
||||
context=ctx)
|
||||
self.assertRaises(ValueError, ftplib.FTP_TLS, certfile=CERTFILE,
|
||||
self.assertRaises(TypeError, ftplib.FTP_TLS, certfile=CERTFILE,
|
||||
context=ctx)
|
||||
self.assertRaises(ValueError, ftplib.FTP_TLS, certfile=CERTFILE,
|
||||
self.assertRaises(TypeError, ftplib.FTP_TLS, certfile=CERTFILE,
|
||||
keyfile=CERTFILE, context=ctx)
|
||||
|
||||
self.client = ftplib.FTP_TLS(context=ctx, timeout=TIMEOUT)
|
||||
|
|
|
@ -1978,7 +1978,7 @@ class HTTPSTest(TestCase):
|
|||
self.assertEqual(exc_info.exception.reason, 'CERTIFICATE_VERIFY_FAILED')
|
||||
|
||||
def test_local_good_hostname(self):
|
||||
# The (valid) cert validates the HTTP hostname
|
||||
# The (valid) cert validates the HTTPS hostname
|
||||
import ssl
|
||||
server = self.make_server(CERT_localhost)
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
|
@ -1991,7 +1991,7 @@ class HTTPSTest(TestCase):
|
|||
self.assertEqual(resp.status, 404)
|
||||
|
||||
def test_local_bad_hostname(self):
|
||||
# The (valid) cert doesn't validate the HTTP hostname
|
||||
# The (valid) cert doesn't validate the HTTPS hostname
|
||||
import ssl
|
||||
server = self.make_server(CERT_fakehostname)
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
|
@ -1999,38 +1999,21 @@ class HTTPSTest(TestCase):
|
|||
h = client.HTTPSConnection('localhost', server.port, context=context)
|
||||
with self.assertRaises(ssl.CertificateError):
|
||||
h.request('GET', '/')
|
||||
# Same with explicit check_hostname=True
|
||||
with warnings_helper.check_warnings(('', DeprecationWarning)):
|
||||
h = client.HTTPSConnection('localhost', server.port,
|
||||
context=context, check_hostname=True)
|
||||
|
||||
# Same with explicit context.check_hostname=True
|
||||
context.check_hostname = True
|
||||
h = client.HTTPSConnection('localhost', server.port, context=context)
|
||||
with self.assertRaises(ssl.CertificateError):
|
||||
h.request('GET', '/')
|
||||
# With check_hostname=False, the mismatching is ignored
|
||||
context.check_hostname = False
|
||||
with warnings_helper.check_warnings(('', DeprecationWarning)):
|
||||
h = client.HTTPSConnection('localhost', server.port,
|
||||
context=context, check_hostname=False)
|
||||
h.request('GET', '/nonexistent')
|
||||
resp = h.getresponse()
|
||||
resp.close()
|
||||
h.close()
|
||||
self.assertEqual(resp.status, 404)
|
||||
# The context's check_hostname setting is used if one isn't passed to
|
||||
# HTTPSConnection.
|
||||
|
||||
# With context.check_hostname=False, the mismatching is ignored
|
||||
context.check_hostname = False
|
||||
h = client.HTTPSConnection('localhost', server.port, context=context)
|
||||
h.request('GET', '/nonexistent')
|
||||
resp = h.getresponse()
|
||||
self.assertEqual(resp.status, 404)
|
||||
resp.close()
|
||||
h.close()
|
||||
# Passing check_hostname to HTTPSConnection should override the
|
||||
# context's setting.
|
||||
with warnings_helper.check_warnings(('', DeprecationWarning)):
|
||||
h = client.HTTPSConnection('localhost', server.port,
|
||||
context=context, check_hostname=True)
|
||||
with self.assertRaises(ssl.CertificateError):
|
||||
h.request('GET', '/')
|
||||
self.assertEqual(resp.status, 404)
|
||||
|
||||
@unittest.skipIf(not hasattr(client, 'HTTPSConnection'),
|
||||
'http.client.HTTPSConnection not available')
|
||||
|
@ -2066,11 +2049,9 @@ class HTTPSTest(TestCase):
|
|||
self.assertIs(h._context, context)
|
||||
self.assertFalse(h._context.post_handshake_auth)
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('ignore', 'key_file, cert_file and check_hostname are deprecated',
|
||||
DeprecationWarning)
|
||||
h = client.HTTPSConnection('localhost', 443, context=context,
|
||||
cert_file=CERT_localhost)
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT, cert_file=CERT_localhost)
|
||||
context.post_handshake_auth = True
|
||||
h = client.HTTPSConnection('localhost', 443, context=context)
|
||||
self.assertTrue(h._context.post_handshake_auth)
|
||||
|
||||
|
||||
|
|
|
@ -573,15 +573,6 @@ class NewIMAPSSLTests(NewIMAPTestsMixin, unittest.TestCase):
|
|||
ssl_context=ssl_context)
|
||||
client.shutdown()
|
||||
|
||||
# Mock the private method _connect(), so mark the test as specific
|
||||
# to CPython stdlib
|
||||
@cpython_only
|
||||
def test_certfile_arg_warn(self):
|
||||
with warnings_helper.check_warnings(('', DeprecationWarning)):
|
||||
with mock.patch.object(self.imap_class, 'open'):
|
||||
with mock.patch.object(self.imap_class, '_connect'):
|
||||
self.imap_class('localhost', 143, certfile=CERTFILE)
|
||||
|
||||
class ThreadedNetworkedTests(unittest.TestCase):
|
||||
server_class = socketserver.TCPServer
|
||||
imap_class = imaplib.IMAP4
|
||||
|
@ -1070,18 +1061,6 @@ class RemoteIMAP_SSLTest(RemoteIMAPTest):
|
|||
rs = _server.logout()
|
||||
self.assertEqual(rs[0], 'BYE', rs)
|
||||
|
||||
def test_ssl_context_certfile_exclusive(self):
|
||||
with socket_helper.transient_internet(self.host):
|
||||
self.assertRaises(
|
||||
ValueError, self.imap_class, self.host, self.port,
|
||||
certfile=CERTFILE, ssl_context=self.create_ssl_context())
|
||||
|
||||
def test_ssl_context_keyfile_exclusive(self):
|
||||
with socket_helper.transient_internet(self.host):
|
||||
self.assertRaises(
|
||||
ValueError, self.imap_class, self.host, self.port,
|
||||
keyfile=CERTFILE, ssl_context=self.create_ssl_context())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -425,13 +425,6 @@ class TestPOP3_SSLClass(TestPOP3Class):
|
|||
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
self.assertRaises(ValueError, poplib.POP3_SSL, self.server.host,
|
||||
self.server.port, keyfile=CERTFILE, context=ctx)
|
||||
self.assertRaises(ValueError, poplib.POP3_SSL, self.server.host,
|
||||
self.server.port, certfile=CERTFILE, context=ctx)
|
||||
self.assertRaises(ValueError, poplib.POP3_SSL, self.server.host,
|
||||
self.server.port, keyfile=CERTFILE,
|
||||
certfile=CERTFILE, context=ctx)
|
||||
|
||||
self.client.quit()
|
||||
self.client = poplib.POP3_SSL(self.server.host, self.server.port,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue