Skip to content

Commit

Permalink
Handle empty EHLO and HELO commands (slimta#112)
Browse files Browse the repository at this point in the history
* Handle empty EHLO and HELO commands

* Use better if/elif clause for ehlo/helo commands
  • Loading branch information
toxinu authored and icgood committed Nov 8, 2016
1 parent 62cb6cd commit d7c5608
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
7 changes: 7 additions & 0 deletions slimta/smtp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,9 @@ def _command_EHLO(self, ehlo_as):
if not self.bannered:
bad_sequence.send(self.io)
return
elif not ehlo_as:
bad_arguments.send(self.io)
return

ehlo_as = ehlo_as.decode('utf-8')
reply = Reply('250', 'Hello '+ehlo_as)
Expand All @@ -280,11 +283,15 @@ def _command_HELO(self, ehlo_as):
if not self.bannered:
bad_sequence.send(self.io)
return
elif not ehlo_as:
bad_arguments.send(self.io)
return

ehlo_as = ehlo_as.decode('utf-8')
reply = Reply('250', 'Hello '+ehlo_as)
reply.enhanced_status_code = False
self._call_custom_handler('HELO', reply, ehlo_as)

reply.send(self.io)
self._check_close_code(reply)

Expand Down
50 changes: 50 additions & 0 deletions test/test_slimta_smtp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,30 @@ def test_ehlo(self):
s.handle()
self.assertEqual('there', s.ehlo_as)

def test_ehlo_empty(self):
self.sock.sendall(b'220 ESMTP server\r\n')
self.sock.recv(IsA(int)).AndReturn(b'EHLO\r\n')
self.sock.sendall(b'501 5.5.4 Syntax error in parameters or arguments\r\n')
self.sock.recv(IsA(int)).AndReturn(b'QUIT\r\n')
self.sock.sendall(b'221 2.0.0 Bye\r\n')
self.mox.ReplayAll()
s = Server(self.sock, None)
s.handle()
self.assertEqual(None, s.ehlo_as)

def test_ehlo_empty_with_helo(self):
self.sock.sendall(b'220 ESMTP server\r\n')
self.sock.recv(IsA(int)).AndReturn(b'EHLO\r\n')
self.sock.sendall(b'501 5.5.4 Syntax error in parameters or arguments\r\n')
self.sock.recv(IsA(int)).AndReturn(b'HELO there\r\n')
self.sock.sendall(b'250 Hello there\r\n')
self.sock.recv(IsA(int)).AndReturn(b'QUIT\r\n')
self.sock.sendall(b'221 2.0.0 Bye\r\n')
self.mox.ReplayAll()
s = Server(self.sock, None)
s.handle()
self.assertEqual('there', s.ehlo_as)

def test_helo(self):
self.sock.sendall(b'220 ESMTP server\r\n')
self.sock.recv(IsA(int)).AndReturn(b'HELO there\r\n')
Expand All @@ -129,6 +153,32 @@ def test_helo(self):
s.handle()
self.assertEqual('there', s.ehlo_as)

def test_helo_empty(self):
self.sock.sendall(b'220 ESMTP server\r\n')
self.sock.recv(IsA(int)).AndReturn(b'HELO\r\n')
self.sock.sendall(b'501 5.5.4 Syntax error in parameters or arguments\r\n')
self.sock.recv(IsA(int)).AndReturn(b'QUIT\r\n')
self.sock.sendall(b'221 2.0.0 Bye\r\n')
self.mox.ReplayAll()
s = Server(self.sock, None)
s.handle()
self.assertEqual(None, s.ehlo_as)

def test_helo_empty_with_ehlo(self):
self.sock.sendall(b'220 ESMTP server\r\n')
self.sock.recv(IsA(int)).AndReturn(b'HELO\r\n')
self.sock.sendall(b'501 5.5.4 Syntax error in parameters or arguments\r\n')
self.sock.recv(IsA(int)).AndReturn(b'EHLO there\r\n')
self.sock.sendall(b'250-Hello there\r\n250 TEST\r\n')
self.sock.recv(IsA(int)).AndReturn(b'QUIT\r\n')
self.sock.sendall(b'221 2.0.0 Bye\r\n')
self.mox.ReplayAll()
s = Server(self.sock, None)
s.extensions.reset()
s.extensions.add('TEST')
s.handle()
self.assertEqual('there', s.ehlo_as)

def test_starttls(self):
sock = self.mox.CreateMockAnything()
sock.fileno = lambda: -1
Expand Down

0 comments on commit d7c5608

Please sign in to comment.