]> granicus.if.org Git - python/commitdiff
Fix for issue 5259: ASCII encode the username and password before passing
authorR. David Murray <rdmurray@bitdance.com>
Sat, 23 May 2009 18:49:56 +0000 (18:49 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Sat, 23 May 2009 18:49:56 +0000 (18:49 +0000)
it to encode_base64, which requires bytes in py3k.  Fix by Musashi Tamura,
tests by Marcin Bachry.

Lib/smtplib.py
Lib/test/test_smtplib.py
Misc/ACKS
Misc/NEWS

index d8d717c05b55833c60daf26fde29e1c42f546f49..0b2a586a445a3b669597d1e4445adbf4789966ed 100755 (executable)
@@ -545,7 +545,8 @@ class SMTP:
             return encode_base64(response)
 
         def encode_plain(user, password):
-            return encode_base64("\0%s\0%s" % (user, password))
+            s = "\0%s\0%s" % (user, password)
+            return encode_base64(s.encode('ascii'), eol='')
 
 
         AUTH_PLAIN = "PLAIN"
index 55e30a8082866f6d66e4f0ce5ac38a74a24e8435..012ab9427eb1bb6f697ffd9d940152cafea1a3d4 100644 (file)
@@ -284,6 +284,9 @@ sim_users = {'Mr.A@somewhere.com':'John A',
              'Mrs.C@somewhereesle.com':'Ruth C',
             }
 
+sim_auth = ('Mr.A@somewhere.com', 'somepassword')
+sim_auth_b64encoded = 'AE1yLkFAc29tZXdoZXJlLmNvbQBzb21lcGFzc3dvcmQ='
+
 sim_lists = {'list-1':['Mr.A@somewhere.com','Mrs.C@somewhereesle.com'],
              'list-2':['Ms.B@somewhere.com',],
             }
@@ -296,6 +299,7 @@ class SimSMTPChannel(smtpd.SMTPChannel):
                '250-SIZE 20000000\r\n' \
                '250-STARTTLS\r\n' \
                '250-DELIVERBY\r\n' \
+               '250-AUTH PLAIN\r\n' \
                '250 HELP'
         self.push(resp)
 
@@ -324,6 +328,16 @@ class SimSMTPChannel(smtpd.SMTPChannel):
         else:
             self.push('550 No access for you!')
 
+    def smtp_AUTH(self, arg):
+        mech, auth = arg.split()
+        if mech.lower() == 'plain':
+            if auth == sim_auth_b64encoded:
+                self.push('235 ok, go ahead')
+            else:
+                self.push('550 No access for you!')
+        else:
+            self.push('504 auth type unimplemented')
+
 
 class SimSMTPServer(smtpd.SMTPServer):
     def handle_accept(self):
@@ -372,6 +386,7 @@ class SMTPSimTests(TestCase):
                              'size': '20000000',
                              'starttls': '',
                              'deliverby': '',
+                             'auth': ' PLAIN',
                              'help': '',
                              }
 
@@ -412,6 +427,11 @@ class SMTPSimTests(TestCase):
         self.assertEqual(smtp.expn(u), expected_unknown)
         smtp.quit()
 
+    def testAUTH(self):
+        smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15)
+
+        expected_auth_ok = (235, b'ok, go ahead')
+        self.assertEqual(smtp.login(sim_auth[0], sim_auth[1]), expected_auth_ok)
 
 
 def test_main(verbose=None):
index f14d45d2650bb89481bc6573a5891cbdc3683bdc..b31a3b6dba31aca92af0b97126ad1d48c594643f 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -710,6 +710,7 @@ Andrew Svetlov
 Paul Swartz
 Thenault Sylvain
 Geoff Talvola
+Musashi Tamura
 William Tanksley
 Christian Tanzer
 Steven Taschuk
index 1380b2960a70bb7d0befaea60490e002d50e5ea8..a736ad8b2c9902ca8c856a38559c0687c4c3625b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -32,6 +32,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #5259: smtplib plain auth login no longer gives a traceback.  Fix
+  by Musashi Tamura, tests by Marcin Bachry.
+
 - Issue #1983: Fix functions taking or returning a process identifier to use
   the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
   a process identifier type wider than the standard C integer type.