summaryrefslogtreecommitdiff
path: root/src/leap/mail/imap/parser.py
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2013-12-27 02:06:44 -0400
committerKali Kaneko <kali@leap.se>2014-01-08 20:32:08 -0400
commit25a0aea875fd0d67238beed1237f7239474673ec (patch)
treeafafe7eb7e18acf6420c29b88a8678070e997bcd /src/leap/mail/imap/parser.py
parent62b0cd6301b7097dfa2776b677ab3c7d27f60d7b (diff)
First stage of the storage schema rewrite.
* Separates between flags, docs, body and attachment docs. * Implement IMessageCopier interface: move and have fun! This little change is known to push forward our beloved architect emotional rollercoster. * Message deduplication. * It also fixes a hidden bug that was rendering the multipart mime interface useless (yes, the "True" parameter in the parsestr method). * Does not handle well nested attachs, includes dirty workaround that flattens them. * Includes chiiph's patch for rc2: * return deferred from addMessage * convert StringIO types to string * remove unneeded yields from the chain of deferreds in fetcher
Diffstat (limited to 'src/leap/mail/imap/parser.py')
-rw-r--r--src/leap/mail/imap/parser.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/leap/mail/imap/parser.py b/src/leap/mail/imap/parser.py
index 1ae19c0..306dcf0 100644
--- a/src/leap/mail/imap/parser.py
+++ b/src/leap/mail/imap/parser.py
@@ -19,10 +19,14 @@ Mail parser mixins.
"""
import cStringIO
import StringIO
+import hashlib
import re
+from email.message import Message
from email.parser import Parser
+from leap.common.check import leap_assert_type
+
class MailParser(object):
"""
@@ -34,16 +38,30 @@ class MailParser(object):
"""
self._parser = Parser()
- def _get_parsed_msg(self, raw):
+ def _get_parsed_msg(self, raw, headersonly=False):
"""
Return a parsed Message.
:param raw: the raw string to parse
:type raw: basestring, or StringIO object
+
+ :param headersonly: True for parsing only the headers.
+ :type headersonly: bool
"""
- msg = self._get_parser_fun(raw)(raw, True)
+ msg = self._get_parser_fun(raw)(raw, headersonly=headersonly)
return msg
+ def _get_hash(self, msg):
+ """
+ Returns a hash of the string representation of the raw message,
+ suitable for indexing the inmutable pieces.
+
+ :param msg: a Message object
+ :type msg: Message
+ """
+ leap_assert_type(msg, Message)
+ return hashlib.sha256(msg.as_string()).hexdigest()
+
def _get_parser_fun(self, o):
"""
Retunn the proper parser function for an object.
@@ -67,6 +85,8 @@ class MailParser(object):
:param o: object
:type o: object
"""
+ # XXX Maybe we don't need no more, we're using
+ # msg.as_string()
if isinstance(o, (cStringIO.OutputType, StringIO.StringIO)):
return o.getvalue()
else: