From fa1299aca064d2ac347a3e14d4c2169335a8f40c Mon Sep 17 00:00:00 2001 From: mnandri Date: Mon, 7 Dec 2015 16:53:39 +0100 Subject: #454 added utf-8 encoding on message body, and corresponding query search term --- .../pixelated/adapter/mailstore/leap_mailstore.py | 4 +++- service/pixelated/adapter/search/__init__.py | 4 +++- service/pixelated/resources/mails_resource.py | 12 ++++++------ service/pixelated/utils.py | 22 ++++++++++++++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100755 service/pixelated/utils.py (limited to 'service/pixelated') diff --git a/service/pixelated/adapter/mailstore/leap_mailstore.py b/service/pixelated/adapter/mailstore/leap_mailstore.py index 90035d20..14b0e417 100644 --- a/service/pixelated/adapter/mailstore/leap_mailstore.py +++ b/service/pixelated/adapter/mailstore/leap_mailstore.py @@ -27,6 +27,8 @@ from pixelated.adapter.mailstore.mailstore import MailStore, underscore_uuid from leap.mail.mail import Message from pixelated.adapter.model.mail import Mail, InputMail +from pixelated.utils import to_unicode + class AttachmentInfo(object): def __init__(self, ident, name, encoding): @@ -41,7 +43,7 @@ class LeapMail(Mail): self._mail_id = mail_id self._mailbox_name = mailbox_name self._headers = headers if headers is not None else {} - self._body = body + self._body = to_unicode(body) self.tags = set(tags) # TODO test that asserts copy self._flags = set(flags) # TODO test that asserts copy self._attachments = attachments diff --git a/service/pixelated/adapter/search/__init__.py b/service/pixelated/adapter/search/__init__.py index 065dd5e5..8d0b1f4e 100644 --- a/service/pixelated/adapter/search/__init__.py +++ b/service/pixelated/adapter/search/__init__.py @@ -31,6 +31,8 @@ from whoosh import sorting from pixelated.support.functional import unique import traceback +from pixelated.utils import to_unicode + class SearchEngine(object): DEFAULT_INDEX_HOME = os.path.join(os.environ['HOME'], '.leap') @@ -132,7 +134,7 @@ class SearchEngine(object): 'cc': self._format_recipient(header, 'cc'), 'bcc': self._format_recipient(header, 'bcc'), 'tag': u','.join(unique(tags)), - 'body': unicode(mdict['textPlainBody'] if 'textPlainBody' in mdict else mdict['body']), + 'body': to_unicode(mdict.get('textPlainBody', mdict.get('body', ''))), 'ident': unicode(mdict['ident']), 'flags': unicode(','.join(unique(mail.flags))), 'raw': unicode(mail.raw) diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py index 34dd042a..613c5e6f 100644 --- a/service/pixelated/resources/mails_resource.py +++ b/service/pixelated/resources/mails_resource.py @@ -7,10 +7,9 @@ from twisted.web.resource import Resource from twisted.web import server from twisted.internet import defer from twisted.python.log import err -from leap.common.events import ( - register, - catalog as events -) +from leap.common import events + +from pixelated.utils import to_unicode class MailsUnreadResource(Resource): @@ -120,7 +119,7 @@ class MailsResource(Resource): delivery_error_mail = InputMail.delivery_error_template(delivery_address=event.content) self._mail_service.mailboxes.inbox.add(delivery_error_mail) - register(events.SMTP_SEND_MESSAGE_ERROR, callback=on_error) + events.register(events.catalog.SMTP_SEND_MESSAGE_ERROR, callback=on_error) def __init__(self, mail_service, draft_service): Resource.__init__(self) @@ -136,7 +135,8 @@ class MailsResource(Resource): def render_GET(self, request): query, window_size, page = request.args.get('q')[0], request.args.get('w')[0], request.args.get('p')[0] - d = self._mail_service.mails(query, window_size, page) + unicode_query = to_unicode(query) + d = self._mail_service.mails(unicode_query, window_size, page) d.addCallback(lambda (mails, total): { "stats": { diff --git a/service/pixelated/utils.py b/service/pixelated/utils.py new file mode 100755 index 00000000..2e0f1f88 --- /dev/null +++ b/service/pixelated/utils.py @@ -0,0 +1,22 @@ +# +# Copyright (c) 2015 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 . + + +def to_unicode(text): + if text and not isinstance(text, unicode): + encoding = 'utf-8' + return unicode(text, encoding=encoding) + return text -- cgit v1.2.3