From 5cdb8e8ba6d5057893ecebb57f6521e1ee44dc5d Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Fri, 25 Jul 2008 23:19:45 +0200 Subject: Correct socket timeout for IMAP and POP3 connections darcs-hash:20080725211945-86b55-0304eacb36aee0a5c2e6db43586ab6c75bfb419f.gz --- src/jmc/model/account.py | 102 ++--------------------------------------------- src/jmc/runner.py | 4 ++ 2 files changed, 8 insertions(+), 98 deletions(-) diff --git a/src/jmc/model/account.py b/src/jmc/model/account.py index 7ea153a..105463f 100644 --- a/src/jmc/model/account.py +++ b/src/jmc/model/account.py @@ -44,104 +44,10 @@ from jcl.model import account from jcl.model.account import Account, PresenceAccount from jmc.lang import Lang -IMAP4_TIMEOUT = 10 -POP3_TIMEOUT = 10 - class NoAccountError(Exception): """Error raised when no corresponding account is found.""" pass -## All MY* classes are implemented to add a timeout (settimeout) -## while connecting -class MYIMAP4(imaplib.IMAP4): - def open(self, host='', port=imaplib.IMAP4_PORT): - """Setup connection to remote server on "host:port" - (default: localhost:standard IMAP4 port). - This connection will be used by the routines: - read, readline, send, shutdown. - """ - self.host = host - self.port = port - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.settimeout(IMAP4_TIMEOUT) - self.sock.connect((host, port)) - self.sock.settimeout(None) - self.file = self.sock.makefile('rb') - -class MYIMAP4_SSL(imaplib.IMAP4_SSL): - def open(self, host='', port=imaplib.IMAP4_SSL_PORT): - """Setup connection to remote server on "host:port". - (default: localhost:standard IMAP4 SSL port). - This connection will be used by the routines: - read, readline, send, shutdown. - """ - self.host = host - self.port = port - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.settimeout(IMAP4_TIMEOUT) - self.sock.connect((host, port)) - self.sock.settimeout(None) - self.sslobj = socket.ssl(self.sock, self.keyfile, self.certfile) - -class MYPOP3(poplib.POP3): - def __init__(self, host, port=poplib.POP3_PORT): - self.host = host - self.port = port - msg = "getaddrinfo returns an empty list" - self.sock = None - for res in socket.getaddrinfo(self.host, - self.port, - 0, - socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - try: - self.sock = socket.socket(af, socktype, proto) - self.sock.settimeout(POP3_TIMEOUT) - self.sock.connect(sa) - self.sock.settimeout(None) - except socket.error, msg: - if self.sock: - self.sock.close() - self.sock = None - continue - break - if not self.sock: - raise socket.error, msg - self.file = self.sock.makefile('rb') - self._debugging = 0 - self.welcome = self._getresp() - -class MYPOP3_SSL(poplib.POP3_SSL): - def __init__(self, host, port=poplib.POP3_SSL_PORT, keyfile=None, - certfile=None): - self.host = host - self.port = port - self.keyfile = keyfile - self.certfile = certfile - self.buffer = "" - msg = "getaddrinfo returns an empty list" - self.sock = None - for res in socket.getaddrinfo(self.host, self.port, 0, - socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - try: - self.sock = socket.socket(af, socktype, proto) - self.sock.settimeout(POP3_TIMEOUT) - self.sock.connect(sa) - self.sock.settimeout(None) - except socket.error, msg: - if self.sock: - self.sock.close() - self.sock = None - continue - break - if not self.sock: - raise socket.error, msg - self.file = self.sock.makefile('rb') - self.sslobj = socket.ssl(self.sock, self.keyfile, self.certfile) - self._debugging = 0 - self.welcome = self._getresp() - def _get_default_status_msg(self, lang_class): return self.get_type() + "://" + self.login + "@" + self.host + ":" + \ unicode(self.port) @@ -408,9 +314,9 @@ class IMAPAccount(MailAccount): + " (" + self.mailbox + "). SSL=" + str(self.ssl)) if self.ssl: - self.connection = MYIMAP4_SSL(self.host, self.port) + self.connection = imaplib.IMAP4_SSL(self.host, self.port) else: - self.connection = MYIMAP4(self.host, self.port) + self.connection = imaplib.IMAP4(self.host, self.port) self.connection.login(self.login, self.password) self.connected = True @@ -582,9 +488,9 @@ class POP3Account(MailAccount): + self.login + "@" + self.host + ":" + str(self.port) + ". SSL=" + str(self.ssl)) if self.ssl: - self.connection = MYPOP3_SSL(self.host, self.port) + self.connection = poplib.POP3_SSL(self.host, self.port) else: - self.connection = MYPOP3(self.host, self.port) + self.connection = poplib.POP3(self.host, self.port) try: self.connection.apop(self.login, self.password) except: diff --git a/src/jmc/runner.py b/src/jmc/runner.py index f3f9796..e5ff225 100644 --- a/src/jmc/runner.py +++ b/src/jmc/runner.py @@ -20,6 +20,8 @@ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## +import socket + from jcl.runner import JCLRunner import jmc.model.account as account @@ -81,6 +83,8 @@ class JMCRunner(JCLRunner): self.db_url = "sqlite:///var/spool/jabber/jmc.db" self.pid_file = "/var/run/jabber/jmc.pid" self.config_file = "jmc.conf" + # set socket connection timeout (for IMAP and POP connections) + socket.setdefaulttimeout(10) def setup_db(self): JCLRunner.setup_db(self) -- cgit v1.2.3