Example #1
0
 def test_handle_command_rset_connection_close(self):
     m = MailState()
     r = handle_command("RSET", m)
     self.assertEqual(self.ok_done[1], r[1])
Example #2
0
 def test_handle_command_rcpt_to_response(self):
     m = MailState()
     r = handle_command("RCPT TO", m)
     self.assertEqual(self.ok_done[0], r[0])
Example #3
0
 def test_handle_command_rcpt_to_reading_state(self):
     m = MailState()
     handle_command("RCPT TO", m)
     self.assertEqual(m.reading, False)
Example #4
0
 def test_handle_command_helo_reading_state(self):
     m = MailState()
     handle_command("HELO", m)
     self.assertEqual(m.reading, False)
Example #5
0
 def test_handle_command_mail_from_connection_close(self):
     m = MailState()
     r = handle_command("MAIL FROM", m)
     self.assertEqual(self.ok_done[1], r[1])
Example #6
0
 def test_handle_command_ehlo_connection_close_1024(self):
     m = MailState()
     r = handle_command("EHLO", m)
     self.assertEqual(self.ehlo[1], r[1])
Example #7
0
 def test_handle_command_helo_response(self):
     m = MailState()
     r = handle_command("HELO", m)
     self.assertEqual(self.ok_done[0], r[0])
Example #8
0
 def test_handle_command_unknown_command_connection_close(self):
     m = MailState()
     r = handle_command("KURA", m)
     self.assertEqual(self.unknown[1], r[1])
Example #9
0
 def test_handle_command_unknown_command_reading_state(self):
     m = MailState()
     handle_command("KURA", m)
     self.assertEqual(m.reading, False)
Example #10
0
 def test_handle_command_data_reading_state(self):
     m = MailState()
     handle_command("DATA", m)
     self.assertEqual(m.reading, True)
Example #11
0
 def test_handle_command_unknown_command_response(self):
     m = MailState()
     r = handle_command("KURA", m)
     self.assertEqual(self.unknown[0], r[0])
Example #12
0
 def test_handle_command_data_connection_close(self):
     m = MailState()
     r = handle_command("DATA", m)
     self.assertEqual(self.data[1], r[1])
Example #13
0
 def test_handle_command_data_response(self):
     m = MailState()
     r = handle_command("DATA", m)
     self.assertEqual(self.data[0], r[0])
Example #14
0
 def test_handle_command_quit_reading_state(self):
     m = MailState()
     handle_command("QUIT", m)
     self.assertEqual(m.reading, False)
Example #15
0
 def test_handle_command_quit_connection_close(self):
     m = MailState()
     r = handle_command("QUIT", m)
     self.assertEqual(self.quit[1], r[1])
Example #16
0
 def test_handle_command_starttls_response(self):
     m = MailState()
     r = handle_command("STARTTLS", m)
     self.assertEqual(self.ok[0], r[0])
Example #17
0
 def test_handle_command_ehlo_response_1024(self):
     m = MailState()
     r = handle_command("EHLO", m)
     self.assertEqual(self.ehlo[0], r[0])
Example #18
0
 def test_handle_command_starttls_connection_close(self):
     m = MailState()
     r = handle_command("STARTTLS", m)
     self.assertEqual(self.ok[1], r[1])
Example #19
0
 def test_handle_command_ehlo_reading_state_1024(self):
     m = MailState()
     handle_command("EHLO", m)
     self.assertEqual(m.reading, False)
Example #20
0
 def test_handle_command_starttls_reading_state(self):
     m = MailState()
     handle_command("STARTTLS", m)
     self.assertEqual(m.reading, False)
Example #21
0
 def test_handle_command_helo_connection_close(self):
     m = MailState()
     r = handle_command("HELO", m)
     self.assertEqual(self.ok_done[1], r[1])
Example #22
0
 def test_handle_command_vrfy_response(self):
     m = MailState()
     r = handle_command("VRFY", m)
     self.assertEqual(self.vrfy[0], r[0])
