Esempio n. 1
0
 def test_starttls_extension(self):
     s = Server(None, None)
     assert_false('STARTTLS' in s.extensions)
     s = Server(None, None, tls=self.tls_args, tls_immediately=False)
     assert_true('STARTTLS' in s.extensions)
     s = Server(None, None, tls=self.tls_args, tls_immediately=True)
     assert_false('STARTTLS' in s.extensions)
 def test_starttls_extension(self):
     s = Server(None, None)
     self.assertFalse('STARTTLS' in s.extensions)
     s = Server(None, None, context=self.context)
     self.assertTrue('STARTTLS' in s.extensions)
     s = Server(None, None, context=self.context, tls_immediately=True)
     self.assertFalse('STARTTLS' in s.extensions)
Esempio n. 3
0
 def test_recv_command(self):
     self.sock.recv(IsA(int)).AndReturn('cmd ARG\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     cmd, arg = s._recv_command()
     assert_equal('CMD', cmd)
     assert_equal('ARG', arg)
 def test_tls_immediately_sslerror(self):
     self.context.wrap_socket(self.sock,
                              server_side=True).AndRaise(SSLError())
     self.sock.sendall(b'421 4.7.0 TLS negotiation failed\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None, context=self.context, tls_immediately=True)
     s.handle()
    def test_call_custom_handler(self):
        class TestHandler(object):
            def TEST(self, arg):
                return arg.lower()

        s = Server(None, TestHandler())
        self.assertEqual(b'stuff', s._call_custom_handler('TEST', b'STUFF'))
    def test_rset(self):
        class TestHandlers(object):
            server = None

            def NOOP(self2, reply):
                self.assertEqual(b'test', self2.server.ehlo_as)
                self.assertFalse(self2.server.have_mailfrom)
                self.assertFalse(self2.server.have_rcptto)

        self.sock.sendall(b'220 ESMTP server\r\n')
        self.sock.recv(IsA(int)).AndReturn(b'RSET arg\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'RSET\r\n')
        self.sock.sendall(b'250 2.0.0 Ok\r\n')
        self.sock.recv(IsA(int)).AndReturn(b'NOOP\r\n')
        self.sock.sendall(b'250 2.0.0 Ok\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()
        h = TestHandlers()
        s = h.server = Server(self.sock, h)
        s.ehlo_as = b'test'
        s.have_mailfrom = True
        s.have_rcptto = True
        s.handle()
Esempio n. 7
0
 def test_banner_quit(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
Esempio n. 8
0
 def test_quit_bad(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT arg\r\n')
     self.sock.sendall('501 5.5.4 Syntax error in parameters or arguments\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
Esempio n. 9
0
 def test_tls_immediately_sslerror(self):
     sock = self.mox.CreateMockAnything()
     sock.fileno = lambda: -1
     sock.tls_wrapper(sock, self.tls_args).AndRaise(SSLError())
     sock.sendall('421 4.7.0 TLS negotiation failed\r\n')
     self.mox.ReplayAll()
     s = Server(sock, None, tls=self.tls_args, tls_immediately=True,
                            tls_wrapper=sock.tls_wrapper)
     s.handle()
 def test_tls_immediately(self):
     self.context.wrap_socket(self.sock,
                              server_side=True).AndReturn(self.sock)
     self.sock.sendall(b'220 ESMTP server\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, context=self.context, tls_immediately=True)
     s.handle()
 def test_gather_params(self):
     s = Server(None, None)
     self.assertEqual({b'ONE': b'1'}, s._gather_params(b' ONE=1'))
     self.assertEqual({b'TWO': True}, s._gather_params(b'TWO'))
     self.assertEqual({
         b'THREE': b'foo',
         b'FOUR': b'bar'
     }, s._gather_params(b' THREE=foo FOUR=bar'))
     self.assertEqual({b'FIVE': True}, s._gather_params(b'five'))
Esempio n. 12
0
 def test_noop(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('NOOP\r\n')
     self.sock.sendall('250 2.0.0 Ok\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
Esempio n. 13
0
 def test_unhandled_error(self):
     class TestHandler(object):
         def BANNER_(self, reply):
             raise Exception('test')
     self.sock.sendall('421 4.3.0 Unhandled system error\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, TestHandler())
     with assert_raises(Exception) as cm:
         s.handle()
     assert_equal(('test', ), cm.exception.args)
Esempio n. 14
0
 def test_helo(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('HELO there\r\n')
     self.sock.sendall('250 Hello there\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
     assert_equal('there', s.ehlo_as)
Esempio n. 15
0
 def test_get_message_data(self):
     expected_reply = '250 2.6.0 Message Accepted for Delivery\r\n'
     self.sock.recv(IsA(int)).AndReturn('one\r\n')
     self.sock.recv(IsA(int)).AndReturn('.\r\n')
     self.sock.sendall(expected_reply)
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s._get_message_data()
     assert_false(s.have_mailfrom)
     assert_false(s.have_rcptto)
Esempio n. 16
0
 def test_banner_command(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('BANNER\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('BANNER_\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
Esempio n. 17
0
 def test_tls_immediately(self):
     sock = self.mox.CreateMockAnything()
     sock.fileno = lambda: -1
     sock.tls_wrapper(sock, self.tls_args).AndReturn(sock)
     sock.sendall('220 ESMTP server\r\n')
     sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(sock, None, tls=self.tls_args, tls_immediately=True,
                            tls_wrapper=sock.tls_wrapper)
     s.handle()
Esempio n. 18
0
 def test_data_connectionlost(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('DATA\r\n')
     self.sock.sendall('354 Start mail input; end with <CRLF>.<CRLF>\r\n')
     self.sock.recv(IsA(int)).AndReturn('')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.ehlo_as = 'test'
     s.have_mailfrom = True
     s.have_rcptto = True
     assert_raises(ConnectionLost, s.handle)
 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)
Esempio n. 20
0
 def test_ehlo(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('EHLO there\r\n')
     self.sock.sendall('250-Hello there\r\n250 TEST\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.extensions.reset()
     s.extensions.add('TEST')
     s.handle()
     assert_equal('there', s.ehlo_as)
Esempio n. 21
0
 def test_mailfrom(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('HELO there\r\n')
     self.sock.sendall('250 Hello there\r\n')
     self.sock.recv(IsA(int)).AndReturn('MAIL FROM:<test">"addr>\r\n')
     self.sock.sendall('250 2.1.0 Sender <test">"addr> Ok\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()
     assert_true(s.have_mailfrom)
Esempio n. 22
0
 def test_data_bad(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('DATA arg\r\n')
     self.sock.sendall('501 5.5.4 Syntax error in parameters or arguments\r\n')
     self.sock.recv(IsA(int)).AndReturn('DATA\r\n')
     self.sock.sendall('503 5.5.1 Bad sequence of commands\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.ehlo_as = 'test'
     s.have_mailfrom = True
     s.handle()
Esempio n. 23
0
 def test_data(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('DATA\r\n')
     self.sock.sendall('354 Start mail input; end with <CRLF>.<CRLF>\r\n')
     self.sock.recv(IsA(int)).AndReturn('.\r\nQUIT\r\n')
     self.sock.sendall('250 2.6.0 Message Accepted for Delivery\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.ehlo_as = 'test'
     s.have_mailfrom = True
     s.have_rcptto = True
     s.handle()
Esempio n. 24
0
 def test_auth(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('EHLO there\r\n')
     self.sock.sendall('250-Hello there\r\n250 AUTH PLAIN\r\n')
     self.sock.recv(IsA(int)).AndReturn('AUTH PLAIN dGVzdHppZAB0ZXN0dXNlcgB0ZXN0cGFzc3dvcmQ=\r\n')
     self.sock.sendall('235 2.7.0 Authentication successful\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.extensions.reset()
     s.extensions.add('AUTH', FakeAuth(s))
     s.handle()
     assert_equal(('testuser', 'testzid'), s.auth_result)
Esempio n. 25
0
 def test_rcptto(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('RCPT TO:<test">"addr>\r\n')
     self.sock.sendall('250 2.1.5 Recipient <test">"addr> Ok\r\n')
     self.sock.recv(IsA(int)).AndReturn('RCPT TO:<test2>\r\n')
     self.sock.sendall('250 2.1.5 Recipient <test2> Ok\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.ehlo_as = 'test'
     s.have_mailfrom = True
     s.handle()
     assert_true(s.have_rcptto)
Esempio n. 26
0
 def handle(self, socket, address):
     try:
         handlers = SmtpSession(address, self.validator_class, self.handoff)
         smtp_server = Server(socket, handlers, self.auth_class,
                              self.tls, self.tls_immediately,
                              command_timeout=self.command_timeout,
                              data_timeout=self.data_timeout)
         if self.max_size:
             smtp_server.extensions.add('SIZE', self.max_size)
         smtp_server.handle()
     except ConnectionLost:
         pass
     finally:
         smtp_server.io.close()
 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)
Esempio n. 28
0
 def test_custom_command(self):
     class TestHandlers(object):
         def TEST(self2, reply, arg, server):
             assert_true(server.have_mailfrom)
             reply.code = '250'
             reply.message = 'Doing '+arg
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('TEST stuff\r\n')
     self.sock.sendall('250 2.0.0 Doing stuff\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, TestHandlers())
     s.have_mailfrom = True
     s.handle()
 def test_auth(self):
     self.sock.sendall(b'220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn(b'EHLO there\r\n')
     self.sock.sendall(b'250-Hello there\r\n250 AUTH PLAIN\r\n')
     self.sock.recv(IsA(int)).AndReturn(
         b'AUTH PLAIN dGVzdHppZAB0ZXN0dXNlcgB0ZXN0cGFzc3dvcmQ=\r\n')
     self.sock.sendall(b'235 2.7.0 Authentication successful\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('AUTH', AuthSession(SASLAuth([b'PLAIN']), s.io))
     s.handle()
     self.assertTrue(s.authed)
Esempio n. 30
0
 def test_bad_commands(self):
     self.sock.sendall('220 ESMTP server\r\n')
     self.sock.recv(IsA(int)).AndReturn('\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('BADCMD\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('STARTTLS\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('AUTH\r\n')
     self.sock.sendall('500 5.5.2 Syntax error, command unrecognized\r\n')
     self.sock.recv(IsA(int)).AndReturn('QUIT\r\n')
     self.sock.sendall('221 2.0.0 Bye\r\n')
     self.mox.ReplayAll()
     s = Server(self.sock, None)
     s.handle()