Skip to content

Commit

Permalink
Fix for issue 5259: ASCII encode the username and password before pas…
Browse files Browse the repository at this point in the history
…sing

it to encode_base64, which requires bytes in py3k.  Fix by Musashi Tamura,
tests by Marcin Bachry.
  • Loading branch information
bitdancer committed May 23, 2009
1 parent dfea192 commit caa27b7
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Lib/smtplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,8 @@ def encode_cram_md5(challenge, user, password):
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"
Expand Down
20 changes: 20 additions & 0 deletions Lib/test/test_smtplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ def testFailingHELO(self):
'[email protected]':'Ruth C',
}

sim_auth = ('[email protected]', 'somepassword')
sim_auth_b64encoded = 'AE1yLkFAc29tZXdoZXJlLmNvbQBzb21lcGFzc3dvcmQ='

sim_lists = {'list-1':['[email protected]','[email protected]'],
'list-2':['[email protected]',],
}
Expand All @@ -296,6 +299,7 @@ def smtp_EHLO(self, arg):
'250-SIZE 20000000\r\n' \
'250-STARTTLS\r\n' \
'250-DELIVERBY\r\n' \
'250-AUTH PLAIN\r\n' \
'250 HELP'
self.push(resp)

Expand Down Expand Up @@ -324,6 +328,16 @@ def smtp_EXPN(self, arg):
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):
Expand Down Expand Up @@ -372,6 +386,7 @@ def testEHLO(self):
'size': '20000000',
'starttls': '',
'deliverby': '',
'auth': ' PLAIN',
'help': '',
}

Expand Down Expand Up @@ -412,6 +427,11 @@ def testEXPN(self):
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):
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,7 @@ Andrew Svetlov
Paul Swartz
Thenault Sylvain
Geoff Talvola
Musashi Tamura
William Tanksley
Christian Tanzer
Steven Taschuk
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit caa27b7

Please sign in to comment.