[1.5.x] Fixed #19134 -- Allowed closing smtp backend when the server is stopped

Thanks Sebastian Noack for the report and the initial patch.
Backport of 1b3f832ab7 from master.
This commit is contained in:
Claude Paroz 2013-01-03 18:49:00 +01:00
parent a893ee3315
commit 4081042ef5
2 changed files with 19 additions and 5 deletions

View File

@ -63,9 +63,10 @@ class EmailBackend(BaseEmailBackend):
try: try:
try: try:
self.connection.quit() self.connection.quit()
except socket.sslerror: except (socket.sslerror, smtplib.SMTPServerDisconnected):
# This happens when calling quit() on a TLS connection # This happens when calling quit() on a TLS connection
# sometimes. # sometimes, or when the connection was already disconnected
# by the server.
self.connection.close() self.connection.close()
except: except:
if self.fail_silently: if self.fail_silently:

View File

@ -659,9 +659,9 @@ class FakeSMTPServer(smtpd.SMTPServer, threading.Thread):
asyncore.close_all() asyncore.close_all()
def stop(self): def stop(self):
assert self.active if self.active:
self.active = False self.active = False
self.join() self.join()
class SMTPBackendTests(BaseEmailBackendTests, TestCase): class SMTPBackendTests(BaseEmailBackendTests, TestCase):
@ -715,3 +715,16 @@ class SMTPBackendTests(BaseEmailBackendTests, TestCase):
backend = smtp.EmailBackend(username='', password='') backend = smtp.EmailBackend(username='', password='')
self.assertEqual(backend.username, '') self.assertEqual(backend.username, '')
self.assertEqual(backend.password, '') self.assertEqual(backend.password, '')
def test_server_stopped(self):
"""
Test that closing the backend while the SMTP server is stopped doesn't
raise an exception.
"""
backend = smtp.EmailBackend(username='', password='')
backend.open()
self.server.stop()
try:
backend.close()
except Exception as e:
self.fail("close() unexpectedly raised an exception: %s" % e)