Fix pep8 support in src/plugins.

This commit is contained in:
Emmanuel Gil Peyrot 2013-01-18 17:55:35 +01:00
commit 0dca274360

View file

@ -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))