diff sat/plugins/plugin_misc_imap.py @ 2624:56f94936df1e

code style reformatting using black
author Goffi <goffi@goffi.org>
date Wed, 27 Jun 2018 20:14:46 +0200
parents 26edcf3a30eb
children ab2696e34d29
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_imap.py	Wed Jun 27 07:51:29 2018 +0200
+++ b/sat/plugins/plugin_misc_imap.py	Wed Jun 27 20:14:46 2018 +0200
@@ -20,6 +20,7 @@
 from sat.core.i18n import _
 from sat.core.constants import Const as C
 from sat.core.log import getLogger
+
 log = getLogger(__name__)
 from twisted.internet import protocol, defer
 from twisted.cred import portal, checkers, credentials
@@ -41,12 +42,14 @@
     C.PI_DEPENDENCIES: ["Maildir"],
     C.PI_MAIN: "IMAP_server",
     C.PI_HANDLER: "no",
-    C.PI_DESCRIPTION: _("""Create an Imap server that you can use to read your "normal" type messages""")
+    C.PI_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
+    # TODO: connect profile on mailbox request, once password is accepted
 
     params = """
     <params>
@@ -62,7 +65,7 @@
         log.info(_("Plugin Imap Server initialization"))
         self.host = host
 
-        #parameters
+        # parameters
         host.memory.updateParams(self.params)
 
         port = int(self.host.memory.getParamA("IMAP Port", "Mail Server"))
@@ -76,7 +79,7 @@
     implements(imap4.IMessage)
 
     def __init__(self, uid, flags, mess_fp):
-        log.debug('Message Init')
+        log.debug("Message Init")
         self.uid = uid
         self.flags = flags
         self.mess_fp = mess_fp
@@ -85,22 +88,22 @@
     def getUID(self):
         """Retrieve the unique identifier associated with this message.
         """
-        log.debug('getUID (message)')
+        log.debug("getUID (message)")
         return self.uid
 
     def getFlags(self):
         """Retrieve the flags associated with this message.
         @return: The flags, represented as strings.
         """
-        log.debug('getFlags')
+        log.debug("getFlags")
         return self.flags
 
     def getInternalDate(self):
         """Retrieve the date internally associated with this message.
         @return: An RFC822-formatted date string.
         """
-        log.debug('getInternalDate')
-        return self.message['Date']
+        log.debug("getInternalDate")
+        return self.message["Date"]
 
     def getHeaders(self, negate, *names):
         """Retrieve a group of message headers.
@@ -109,32 +112,33 @@
         should be omitted from the return value, rather than included.
         @return: A mapping of header field names to header field values
         """
-        log.debug(u'getHeaders %s - %s' % (negate, names))
+        log.debug(u"getHeaders %s - %s" % (negate, 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):
+            if (negate and not header.lower() in to_check) or (
+                not negate and header.lower() in to_check
+            ):
                 final_dict[header] = self.message[header]
         return final_dict
 
     def getBodyFile(self):
         """Retrieve a file object containing only the body of this message.
         """
-        log.debug('getBodyFile')
+        log.debug("getBodyFile")
         return StringIO(self.message.get_payload())
 
     def getSize(self):
         """Retrieve the total size, in octets, of this message.
         """
-        log.debug('getSize')
+        log.debug("getSize")
         self.mess_fp.seek(0, os.SEEK_END)
         return self.mess_fp.tell()
 
     def isMultipart(self):
         """Indicate whether this message has subparts.
         """
-        log.debug('isMultipart')
+        log.debug("isMultipart")
         return False
 
     def getSubPart(self, part):
@@ -142,7 +146,7 @@
         @param part: The number of the part to retrieve, indexed from 0.
         @return: The specified sub-part.
         """
-        log.debug('getSubPart')
+        log.debug("getSubPart")
         return TypeError
 
 
@@ -152,10 +156,12 @@
     def __init__(self, host, name, profile):
         self.host = host
         self.listeners = set()
