diff options
Diffstat (limited to 'service/pixelated')
-rw-r--r-- | service/pixelated/adapter/mail_service.py | 6 | ||||
-rw-r--r-- | service/pixelated/adapter/pixelated_mail.py | 17 | ||||
-rw-r--r-- | service/pixelated/adapter/pixelated_mailbox.py | 8 | ||||
-rw-r--r-- | service/pixelated/adapter/pixelated_mailboxes.py | 6 | ||||
-rw-r--r-- | service/pixelated/user_agent.py | 18 |
5 files changed, 39 insertions, 16 deletions
diff --git a/service/pixelated/adapter/mail_service.py b/service/pixelated/adapter/mail_service.py index 1183dae2..5f651187 100644 --- a/service/pixelated/adapter/mail_service.py +++ b/service/pixelated/adapter/mail_service.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. from pixelated.adapter.tag_service import TagService +from pixelated.support.id_gen import gen_pixelated_uid class MailService: @@ -33,7 +34,7 @@ class MailService: if query['tags']: _mails = self.mailboxes.mails_by_tag(query['tags']) - return sorted(_mails or [], key=lambda mail: mail.date, reverse=True) + return sorted(_mails or [], key=lambda mail: mail.headers['date'], reverse=True) def update_tags(self, mail_id, new_tags): mail = self.mail(mail_id) @@ -48,8 +49,7 @@ class MailService: self.mail_sender.sendmail(mail) def create_draft(self, mail): - drafts = self.mailboxes.drafts() - drafts.add(mail) + return self.mailboxes.add_draft(mail) def send_draft(self, mail): pass diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py index df9b4bbe..92b55ad4 100644 --- a/service/pixelated/adapter/pixelated_mail.py +++ b/service/pixelated/adapter/pixelated_mail.py @@ -25,7 +25,13 @@ from email.MIMEText import MIMEText class PixelatedMail: def __init__(self): - pass + self.body = '' + self.headers = {} + self.ident = None + self.status = [] + self.security_casing = {} + self.tags = [] + self.ident = None @staticmethod def from_leap_mail(leap_mail, leap_mailbox=None): @@ -34,7 +40,7 @@ class PixelatedMail: mail.leap_mailbox = leap_mailbox mail.body = leap_mail.bdoc.content['raw'] mail.headers = mail._extract_headers() - mail.date = PixelatedMail._get_date(mail.headers) + mail.headers['date'] = PixelatedMail._get_date(mail.headers) mail.status = set(mail._extract_status()) mail.security_casing = {} mail.tags = mail._extract_tags() @@ -121,10 +127,8 @@ class PixelatedMail: def as_dict(self): statuses = [status.name for status in self.status] - _headers = self.headers.copy() - _headers['date'] = self.date return { - 'header': _headers, + 'header': self.headers, 'ident': self.ident, 'tags': list(self.tags), 'status': statuses, @@ -147,6 +151,9 @@ class PixelatedMail: mime_multipart['From'] = PixelatedMail.from_email_address return mime_multipart.as_string() + def set_ident(self, mailbox_name, uid): + self.ident = gen_pixelated_uid(mailbox_name, uid) + @staticmethod def from_dict(mail_dict): return from_dict(mail_dict) diff --git a/service/pixelated/adapter/pixelated_mailbox.py b/service/pixelated/adapter/pixelated_mailbox.py index 191c171b..34c6c97b 100644 --- a/service/pixelated/adapter/pixelated_mailbox.py +++ b/service/pixelated/adapter/pixelated_mailbox.py @@ -16,6 +16,7 @@ from pixelated.adapter.pixelated_mail import PixelatedMail from pixelated.adapter.tag_service import TagService +from crochet import wait_for class PixelatedMailbox: @@ -29,6 +30,10 @@ class PixelatedMailbox: def messages(self): return self.leap_mailbox.messages + @property + def mailbox_name(self): + return self.leap_mailbox.mbox + def add_mailbox_tag_if_not_there(self, pixelated_mail): if not pixelated_mail.has_tag(self.mailbox_tag): pixelated_mail.update_tags({self.mailbox_tag}.union(pixelated_mail.tags)) @@ -58,8 +63,9 @@ class PixelatedMailbox: original_flags = mail.leap_mail.getFlags() self.leap_mailbox.addMessage(mail.raw_message(), original_flags) + @wait_for(timeout=3.0) def add(self, mail): - self.leap_mailbox.messages.add_msg(mail.to_smtp_format()) + return self.leap_mailbox.messages.add_msg(mail.to_smtp_format()) @classmethod def create(cls, account, mailbox_name='INBOX'): diff --git a/service/pixelated/adapter/pixelated_mailboxes.py b/service/pixelated/adapter/pixelated_mailboxes.py index 50d0ddc4..4866dbe4 100644 --- a/service/pixelated/adapter/pixelated_mailboxes.py +++ b/service/pixelated/adapter/pixelated_mailboxes.py @@ -26,6 +26,12 @@ class PixelatedMailBoxes(): return mails + def add_draft(self, mail): + drafts = self.drafts() + draft_id = drafts.add(mail) + mail.set_ident(drafts.mailbox_name, draft_id) + return mail + def mail(self, mail_id): for mailbox in self.mailboxes: mail = mailbox.mail(mail_id) diff --git a/service/pixelated/user_agent.py b/service/pixelated/user_agent.py index 643d0a30..952af297 100644 --- a/service/pixelated/user_agent.py +++ b/service/pixelated/user_agent.py @@ -15,14 +15,16 @@ # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. import json import argparse +import getpass + import os import os.path +import crochet from flask import Flask from flask import request from flask import Response from pixelated.adapter.pixelated_mail_sender import PixelatedMailSender from pixelated.adapter.pixelated_mailboxes import PixelatedMailBoxes -from pixelated.adapter.tag_service import TagService import pixelated.reactor_manager as reactor_manager import pixelated.search_query as search_query import pixelated.bitmask_libraries.session as LeapSession @@ -31,7 +33,7 @@ from pixelated.bitmask_libraries.provider import LeapProvider from pixelated.bitmask_libraries.auth import LeapAuthenticator, LeapCredentials from pixelated.adapter.mail_service import MailService from pixelated.adapter.pixelated_mail import PixelatedMail -import getpass + static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "web-ui", "app")) @@ -60,12 +62,12 @@ def disabled_features(): @app.route('/mails', methods=['POST']) def send_mail(): - mail = PixelatedMail.from_dict(request.json) - if mail.ident: - mail_service.send_draft(mail) + _mail = PixelatedMail.from_dict(request.json) + if _mail.ident: + mail_service.send_draft(_mail) else: - mail_service.create_draft(mail) - return respond_json(None) + _mail = mail_service.create_draft(_mail) + return respond_json(_mail.as_dict()) @app.route('/mails', methods=['PUT']) @@ -186,6 +188,8 @@ def setup(): args = parser.parse_args() debug_enabled = args.debug or os.environ.get('DEBUG', False) reactor_manager.start_reactor(logging=debug_enabled) + + crochet.setup() app.config.from_pyfile(os.path.join(os.environ['HOME'], '.pixelated')) if args.register: |