[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 ----