mirror of
https://github.com/python/cpython.git
synced 2026-04-20 02:40:59 +00:00
gh-70039: smtplib: store the server name in ._host in .connect() (#115259)
Original patch by gigaplastik, extended with a few more tests. Addresses gh-70039 and bpo-25852: failure of starttls if connect is called explicitly.
This commit is contained in:
parent
eab7dbda3b
commit
442f83a5ea
3 changed files with 55 additions and 1 deletions
|
|
@ -251,7 +251,6 @@ def __init__(self, host='', port=0, local_hostname=None,
|
|||
will be used.
|
||||
|
||||
"""
|
||||
self._host = host
|
||||
self.timeout = timeout
|
||||
self.esmtp_features = {}
|
||||
self.command_encoding = 'ascii'
|
||||
|
|
@ -342,6 +341,7 @@ def connect(self, host='localhost', port=0, source_address=None):
|
|||
port = int(port)
|
||||
except ValueError:
|
||||
raise OSError("nonnumeric port")
|
||||
self._host = host
|
||||
if not port:
|
||||
port = self.default_port
|
||||
sys.audit("smtplib.connect", self, host, port)
|
||||
|
|
|
|||
|
|
@ -45,6 +45,59 @@ def test_connect_starttls(self):
|
|||
server.ehlo()
|
||||
server.quit()
|
||||
|
||||
def test_connect_host_port_starttls(self):
|
||||
support.get_attribute(smtplib, 'SMTP_SSL')
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
context.check_hostname = False
|
||||
context.verify_mode = ssl.CERT_NONE
|
||||
with socket_helper.transient_internet(self.testServer):
|
||||
server = smtplib.SMTP(f'{self.testServer}:{self.remotePort}')
|
||||
try:
|
||||
server.starttls(context=context)
|
||||
except smtplib.SMTPException as e:
|
||||
if e.args[0] == 'STARTTLS extension not supported by server.':
|
||||
unittest.skip(e.args[0])
|
||||
else:
|
||||
raise
|
||||
server.ehlo()
|
||||
server.quit()
|
||||
|
||||
def test_explicit_connect_starttls(self):
|
||||
support.get_attribute(smtplib, 'SMTP_SSL')
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
context.check_hostname = False
|
||||
context.verify_mode = ssl.CERT_NONE
|
||||
with socket_helper.transient_internet(self.testServer):
|
||||
server = smtplib.SMTP()
|
||||
server.connect(self.testServer, self.remotePort)
|
||||
try:
|
||||
server.starttls(context=context)
|
||||
except smtplib.SMTPException as e:
|
||||
if e.args[0] == 'STARTTLS extension not supported by server.':
|
||||
unittest.skip(e.args[0])
|
||||
else:
|
||||
raise
|
||||
server.ehlo()
|
||||
server.quit()
|
||||
|
||||
def test_explicit_connect_host_port_starttls(self):
|
||||
support.get_attribute(smtplib, 'SMTP_SSL')
|
||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||
context.check_hostname = False
|
||||
context.verify_mode = ssl.CERT_NONE
|
||||
with socket_helper.transient_internet(self.testServer):
|
||||
server = smtplib.SMTP()
|
||||
server.connect(f'{self.testServer}:{self.remotePort}')
|
||||
try:
|
||||
server.starttls(context=context)
|
||||
except smtplib.SMTPException as e:
|
||||
if e.args[0] == 'STARTTLS extension not supported by server.':
|
||||
unittest.skip(e.args[0])
|
||||
else:
|
||||
raise
|
||||
server.ehlo()
|
||||
server.quit()
|
||||
|
||||
|
||||
class SmtpSSLTest(unittest.TestCase):
|
||||
testServer = SMTP_TEST_SERVER
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Fixed bug where :meth:`smtplib.SMTP.starttls` could fail if :meth:`smtplib.SMTP.connect` is called explicitly rather than implicitly.
|
||||
Loading…
Add table
Add a link
Reference in a new issue