-        log.debug(u'Mailbox init (%s)' % name)
+        log.debug(u"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.messageNew, profile)
+        self.mailbox = self.host.plugins["Maildir"].accessMessageBox(
+            name, self.messageNew, profile
+        )
 
     def messageNew(self):
         """Called when a new message is in the mailbox"""
@@ -167,13 +173,13 @@
     def getUIDValidity(self):
         """Return the unique validity identifier for this mailbox.
         """
-        log.debug('getUIDValidity')
+        log.debug("getUIDValidity")
         return 0
 
     def getUIDNext(self):
         """Return the likely UID for the next message added to this mailbox.
         """
-        log.debug('getUIDNext')
+        log.debug("getUIDNext")
         return self.mailbox.getNextUid()
 
     def getUID(self, message):
@@ -181,14 +187,14 @@
         @param message: The message sequence number
         @return: The UID of the message.
         """
-        log.debug(u'getUID (%i)' % message)
-        #return self.mailbox.getUid(message-1) #XXX: it seems that this method get uid and not message sequence number
+        log.debug(u"getUID (%i)" % message)
+        # return self.mailbox.getUid(message-1) #XXX: it seems that this method get uid and not message sequence number
         return message
 
     def getMessageCount(self):
         """Return the number of messages in this mailbox.
         """
-        log.debug('getMessageCount')
+        log.debug("getMessageCount")
         ret = self.mailbox.getMessageCount()
         log.debug("count = %i" % ret)
         return ret
@@ -196,26 +202,26 @@
     def getRecentCount(self):
         """Return the number of messages with the 'Recent' flag.
         """
-        log.debug('getRecentCount')
-        return len(self.mailbox.getMessageIdsWithFlag('\\Recent'))
+        log.debug("getRecentCount")
+        return len(self.mailbox.getMessageIdsWithFlag("\\Recent"))
 
     def getUnseenCount(self):
         """Return the number of messages with the 'Unseen' flag.
         """
-        log.debug('getUnseenCount')
-        return self.getMessageCount() - len(self.mailbox.getMessageIdsWithFlag('\\SEEN'))
+        log.debug("getUnseenCount")
+        return self.getMessageCount() - len(self.mailbox.getMessageIdsWithFlag("\\SEEN"))
 
     def isWriteable(self):
         """Get the read/write status of the mailbox.
         @return: A true value if write permission is allowed, a false value otherwise.
         """
-        log.debug('isWriteable')
+        log.debug("isWriteable")
         return True
 
     def destroy(self):
         """Called before this mailbox is deleted, permanently.
         """
-        log.debug('destroy')
+        log.debug("destroy")
 
     def requestStatus(self, names):
         """Return status information about this mailbox.
@@ -227,7 +233,7 @@
         information up would be costly, a deferred whose callback will
         eventually be passed this dictionary is returned instead.
         """
-        log.debug('requestStatus')
+        log.debug("requestStatus")
         return imap4.statusRequestHelper(self, names)
 
     def addListener(self, listener):
@@ -237,7 +243,7 @@
         @param listener: An object to add to the set of those which will
         be notified when the contents of this mailbox change.
         """
-        log.debug(u'addListener %s' % listener)
+        log.debug(u"addListener %s" % listener)
         self.listeners.add(listener)
 
     def removeListener(self, listener):
@@ -250,11 +256,11 @@
         @raise ValueError: Raised when the given object is not a listener for
         this mailbox.
         """
-        log.debug('removeListener')
+        log.debug("removeListener")
         if listener in self.listeners:
             self.listeners.remove(listener)
         else:
-            raise imap4.MailboxException('Trying to remove an unknown listener')
+            raise imap4.MailboxException("Trying to remove an unknown listener")
 
     def addMessage(self, message, flags=(), date=None):
         """Add the given message to this mailbox.
@@ -265,7 +271,7 @@
         id if the message is added successfully and whose errback is
         invoked otherwise.
         """
-        log.debug('addMessage')
+        log.debug("addMessage")
         raise imap4.MailboxException("Client message addition not implemented yet")
 
     def expunge(self):
@@ -273,7 +279,7 @@
         @return: The list of message sequence numbers which were deleted,
         or a Deferred whose callback will be invoked with such a list.
         """
-        log.debug('expunge')
+        log.debug("expunge")
         self.mailbox.removeDeleted()
 
     def fetch(self, messages, uid):
@@ -282,16 +288,23 @@
         about
         @param uid: If true, the IDs specified in the query are UIDs;
         """
-        log.debug(u'fetch (%s, %s)' % (messages, uid))
+        log.debug(u"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 is None:
-                    log.debug('stopping iteration')
+                    log.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:
@@ -299,7 +312,14 @@
             for mess_idx in messages:
                 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.
@@ -316,14 +336,16 @@
         been performed, or a Deferred whose callback will be invoked with
         such a dict.
         """
-        log.debug('store')
+        log.debug("store")
 
         flags = [flag.upper() for flag in flags]
 
         def updateFlags(getF, setF):
             ret = {}
             for mess_id in messages:
-                if (uid and mess_id is 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:
@@ -348,7 +370,7 @@
             ret = updateFlags(self.mailbox.getFlags, self.mailbox.setFlags)
             newFlags = {}
             for idx in ret:
-                #we have to convert idx to uid for the listeners
+                # we have to convert idx to uid for the listeners
                 newFlags[self.mailbox.getUid(idx)] = ret[idx]
             for listener in self.listeners:
                 listener.flagsChanged(newFlags)
@@ -359,18 +381,24 @@
         Flags with the \\ prefix are reserved for use as system flags.
         @return: A list of the flags that can be set on messages in this mailbox.
         """
-        log.debug('getFlags')
-        return ['\\SEEN', '\\ANSWERED', '\\FLAGGED', '\\DELETED', '\\DRAFT']  # TODO: add '\\RECENT'
+        log.debug("getFlags")
+        return [
+            "\\SEEN",
+            "\\ANSWERED",
+            "\\FLAGGED",
+            "\\DELETED",
+            "\\DRAFT",
+        ]  # TODO: add '\\RECENT'
 
     def getHierarchicalDelimiter(self):
         """Get the character which delimits namespaces for in this mailbox.
         """
-        log.debug('getHierarchicalDelimiter')
-        return '.'
+        log.debug("getHierarchicalDelimiter")
+        return "."
 
 
 class ImapSatAccount(imap4.MemoryAccount):
-    #implements(imap4.IAccount)
+    # implements(imap4.IAccount)
 
     def __init__(self, host, profile):
         log.debug("ImapAccount init")
@@ -378,7 +406,7 @@
         self.profile = profile
         imap4.MemoryAccount.__init__(self, profile)
         self.addMailbox("Inbox")  # We only manage Inbox for the moment
-        log.debug('INBOX added')
+        log.debug("INBOX added")
 
     def _emptyMailbox(self, name, id):
         return SatMailbox(self.host, name, self.profile)
@@ -391,8 +419,8 @@
         self.host = host
 
     def requestAvatar(self, avatarID, mind, *interfaces):
-        log.debug('requestAvatar')
-        profile = avatarID.decode('utf-8')
+        log.debug("requestAvatar")
+        profile = avatarID.decode("utf-8")
         if imap4.IAccount not in interfaces:
             raise NotImplementedError
         return imap4.IAccount, ImapSatAccount(self.host, profile), lambda: None
@@ -404,16 +432,19 @@
     Check if the profile exists, and if the password is OK
     Return the profile as avatarId
     """
+
     implements(checkers.ICredentialsChecker)
-    credentialInterfaces = (credentials.IUsernamePassword,
-                            credentials.IUsernameHashedPassword)
+    credentialInterfaces = (
+        credentials.IUsernamePassword,
+        credentials.IUsernameHashedPassword,
+    )
 
     def __init__(self, host):
         self.host = host
 
     def _cbPasswordMatch(self, matched, profile):
         if matched:
-            return profile.encode('utf-8')
+            return profile.encode("utf-8")
         else:
             return failure.Failure(cred_error.UnauthorizedLogin())
 
@@ -421,7 +452,9 @@
         profiles = self.host.memory.getProfilesList()
         if not credentials.username in profiles:
             return defer.fail(cred_error.UnauthorizedLogin())
-        d = self.host.memory.asyncGetParamA("Password", "Connection", profile_key=credentials.username)
+        d = self.host.memory.asyncGetParamA(
+            "Password", "Connection", profile_key=credentials.username
+        )
         d.addCallback(lambda password: credentials.checkPassword(password))
         d.addCallback(self._cbPasswordMatch, credentials.username)
         return d