Fix pep8 support in src/plugins.
This commit is contained in:
parent
e51a8a650b
commit
0dca274360
1 changed files with 1052 additions and 1079 deletions
|
|
@ -21,34 +21,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
from logging import debug, info, error
|
||||
import warnings
|
||||
from twisted.internet import protocol,defer
|
||||
from twisted.internet import protocol, defer
|
||||
from twisted.words.protocols.jabber import error as jab_error
|
||||
from twisted.cred import portal,checkers,credentials
|
||||
from twisted.cred import portal, checkers, credentials
|
||||
from twisted.cred import error as cred_error
|
||||
from twisted.mail import imap4
|
||||
from twisted.python import failure
|
||||
from email.parser import Parser
|
||||
import email.message
|
||||
import os,os.path
|
||||
import os
|
||||
from cStringIO import StringIO
|
||||
from twisted.internet import reactor
|
||||
import pdb
|
||||
|
||||
|
||||
from zope.interface import implements
|
||||
|
||||
|
||||
PLUGIN_INFO = {
|
||||
"name": "IMAP server Plugin",
|
||||
"import_name": "IMAP",
|
||||
"type": "Misc",
|
||||
"protocols": [],
|
||||
"dependencies": ["Maildir"],
|
||||
"main": "IMAP_server",
|
||||
"handler": "no",
|
||||
"description": _("""Create an Imap server that you can use to read your "normal" type messages""")
|
||||
"name": "IMAP server Plugin",
|
||||
"import_name": "IMAP",
|
||||
"type": "Misc",
|
||||
"protocols": [],
|
||||
"dependencies": ["Maildir"],
|
||||
"main": "IMAP_server",
|
||||
"handler": "no",
|
||||
"description": _("""Create an Imap server that you can use to read your "normal" type messages""")
|
||||
}
|
||||
|
||||
|
||||
class IMAP_server(object):
|
||||
#TODO: connect profile on mailbox request, once password is accepted
|
||||
|
||||
|
|
@ -75,15 +74,16 @@ class IMAP_server(object):
|
|||
self.server_factory = ImapServerFactory(self.host)
|
||||
reactor.listenTCP(port, self.server_factory)
|
||||
|
||||
|
||||
class Message(object):
|
||||
implements(imap4.IMessage)
|
||||
|
||||
def __init__(self, uid, flags, mess_fp):
|
||||
debug('Message Init')
|
||||
self.uid=uid
|
||||
self.flags=flags
|
||||
self.mess_fp=mess_fp
|
||||
self.message=Parser().parse(mess_fp)
|
||||
self.uid = uid
|
||||
self.flags = flags
|
||||
self.mess_fp = mess_fp
|
||||
self.message = Parser().parse(mess_fp)
|
||||
|
||||
def getUID(self):
|
||||
"""Retrieve the unique identifier associated with this message.
|
||||
|
|
@ -105,7 +105,6 @@ class Message(object):
|
|||
debug('getInternalDate')
|
||||
return self.message['Date']
|
||||
|
||||
|
||||
def getHeaders(self, negate, *names):
|
||||
"""Retrieve a group of message headers.
|
||||
@param names: The names of the headers to retrieve or omit.
|
||||
|
|
@ -114,12 +113,12 @@ class Message(object):
|
|||
@return: A mapping of header field names to header field values
|
||||
"""
|
||||
debug('getHeaders %s - %s' % (negate, names))
|
||||
final_dict={}
|
||||
to_check=[name.lower() for name in names]
|
||||
final_dict = {}
|
||||
to_check = [name.lower() for name in names]
|
||||
for header in self.message.keys():
|
||||
if (negate and not header.lower() in to_check) or \
|
||||
(not negate and header.lower() in to_check):
|
||||
final_dict[header]=self.message[header]
|
||||
(not negate and header.lower() in to_check):
|
||||
final_dict[header] = self.message[header]
|
||||
return final_dict
|
||||
|
||||
def getBodyFile(self):
|
||||
|
|
@ -132,17 +131,16 @@ class Message(object):
|
|||
"""Retrieve the total size, in octets, of this message.
|
||||
"""
|
||||
debug('getSize')
|
||||
self.mess_fp.seek(0,os.SEEK_END)
|
||||
self.mess_fp.seek(0, os.SEEK_END)
|
||||
return self.mess_fp.tell()
|
||||
|
||||
|
||||
def isMultipart(self):
|
||||
"""Indicate whether this message has subparts.
|
||||
"""
|
||||
debug('isMultipart')
|
||||
return False
|
||||
|
||||
def getSubPart(self,part):
|
||||
def getSubPart(self, part):
|
||||
"""Retrieve a MIME sub-message
|
||||
@param part: The number of the part to retrieve, indexed from 0.
|
||||
@return: The specified sub-part.
|
||||
|
|
@ -154,39 +152,39 @@ class Message(object):
|
|||
class SatMailbox(object):
|
||||
implements(imap4.IMailbox)
|
||||
|
||||
def __init__(self,host,name,profile):
|
||||
def __init__(self, host, name, profile):
|
||||
self.host = host
|
||||
self.listeners=set()
|
||||
debug ('Mailbox init (%s)', name)
|
||||
if name!="INBOX":
|
||||
self.listeners = set()
|
||||
debug('Mailbox init (%s)', name)
|
||||
if name != "INBOX":
|
||||
raise imap4.MailboxException("Only INBOX is managed for the moment")
|
||||
self.mailbox=self.host.plugins["Maildir"].accessMessageBox(name,self.newMessage, profile)
|
||||
self.mailbox = self.host.plugins["Maildir"].accessMessageBox(name, self.newMessage, profile)
|
||||
|
||||
def newMessage(self):
|
||||
"""Called when a new message is in the mailbox"""
|
||||
debug ("newMessage signal received")
|
||||
nb_messages=self.getMessageCount()
|
||||
debug("newMessage signal received")
|
||||
nb_messages = self.getMessageCount()
|
||||
for listener in self.listeners:
|
||||
listener.newMessages(nb_messages,None)
|
||||
listener.newMessages(nb_messages, None)
|
||||
|
||||
def getUIDValidity(self):
|
||||
"""Return the unique validity identifier for this mailbox.
|
||||
"""
|
||||
debug ('getUIDValidity')
|
||||
debug('getUIDValidity')
|
||||
return 0
|
||||
|
||||
def getUIDNext(self):
|
||||
"""Return the likely UID for the next message added to this mailbox.
|
||||
"""
|
||||
debug ('getUIDNext')
|
||||
debug('getUIDNext')
|
||||
return self.mailbox.getNextUid()
|
||||
|
||||
def getUID(self,message):
|
||||
def getUID(self, message):
|
||||
"""Return the UID of a message in the mailbox
|
||||
@param message: The message sequence number
|
||||
@return: The UID of the message.
|
||||
"""
|
||||
debug ('getUID (%i)' % message)
|
||||
debug('getUID (%i)' % message)
|
||||
#return self.mailbox.getUid(message-1) #XXX: it seems that this method get uid and not message sequence number
|
||||
return message
|
||||
|
||||
|
|
@ -208,7 +206,7 @@ class SatMailbox(object):
|
|||
"""Return the number of messages with the 'Unseen' flag.
|
||||
"""
|
||||
debug('getUnseenCount')
|
||||
return self.getMessageCount()-len(self.mailbox.getMessageIdsWithFlag('\\SEEN'))
|
||||
return self.getMessageCount() - len(self.mailbox.getMessageIdsWithFlag('\\SEEN'))
|
||||
|
||||
def isWriteable(self):
|
||||
"""Get the read/write status of the mailbox.
|
||||
|
|
@ -222,7 +220,6 @@ class SatMailbox(object):
|
|||
"""
|
||||
debug('destroy')
|
||||
|
||||
|
||||
def requestStatus(self, names):
|
||||
"""Return status information about this mailbox.
|
||||
@param names: The status names to return information regarding.
|
||||
|
|
@ -262,7 +259,7 @@ class SatMailbox(object):
|
|||
else:
|
||||
raise imap4.MailboxException('Trying to remove an unknown listener')
|
||||
|
||||
def addMessage(self, message, flags = (), date = None):
|
||||
def addMessage(self, message, flags=(), date=None):
|
||||
"""Add the given message to this mailbox.
|
||||
@param message: The RFC822 formatted message
|
||||
@param flags: The flags to associate with this message
|
||||
|
|
@ -288,24 +285,24 @@ class SatMailbox(object):
|
|||
about
|
||||
@param uid: If true, the IDs specified in the query are UIDs;
|
||||
"""
|
||||
debug('fetch (%s, %s)'%(messages,uid))
|
||||
debug('fetch (%s, %s)' % (messages, uid))
|
||||
if uid:
|
||||
messages.last = self.mailbox.getMaxUid()
|
||||
messages.getnext = self.mailbox.getNextExistingUid
|
||||
for mess_uid in messages:
|
||||
if mess_uid == None:
|
||||
debug ('stopping iteration')
|
||||
if mess_uid is None:
|
||||
debug('stopping iteration')
|
||||
raise StopIteration
|
||||
try:
|
||||
yield (mess_uid,Message(mess_uid,self.mailbox.getFlagsUid(mess_uid), self.mailbox.getMessageUid(mess_uid)))
|
||||
yield (mess_uid, Message(mess_uid, self.mailbox.getFlagsUid(mess_uid), self.mailbox.getMessageUid(mess_uid)))
|
||||
except IndexError:
|
||||
continue
|
||||
else:
|
||||
messages.last = self.getMessageCount()
|
||||
for mess_idx in messages:
|
||||
if mess_idx>self.getMessageCount():
|
||||
if mess_idx > self.getMessageCount():
|
||||
raise StopIteration
|
||||
yield (mess_idx,Message(mess_idx,self.mailbox.getFlags(mess_idx),self.mailbox.getMessage(mess_idx-1)))
|
||||
yield (mess_idx, Message(mess_idx, self.mailbox.getFlags(mess_idx), self.mailbox.getMessage(mess_idx - 1)))
|
||||
|
||||
def store(self, messages, flags, mode, uid):
|
||||
"""Set the flags of one or more messages.
|
||||
|
|
@ -324,19 +321,19 @@ class SatMailbox(object):
|
|||
"""
|
||||
debug('store')
|
||||
|
||||
flags=[flag.upper() for flag in flags]
|
||||
flags = [flag.upper() for flag in flags]
|
||||
|
||||
def updateFlags(getF,setF):
|
||||
def updateFlags(getF, setF):
|
||||
ret = {}
|
||||
for mess_id in messages:
|
||||
if (uid and mess_id == None) or (not uid and mess_id>self.getMessageCount()):
|
||||
if (uid and mess_id is None) or (not uid and mess_id > self.getMessageCount()):
|
||||
break
|
||||
_flags=set(getF(mess_id) if mode else [])
|
||||
if mode==-1:
|
||||
_flags = set(getF(mess_id) if mode else [])
|
||||
if mode == -1:
|
||||
_flags.difference_update(set(flags))
|
||||
else:
|
||||
_flags.update(set(flags))
|
||||
new_flags=list(_flags)
|
||||
new_flags = list(_flags)
|
||||
setF(mess_id, new_flags)
|
||||
ret[mess_id] = tuple(new_flags)
|
||||
return ret
|
||||
|
|
@ -344,15 +341,15 @@ class SatMailbox(object):
|
|||
if uid:
|
||||
messages.last = self.mailbox.getMaxUid()
|
||||
messages.getnext = self.mailbox.getNextExistingUid
|
||||
ret = updateFlags(self.mailbox.getFlagsUid,self.mailbox.setFlagsUid)
|
||||
ret = updateFlags(self.mailbox.getFlagsUid, self.mailbox.setFlagsUid)
|
||||
for listener in self.listeners:
|
||||
listener.flagsChanged(ret)
|
||||
return ret
|
||||
|
||||
else:
|
||||
messages.last = self.getMessageCount()
|
||||
ret = updateFlags(self.mailbox.getFlags,self.mailbox.setFlags)
|
||||
newFlags={}
|
||||
ret = updateFlags(self.mailbox.getFlags, self.mailbox.setFlags)
|
||||
newFlags = {}
|
||||
for idx in ret:
|
||||
#we have to convert idx to uid for the listeners
|
||||
newFlags[self.mailbox.getUid(idx)] = ret[idx]
|
||||
|
|
@ -366,7 +363,7 @@ class SatMailbox(object):
|
|||
@return: A list of the flags that can be set on messages in this mailbox.
|
||||
"""
|
||||
debug('getFlags')
|
||||
return ['\\SEEN','\\ANSWERED','\\FLAGGED','\\DELETED','\\DRAFT'] #TODO: add '\\RECENT'
|
||||
return ['\\SEEN', '\\ANSWERED', '\\FLAGGED', '\\DELETED', '\\DRAFT'] # TODO: add '\\RECENT'
|
||||
|
||||
def getHierarchicalDelimiter(self):
|
||||
"""Get the character which delimits namespaces for in this mailbox.
|
||||
|
|
@ -374,33 +371,35 @@ class SatMailbox(object):
|
|||
debug('getHierarchicalDelimiter')
|
||||
return '.'
|
||||
|
||||
|
||||
class ImapSatAccount(imap4.MemoryAccount):
|
||||
#implements(imap4.IAccount)
|
||||
|
||||
def __init__(self, host, profile):
|
||||
debug("ImapAccount init")
|
||||
self.host=host
|
||||
self.profile=profile
|
||||
imap4.MemoryAccount.__init__(self,profile)
|
||||
self.addMailbox("Inbox") #We only manage Inbox for the moment
|
||||
debug ('INBOX added')
|
||||
self.host = host
|
||||
self.profile = profile
|
||||
imap4.MemoryAccount.__init__(self, profile)
|
||||
self.addMailbox("Inbox") # We only manage Inbox for the moment
|
||||
debug('INBOX added')
|
||||
|
||||
def _emptyMailbox(self, name, id):
|
||||
return SatMailbox(self.host,name,self.profile)
|
||||
return SatMailbox(self.host, name, self.profile)
|
||||
|
||||
|
||||
class ImapRealm(object):
|
||||
implements(portal.IRealm)
|
||||
|
||||
def __init__(self,host):
|
||||
def __init__(self, host):
|
||||
self.host = host
|
||||
|
||||
def requestAvatar(self, avatarID, mind, *interfaces):
|
||||
debug('requestAvatar')
|
||||
profile=avatarID.decode('utf-8')
|
||||
profile = avatarID.decode('utf-8')
|
||||
if imap4.IAccount not in interfaces:
|
||||
raise NotImplementedError
|
||||
return imap4.IAccount, ImapSatAccount(self.host,profile), lambda:None
|
||||
return imap4.IAccount, ImapSatAccount(self.host, profile), lambda: None
|
||||
|
||||
|
||||
class SatProfileCredentialChecker(object):
|
||||
"""
|
||||
|
|
@ -412,7 +411,6 @@ class SatProfileCredentialChecker(object):
|
|||
credentialInterfaces = (credentials.IUsernamePassword,
|
||||
credentials.IUsernameHashedPassword)
|
||||
|
||||
|
||||
def __init__(self, host):
|
||||
self.host = host
|
||||
|
||||
|
|
@ -431,20 +429,21 @@ class SatProfileCredentialChecker(object):
|
|||
d.addCallback(self._cbPasswordMatch, credentials.username)
|
||||
return d
|
||||
|
||||
|
||||
class ImapServerFactory(protocol.ServerFactory):
|
||||
protocol = imap4.IMAP4Server
|
||||
|
||||
def __init__(self, host):
|
||||
self.host=host
|
||||
self.host = host
|
||||
|
||||
def startedConnecting(self, connector):
|
||||
debug (_("IMAP server connection started"))
|
||||
debug(_("IMAP server connection started"))
|
||||
|
||||
def clientConnectionLost(self, connector, reason):
|
||||
debug (_("IMAP server connection lost (reason: %s)"), reason)
|
||||
debug(_("IMAP server connection lost (reason: %s)"), reason)
|
||||
|
||||
def buildProtocol(self, addr):
|
||||
debug ("Building protocol")
|
||||
debug("Building protocol")
|
||||
prot = protocol.ServerFactory.buildProtocol(self, addr)
|
||||
prot.portal = portal.Portal(ImapRealm(self.host))
|
||||
prot.portal.registerChecker(SatProfileCredentialChecker(self.host))
|
||||
|
|
|
|||
Loading…
Reference in a new issue