summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_smtplib.py
diff options
context:
space:
mode:
authorSenthil Kumaran <senthil@uthcode.com>2021-03-13 00:53:13 (GMT)
committerGitHub <noreply@github.com>2021-03-13 00:53:13 (GMT)
commit8cadc2c9cacfa1710cb5ca28a70f7782cacf09aa (patch)
treed397e193ecbffee4dd672876a4bb1f44d6f2e779 /Lib/test/test_smtplib.py
parent1a5001c606b55226c03fa1046aa8f5e1db2fa67d (diff)
downloadcpython-8cadc2c9cacfa1710cb5ca28a70f7782cacf09aa.zip
cpython-8cadc2c9cacfa1710cb5ca28a70f7782cacf09aa.tar.gz
cpython-8cadc2c9cacfa1710cb5ca28a70f7782cacf09aa.tar.bz2
[3.8] bpo-27820: Fix AUTH LOGIN logic in smtplib.SMTP (GH-24118) (#24833)
* bpo-27820: Fix AUTH LOGIN logic in smtplib.SMTP (GH-24118) * Fix auth_login logic (bpo-27820) * Also fix a longstanding bug in the SimSMTPChannel.found_terminator() method that causes inability to test SMTP AUTH with initial_response_ok=False. (cherry picked from commit 7591d9455eb37525c832da3d65e1a7b3e6dbf613) * Set timeout to 15 directly. Co-authored-by: Pandu E POLUAN <pepoluan@gmail.com>
Diffstat (limited to 'Lib/test/test_smtplib.py')
-rw-r--r--Lib/test/test_smtplib.py40
1 files changed, 39 insertions, 1 deletions
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
index d0c9862..c9205ae 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -733,7 +733,7 @@ class SimSMTPChannel(smtpd.SMTPChannel):
except ResponseException as e:
self.smtp_state = self.COMMAND
self.push('%s %s' % (e.smtp_code, e.smtp_error))
- return
+ return
super().found_terminator()
@@ -799,6 +799,11 @@ class SimSMTPChannel(smtpd.SMTPChannel):
self._authenticated(self._auth_login_user, password == sim_auth[1])
del self._auth_login_user
+ def _auth_buggy(self, arg=None):
+ # This AUTH mechanism will 'trap' client in a neverending 334
+ # base64 encoded 'BuGgYbUgGy'
+ self.push('334 QnVHZ1liVWdHeQ==')
+
def _auth_cram_md5(self, arg=None):
if arg is None:
self.push('334 {}'.format(sim_cram_md5_challenge))
@@ -1011,6 +1016,39 @@ class SMTPSimTests(unittest.TestCase):
self.assertEqual(resp, (235, b'Authentication Succeeded'))
smtp.close()
+ def testAUTH_LOGIN_initial_response_ok(self):
+ self.serv.add_feature("AUTH LOGIN")
+ with smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) as smtp:
+ smtp.user, smtp.password = sim_auth
+ smtp.ehlo("test_auth_login")
+ resp = smtp.auth("LOGIN", smtp.auth_login, initial_response_ok=True)
+ self.assertEqual(resp, (235, b'Authentication Succeeded'))
+
+ def testAUTH_LOGIN_initial_response_notok(self):
+ self.serv.add_feature("AUTH LOGIN")
+ with smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) as smtp:
+ smtp.user, smtp.password = sim_auth
+ smtp.ehlo("test_auth_login")
+ resp = smtp.auth("LOGIN", smtp.auth_login, initial_response_ok=False)
+ self.assertEqual(resp, (235, b'Authentication Succeeded'))
+
+ def testAUTH_BUGGY(self):
+ self.serv.add_feature("AUTH BUGGY")
+
+ def auth_buggy(challenge=None):
+ self.assertEqual(b"BuGgYbUgGy", challenge)
+ return "\0"
+
+ smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15)
+ try:
+ smtp.user, smtp.password = sim_auth
+ smtp.ehlo("test_auth_buggy")
+ expect = r"^Server AUTH mechanism infinite loop.*"
+ with self.assertRaisesRegex(smtplib.SMTPException, expect) as cm:
+ smtp.auth("BUGGY", auth_buggy, initial_response_ok=False)
+ finally:
+ smtp.close()
+
@requires_hashdigest('md5')
def testAUTH_CRAM_MD5(self):
self.serv.add_feature("AUTH CRAM-MD5")