--- smtpd-original.py 2008-10-23 11:52:37.000000000 +1100 +++ smtpd-nice.py 2008-10-23 12:10:44.000000000 +1100 @@ -111,19 +111,16 @@ def __init__(self, server, conn, addr): asynchat.async_chat.__init__(self, conn) - self.__server = server - self.__conn = conn - self.__addr = addr - self.__line = [] - self.__state = self.COMMAND - self.__greeting = 0 - self.__mailfrom = None - self.__rcpttos = [] - self.__data = '' - self.__fqdn = socket.getfqdn() - self.__peer = conn.getpeername() - print >> DEBUGSTREAM, 'Peer:', repr(self.__peer) - self.push('220 %s %s' % (self.__fqdn, __version__)) + self.smtp_server = server + self.received_lines = [] + self.smtp_state = self.COMMAND + self.seen_greeting = '' + self.mailfrom = None + self.rcpttos = [] + self.received_data = '' + self.fqdn = socket.getfqdn() + print >> DEBUGSTREAM, 'Peer:', repr(self.addr) + self.push('220 %s %s' % (self.fqdn, __version__)) self.set_terminator('\r\n') # Overrides base class for convenience @@ -132,14 +129,14 @@ # Implementation of base class abstract method def collect_incoming_data(self, data): - self.__line.append(data) + self.received_lines.append(data) # Implementation of base class abstract method def found_terminator(self): - line = EMPTYSTRING.join(self.__line) + line = EMPTYSTRING.join(self.received_lines) print >> DEBUGSTREAM, 'Data:', repr(line) - self.__line = [] - if self.__state == self.COMMAND: + self.received_lines = [] + if self.smtp_state == self.COMMAND: if not line: self.push('500 Error: bad syntax') return @@ -158,7 +155,7 @@ method(arg) return else: - if self.__state != self.DATA: + if self.smtp_state != self.DATA: self.push('451 Internal confusion') return # Remove extraneous carriage returns and de-transparency according @@ -169,14 +166,14 @@ data.append(text[1:]) else: data.append(text) - self.__data = NEWLINE.join(data) - status = self.__server.process_message(self.__peer, - self.__mailfrom, - self.__rcpttos, - self.__data) - self.__rcpttos = [] - self.__mailfrom = None - self.__state = self.COMMAND + self.received_data = NEWLINE.join(data) + status = self.smtp_server.process_message(self.addr, + self.mailfrom, + self.rcpttos, + self.received_data) + self.rcpttos = [] + self.mailfrom = None + self.smtp_state = self.COMMAND self.set_terminator('\r\n') if not status: self.push('250 Ok') @@ -188,11 +185,11 @@ if not arg: self.push('501 Syntax: HELO hostname') return - if self.__greeting: + if self.seen_greeting: self.push('503 Duplicate HELO/EHLO') else: - self.__greeting = arg - self.push('250 %s' % self.__fqdn) + self.seen_greeting = arg + self.push('250 %s' % self.fqdn) def smtp_NOOP(self, arg): if arg: @@ -206,7 +203,7 @@ self.close_when_done() # factored - def __getaddr(self, keyword, arg): + def _getaddr(self, keyword, arg): address = None keylen = len(keyword) if arg[:keylen].upper() == keyword: @@ -221,28 +218,28 @@ def smtp_MAIL(self, arg): print >> DEBUGSTREAM, '===> MAIL', arg - address = self.__getaddr('FROM:', arg) if arg else None + address = self._getaddr('FROM:', arg) if arg else None if not address: self.push('501 Syntax: MAIL FROM:
') return - if self.__mailfrom: + if self.mailfrom: self.push('503 Error: nested MAIL command') return - self.__mailfrom = address - print >> DEBUGSTREAM, 'sender:', self.__mailfrom + self.mailfrom = address + print >> DEBUGSTREAM, 'sender:', self.mailfrom self.push('250 Ok') def smtp_RCPT(self, arg): print >> DEBUGSTREAM, '===> RCPT', arg - if not self.__mailfrom: + if not self.mailfrom: self.push('503 Error: need MAIL command') return - address = self.__getaddr('TO:', arg) if arg else None + address = self._getaddr('TO:', arg) if arg else None if not address: self.push('501 Syntax: RCPT TO:
') return - self.__rcpttos.append(address) - print >> DEBUGSTREAM, 'recips:', self.__rcpttos + self.rcpttos.append(address) + print >> DEBUGSTREAM, 'recips:', self.rcpttos self.push('250 Ok') def smtp_RSET(self, arg): @@ -250,20 +247,20 @@ self.push('501 Syntax: RSET') return # Resets the sender, recipients, and data, but not the greeting - self.__mailfrom = None - self.__rcpttos = [] - self.__data = '' - self.__state = self.COMMAND + self.mailfrom = None + self.rcpttos = [] + self.received_data = '' + self.smtp_state = self.COMMAND self.push('250 Ok') def smtp_DATA(self, arg): - if not self.__rcpttos: + if not self.rcpttos: self.push('503 Error: need RCPT command') return if arg: self.push('501 Syntax: DATA') return - self.__state = self.DATA + self.smtp_state = self.DATA self.set_terminator('\r\n.\r\n') self.push('354 End data with .')