From: R David Murray Date: Sat, 30 Aug 2014 20:56:49 +0000 (-0400) Subject: #22215: have the smtplib 'quit' command reset the state. X-Git-Tag: v2.7.9rc1~264 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7234e03cc91186c5d42502697b4fee69d8710eb8;p=thirdparty%2FPython%2Fcpython.git #22215: have the smtplib 'quit' command reset the state. Without this reset, starttls would fail if a connect/starttls was done after a quit, because smtplib assumed the existing value of emspt_features was accurate, but it gets reset when starttls completes (and the new value does not contain the starttls capability, since tls is already started at that point). (There may be additional places where this lack of reset was an issue as well.) Patch by Milan Oberkirch. --- diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 7f07840044b4..3e1672ae0b14 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -754,6 +754,10 @@ class SMTP: def quit(self): """Terminate the SMTP session.""" res = self.docmd("quit") + # A new EHLO is required after reconnecting with connect() + self.ehlo_resp = self.helo_resp = None + self.esmtp_features = {} + self.does_esmtp = False self.close() return res diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index aa90eab8570c..a97aa8f80da6 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -507,6 +507,21 @@ class SMTPSimTests(unittest.TestCase): #TODO: add tests for correct AUTH method fallback now that the #test infrastructure can support it. + def test_quit_resets_greeting(self): + smtp = smtplib.SMTP(HOST, self.port, + local_hostname='localhost', + timeout=15) + code, message = smtp.ehlo() + self.assertEqual(code, 250) + self.assertIn('size', smtp.esmtp_features) + smtp.quit() + self.assertNotIn('size', smtp.esmtp_features) + smtp.connect(HOST, self.port) + self.assertNotIn('size', smtp.esmtp_features) + smtp.ehlo_or_helo_if_needed() + self.assertIn('size', smtp.esmtp_features) + smtp.quit() + def test_main(verbose=None): test_support.run_unittest(GeneralTests, DebuggingServerTests, diff --git a/Misc/NEWS b/Misc/NEWS index 6ca9692cb114..5d800347f484 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,10 @@ Core and Builtins Library ------- +- Issue #22216: smtplib now resets its state more completely after a quit. The + most obvious consequence of the previous behavior was a STARTTLS failure + during a connect/starttls/quit/connect/starttls sequence. + - Issue #21305: os.urandom now caches a fd to /dev/urandom. This is a PEP 466 backport from Python 3.