[Spambayes-checkins] spambayes/pspam pop.py,1.1,1.2

Jeremy Hylton jhylton@users.sourceforge.net
Tue Nov 5 22:57:29 2002


Update of /cvsroot/spambayes/spambayes/pspam
In directory usw-pr-cvs1:/tmp/cvs-serv9113

Modified Files:
	pop.py 
Log Message:
Allow the proxy server to get the real server name from USER command.


Index: pop.py
===================================================================
RCS file: /cvsroot/spambayes/spambayes/pspam/pop.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pop.py	4 Nov 2002 04:44:19 -0000	1.1
--- pop.py	5 Nov 2002 22:57:27 -0000	1.2
***************
*** 11,14 ****
--- 11,21 ----
  insert the spam header.
  
+ The proxy can connect to any real POP3 server.  It parses the USER
+ command to figure out the address of the real server.  It expects the
+ USER argument to follow this format user@server[:port].  For example,
+ if you configure your POP client to send USER jeremy@example.com:111.
+ It will connect to a server on port 111 at example.com and send it the
+ command USER jeremy.
+ 
  XXX A POP3 server sometimes adds the number of bytes in the +OK
  response to some commands when the POP3 spec doesn't require it to.
***************
*** 41,52 ****
  HEADER_SIZE = len(HEADER % 0.0)
  
  class POP3ProxyServer(SocketServer.ThreadingTCPServer):
  
      allow_reuse_address = True
  
!     def __init__(self, addr, handler, classifier, real_server, log, zodb):
          SocketServer.ThreadingTCPServer.__init__(self, addr, handler)
          self.classifier = classifier
-         self.pop_server = real_server
          self.log = log
          self.zodb = zodb
--- 48,60 ----
  HEADER_SIZE = len(HEADER % 0.0)
  
+ VERSION = 0.1
+ 
  class POP3ProxyServer(SocketServer.ThreadingTCPServer):
  
      allow_reuse_address = True
  
!     def __init__(self, addr, handler, classifier, log, zodb):
          SocketServer.ThreadingTCPServer.__init__(self, addr, handler)
          self.classifier = classifier
          self.log = log
          self.zodb = zodb
***************
*** 73,80 ****
      """Act as proxy between POP client and server."""
  
!     def connect_pop(self):
          # connect to the pop server
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
!         s.connect(self.server.pop_server)
          self.pop_rfile = LogWrapper(self.server.log, s.makefile("rb"))
          # the write side should be unbuffered
--- 81,117 ----
      """Act as proxy between POP client and server."""
  
!     def read_user(self):
!         # XXX This could be cleaned up a bit.
!         line = self.rfile.readline()
!         if line == "":
!             return False
!         parts = line.split()
!         if parts[0] != "USER":
!             self.wfile.write("-ERR Invalid command; must specify USER first")
!             return False
!         user = parts[1]
!         i = user.rfind("@")
!         username = user[:i]
!         server = user[i+1:]
!         i = server.find(":")
!         if i == -1:
!             server = server, 110
!         else:
!             port = int(server[i+1:])
!             server = server[:i], port
!         zLOG.LOG("POP3", zLOG.INFO, "Got connect for %s" % repr(server))
!         self.connect_pop(server)
!         self.pop_wfile.write("USER %s\r\n" % username)
!         resp = self.pop_rfile.readline()
!         # As long the server responds OK, just swallow this reponse.
!         if resp.startswith("+OK"):
!             return True
!         else:
!             return False
! 
!     def connect_pop(self, pop_server):
          # connect to the pop server
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
!         s.connect(pop_server)
          self.pop_rfile = LogWrapper(self.server.log, s.makefile("rb"))
          # the write side should be unbuffered
***************
*** 90,94 ****
          self.server.zodb.sync()
          self.sess_retr_count = 0
!         self.connect_pop()
          try:
              self.handle_pop()
--- 127,135 ----
          self.server.zodb.sync()
          self.sess_retr_count = 0
!         self.wfile.write("+OK pspam/pop %s\r\n" % VERSION)
!         # First read the USER command to get the real server's name
!         if not self.read_user():
!             zLOG.LOG("POP3", zLOG.INFO, "Did not get valid USER")
!             return
          try:
              self.handle_pop()
***************
*** 265,269 ****
                               POP3RequestHandler,
                               profile.classifier,
-                              (options.server, options.server_port),
                               log,
                               conn,
--- 306,309 ----