Example #23
0
 def test_handle_command_mail_from_response(self):
     m = MailState()
     r = handle_command("MAIL FROM", m)
     self.assertEqual(self.ok_done[0], r[0])
Example #24
0
 def test_handle_command_vrfy_connection_close(self):
     m = MailState()
     r = handle_command("VRFY", m)
     self.assertEqual(self.vrfy[1], r[1])
Example #25
0
 def test_handle_command_mail_from_reading_state(self):
     m = MailState()
     handle_command("MAIL FROM", m)
     self.assertEqual(m.reading, False)
Example #26
0
 def test_handle_command_vrfy_reading_state(self):
     m = MailState()
     handle_command("VRFY", m)
     self.assertEqual(m.reading, False)
Example #27
0
 def test_handle_command_rcpt_to_connection_close(self):
     m = MailState()
     r = handle_command("RCPT TO", m)
     self.assertEqual(self.ok_done[1], r[1])
Example #28
0
 def test_handle_command_data_after_data_command_response(self):
     m = MailState()
     m.reading = True
     r = handle_command("Kura Kura Kura", m)
     self.assertEqual(None, r[0])
Example #29
0
 def test_handle_command_rset_response(self):
     m = MailState()
     r = handle_command("RSET", m)
     self.assertEqual(self.ok_done[0], r[0])
Example #30
0
 def test_handle_command_data_after_data_command_connection_close(self):
     m = MailState()
     r = handle_command("VRFY", m)
     self.assertEqual(False, r[1])
Example #31
0
 def test_handle_command_data_after_data_command_response(self):
     m = MailState()
     m.reading = True
     r = handle_command("Kura Kura Kura", m)
     self.assertEqual(None, r[0])
Example #32
0
def connection_ready(sock, fd, events):
    """
    Accepts the socket connections and passes them off
    to be handled.

    'sock' is an instance of 'socket'.
    'fd' is an open file descriptor for the current connection.
    'events' is an integer of the number of events on the socket.
    """
    while True:
        try:
            connection, address = sock.accept()
        except socket.error as e:
            if e.errno not in (errno.EWOULDBLOCK, errno.EAGAIN):
                raise
            return

        log.debug("Connection from '%s'" % address[0])

        connection.setblocking(0)
        stream = connection_stream(connection)
        # No stream, bail out
        if not stream:
            return
        mail_state = MailState()
        mail_state.email_id = email_id()
        mail_state.stream = stream

        # Sadly there is nothing I can do about the handle and loop
        # fuctions. They have to exist within connection_ready
        def handle(line):
            """
            Handle a line of socket data, figure out if
            it's a valid SMTP keyword and handle it
            accordingly.
            """
            log.debug("[%s] RECV: %s" % (mail_state.email_id, line.rstrip()))
            resp, close = handle_command(line, mail_state)
            if resp:
                # Multiple responses, i.e. EHLO
                if isinstance(resp, list):
                    for r in resp:
                        write_response(mail_state, r)
                else:
                    # Otherwise it's a single response
                    write_response(mail_state, resp)
            # Switch to SSL connection if starttls is called
            # and we have an SSL library
            if line.lower().startswith("starttls") and ssl and options.ssl:
                fileno = mail_state.stream.socket.fileno()
                IOLoop.current().remove_handler(fileno)
                mail_state.stream = ssl_connection(connection)
            # Close connection
            if close is True:
                log.debug("Closing")
                mail_state.stream.close()
                del mail_state.stream
                return
            else:
                loop()

        def loop():
            """
            Loop over the socket data until we receive
            a newline character (\n)
            """
            # Protection against stream already reading exceptions
            if not mail_state.stream.reading():
                mail_state.stream.read_until("\n", handle)

        hm = "220 %s [%s]\r\n" % (get_mailname(), __fullname__)
        mail_state.stream.write(hm)
        loop()