summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter/soledad/soledad_reader_mixin.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/pixelated/adapter/soledad/soledad_reader_mixin.py')
-rw-r--r--service/pixelated/adapter/soledad/soledad_reader_mixin.py130
1 files changed, 0 insertions, 130 deletions
diff --git a/service/pixelated/adapter/soledad/soledad_reader_mixin.py b/service/pixelated/adapter/soledad/soledad_reader_mixin.py
deleted file mode 100644
index e86298dd..00000000
--- a/service/pixelated/adapter/soledad/soledad_reader_mixin.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#
-# Copyright (c) 2014 ThoughtWorks, Inc.
-#
-# Pixelated is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Pixelated is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
-import base64
-import logging
-import quopri
-import re
-
-from twisted.internet import defer
-from pixelated.adapter.model.mail import PixelatedMail
-from pixelated.adapter.soledad.soledad_facade_mixin import SoledadDbFacadeMixin
-
-
-logger = logging.getLogger(__name__)
-
-
-class SoledadReaderMixin(SoledadDbFacadeMixin, object):
-
- @defer.inlineCallbacks
- def all_mails(self):
- fdocs_chash = [(fdoc, fdoc.content['chash']) for fdoc in (yield self.get_all_flags())]
- if len(fdocs_chash) == 0:
- defer.returnValue([])
- defer.returnValue((yield self._build_mails_from_fdocs(fdocs_chash)))
-
- @defer.inlineCallbacks
- def _build_mails_from_fdocs(self, fdocs_chash):
- if len(fdocs_chash) == 0:
- defer.returnValue([])
-
- fdocs_hdocs = []
- for fdoc, chash in fdocs_chash:
- hdoc = yield self.get_header_by_chash(chash)
- if not hdoc:
- continue
- fdocs_hdocs.append((fdoc, hdoc))
-
- fdocs_hdocs_bodyphash = [(f[0], f[1], f[1].content.get('body')) for f in fdocs_hdocs]
- fdocs_hdocs_bdocs_parts = []
- for fdoc, hdoc, body_phash in fdocs_hdocs_bodyphash:
- bdoc = yield self.get_content_by_phash(body_phash)
- if not bdoc:
- continue
- parts = yield self._extract_parts(hdoc.content)
- fdocs_hdocs_bdocs_parts.append((fdoc, hdoc, bdoc, parts))
-
- defer.returnValue([PixelatedMail.from_soledad(*raw_mail) for raw_mail in fdocs_hdocs_bdocs_parts])
-
- def mail_exists(self, ident):
- return self.get_flags_by_chash(ident)
-
- @defer.inlineCallbacks
- def mail(self, ident):
- fdoc = yield self.get_flags_by_chash(ident)
- hdoc = yield self.get_header_by_chash(ident)
- bdoc = yield self.get_content_by_phash(hdoc.content['body'])
- parts = yield self._extract_parts(hdoc.content)
-
- mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts)
- defer.returnValue(mail)
-
- @defer.inlineCallbacks
- def mails(self, idents):
- fdocs_chash = [((yield self.get_flags_by_chash(ident)), ident) for ident in
- idents]
- fdocs_chash = [(result, ident) for result, ident in fdocs_chash if result]
- defer.returnValue((yield self._build_mails_from_fdocs(fdocs_chash)))
-
- @defer.inlineCallbacks
- def attachment(self, attachment_ident, encoding):
- bdoc = yield self.get_content_by_phash(attachment_ident)
- defer.returnValue({'content': self._try_decode(bdoc.content['raw'], encoding),
- 'content-type': bdoc.content['content_type']})
-
- def _try_decode(self, raw, encoding):
- encoding = encoding.lower()
- if encoding == 'base64':
- return base64.decodestring(raw)
- elif encoding == 'quoted-printable':
- return quopri.decodestring(raw)
- else:
- return str(raw)
-
- @defer.inlineCallbacks
- def _extract_parts(self, hdoc, parts=None):
- if not parts:
- parts = {'alternatives': [], 'attachments': []}
-
- if hdoc['multi']:
- for part_key in hdoc.get('part_map', {}).keys():
- yield self._extract_parts(hdoc['part_map'][part_key], parts)
- else:
- headers_dict = {elem[0]: elem[1] for elem in hdoc.get('headers', [])}
- if 'attachment' in headers_dict.get('Content-Disposition', ''):
- parts['attachments'].append(self._extract_attachment(hdoc, headers_dict))
- else:
- parts['alternatives'].append((yield self._extract_alternative(hdoc, headers_dict)))
- defer.returnValue(parts)
-
- @defer.inlineCallbacks
- def _extract_alternative(self, hdoc, headers_dict):
- bdoc = yield self.get_content_by_phash(hdoc['phash'])
-
- if bdoc is None:
- logger.warning("No BDOC content found for message!!!")
- raw_content = ""
- else:
- raw_content = bdoc.content['raw']
-
- defer.returnValue({'headers': headers_dict, 'content': raw_content})
-
- def _extract_attachment(self, hdoc, headers_dict):
- content_disposition = headers_dict['Content-Disposition']
- match = re.compile('.*name=\"(.*)\".*').search(content_disposition)
- filename = ''
- if match:
- filename = match.group(1)
- return {'headers': headers_dict, 'ident': hdoc['phash'], 'name': filename}