/head: changeset 81

Updated with preliminary tunnel support
This commit is contained in:
jgoerzen 2002-07-05 07:36:34 +01:00
parent 872ec1b9f2
commit 55d56b8bde
6 changed files with 94 additions and 10 deletions

View File

@ -1,3 +1,30 @@
2002-07-04 15:36 jgoerzen
* debian/changelog: Updated with tunnel feature
2002-07-04 15:31 jgoerzen
* offlineimap/imapserver.py: Another tunnel fix
2002-07-04 15:30 jgoerzen
* offlineimap.conf, offlineimap.py, offlineimap/imaplib.py,
offlineimap/imapserver.py: Updated with preliminary tunnel support
2002-07-04 14:47 jgoerzen
* offlineimap.py, debian/changelog, offlineimap/version.py: Added
support for remotepassfile and bumped versions
2002-07-04 14:44 jgoerzen
* offlineimap.conf: Added some more examples as well as
remotepassfile.
2002-07-04 11:59 jgoerzen
* ChangeLog: Updated after 2.0.1
2002-07-04 11:58 jgoerzen
* offlineimap.py, debian/changelog, offlineimap/version.py: Updated

View File

@ -1,6 +1,7 @@
offlineimap (2.0.2) unstable; urgency=low
* Added support for remotepassfile. Closes: #151943.
* Added support for preauth tunnels.
-- John Goerzen <jgoerzen@complete.org> Thu, 4 Jul 2002 14:46:23 -0500

View File

@ -106,6 +106,17 @@ remoteuser = username
# file, which is referenced by the remotefile option. Example:
#
# remotepassfile = ~/Password.IMAP.Account1
#
# 4. With a preauth tunnel. With this method, you invoke an external
# program that is guaranteed *NOT* to ask for a password, but rather
# to read from stdin and write to stdout an IMAP procotol stream
# that begins life in the PREAUTH state. When you use a tunnel,
# you do NOT specify a user or password (if you do, they'll be
# ignored.) Instead, you specify a preauthtunnel, as this
# example illustrates for Courier IMAP on Debian:
#
# preauthtunnel = ssh -q imaphost '/usr/bin/imapd ./Maildir'
#
# Specify local repository. Your IMAP folders will be synchronized
# to maildirs created under this path. OfflineIMAP will create the

View File

@ -48,6 +48,7 @@ server = None
remoterepos = None
localrepos = None
passwords = {}
tunnels = {}
threadutil.initInstanceLimit("ACCOUNTLIMIT", config.getint("general",
"maxsyncaccounts"))
@ -56,7 +57,9 @@ threadutil.initInstanceLimit("ACCOUNTLIMIT", config.getint("general",
# asking for passwords simultaneously.
for account in accounts:
if config.has_option(account, "remotepass"):
if config.has_option(account, "preauthtunnel"):
tunnels[account] = config.get(account, "preauthtunnel")
elif config.has_option(account, "remotepass"):
passwords[account] = config.get(account, "remotepass")
elif config.has_option(account, "remotepassfile"):
passfile = os.path.expanduser(config.get(account, "remotepassfile"))
@ -90,11 +93,17 @@ def syncaccount(accountname, *args):
if config.has_option(accountname, "remoteport"):
port = config.getint(accountname, "remoteport")
ssl = config.getboolean(accountname, "ssl")
usetunnel = config.has_option(accountname, "preauthtunnel")
server = None
# Connect to the remote server.
server = imapserver.IMAPServer(user, passwords[accountname],
host, port, ssl,
config.getint(accountname, "maxconnections"))
if usetunnel:
server = imapserver.IMAPServer(tunnel = tunnels[accountname],
maxconnections = config.getint(accountname, "maxconnections"))
else:
server = imapserver.IMAPServer(user, passwords[accountname],
host, port, ssl,
config.getint(accountname, "maxconnections"))
remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
# Connect to the Maildirs.

View File

@ -17,10 +17,11 @@ Public functions: Internaldate2tuple
# GET/SETACL contributed by Anthony Baxter <anthony@interlink.com.au> April 2001.
# IMAP4_SSL contributed by Tino Lange <Tino.Lange@isg.de> March 2002.
# GET/SETQUOTA contributed by Andreas Zeidler <az@kreativkombinat.de> June 2002.
# IMAP4_Tunnel contributed by John Goerzen <jgoerzen@complete.org> July 2002
__version__ = "2.52"
import binascii, re, socket, time, random, sys
import binascii, re, socket, time, random, sys, os
__all__ = ["IMAP4", "Internaldate2tuple",
"Int2AP", "ParseFlags", "Time2Internaldate"]
@ -1020,6 +1021,36 @@ class IMAP4:
i = 0
n -= 1
class IMAP4_Tunnel(IMAP4):
"""IMAP4 client class over a tunnel
Instantiate with: IMAP4_Tunnel(tunnelcmd)
tunnelcmd -- shell command to generate the tunnel.
The result will be in PREAUTH stage."""
def __init__(self, tunnelcmd):
IMAP4.__init__(self, tunnelcmd)
def open(self, host, port):
"""The tunnelcmd comes in on host!"""
self.outfd, self.infd = os.popen2(host, "t", 0)
def read(self, size):
retval = ''
while len(retval) < size:
retval += self.infd.read(size - len(retval))
return retval
def readline(self):
return self.infd.readline()
def send(self, data):
self.outfd.write(data)
def shutdown(self):
self.infd.close()
self.outfd.close()
class IMAP4_SSL(IMAP4):

View File

@ -41,13 +41,15 @@ class UsefulIMAPMixIn:
class UsefulIMAP4(UsefulIMAPMixIn, imaplib.IMAP4): pass
class UsefulIMAP4_SSL(UsefulIMAPMixIn, imaplib.IMAP4_SSL): pass
class UsefulIMAP4_Tunnel(UsefulIMAPMixIn, imaplib.IMAP4_Tunnel): pass
class IMAPServer:
def __init__(self, username, password, hostname, port = None, ssl = 1,
maxconnections = 1):
def __init__(self, username = None, password = None, hostname = None,
port = None, ssl = 1, maxconnections = 1, tunnel = None):
self.username = username
self.password = password
self.hostname = hostname
self.tunnel = tunnel
self.port = port
self.usessl = ssl
self.delim = None
@ -102,12 +104,15 @@ class IMAPServer:
self.connectionlock.release() # Release until need to modify data
# Generate a new connection.
if self.usessl:
if self.tunnel:
imapobj = UsefulIMAP4_Tunnel(self.tunnel)
elif self.usessl:
imapobj = UsefulIMAP4_SSL(self.hostname, self.port)
else:
imapobj = UsefulIMAP4(self.hostname, self.port)
imapobj.login(self.username, self.password)
if not self.tunnel:
imapobj.login(self.username, self.password)
if self.delim == None:
self.delim, self.root = \