diff options
Diffstat (limited to 'service/pixelated')
-rw-r--r-- | service/pixelated/adapter/services/mail_service.py | 36 | ||||
-rw-r--r-- | service/pixelated/resources/attachments_resource.py | 15 |
2 files changed, 41 insertions, 10 deletions
diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index 964e4354..2f63a2bc 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -13,13 +13,17 @@ # # 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 email import encoders +from email.mime.nonmultipart import MIMENonMultipart +from email.mime.multipart import MIMEMultipart +from leap.mail.mail import Message + from twisted.internet import defer + from pixelated.adapter.model.mail import InputMail from pixelated.adapter.model.status import Status from pixelated.adapter.services.tag_service import extract_reserved_tags -from email import message_from_file -import os - +from leap.mail.adaptors.soledad import SoledadMailAdaptor class MailService(object): @@ -34,10 +38,28 @@ class MailService(object): mails = yield self.mail_store.all_mails() defer.returnValue(mails) - @defer.inlineCallbacks - def attachment_id(self, _file): - _attachment_id = yield 'mocked_for_now' - defer.returnValue(_attachment_id) + def _attachment_to_cdoc(self, content, content_type, encoder=encoders.encode_base64): + major, sub = content_type.split('/') + attachment = MIMENonMultipart(major, sub) + attachment.set_payload(content) + encoder(attachment) + attachment.add_header('Content-Disposition', 'attachment', filename='does_not_matter.txt') + + pseudo_mail = MIMEMultipart() + pseudo_mail.attach(attachment) + + tmp_mail = SoledadMailAdaptor().get_msg_from_string(MessageClass=Message, raw_msg=pseudo_mail.as_string()) + + cdoc = tmp_mail.get_wrapper().cdocs[1] + return cdoc + + def _calc_attachment_id_(self, content, content_type, encoder=encoders.encode_base64): + cdoc = self._attachment_to_cdoc(content, content_type, encoder) + + return cdoc.phash + + def attachment_id(self, content, content_type): + return self._calc_attachment_id_(content, content_type) @defer.inlineCallbacks def mails(self, query, window_size, page): diff --git a/service/pixelated/resources/attachments_resource.py b/service/pixelated/resources/attachments_resource.py index 667d030e..2b5a6912 100644 --- a/service/pixelated/resources/attachments_resource.py +++ b/service/pixelated/resources/attachments_resource.py @@ -13,6 +13,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/>. +import cgi import io import re @@ -78,16 +79,24 @@ class AttachmentsResource(Resource): def getChild(self, attachment_id, request): return AttachmentResource(self.mail_service, attachment_id) - def render_POST(self, request): - _file = request.args['attachment'][0] + def render_GET(self, request): + return '<html><body><p></p>' \ + '<form method="POST" enctype="multipart/form-data">' \ + '<input name="attachment" type="file" /> <p></p>' \ + '<input type="submit" /></form><p></p>' \ + '</body></html>' - deferred = self.mail_service.attachment_id(_file) + def render_POST(self, request): + fields = cgi.FieldStorage(fp=request.content, headers=request.headers, environ={'REQUEST_METHOD':'POST'}) + _file = fields['attachment'] + deferred = defer.maybeDeferred(self.mail_service.attachment_id, _file.value, _file.type) def send_location(attachment_id): request.headers['Location'] = '/%s/%s'% (self.BASE_URL, attachment_id) respond_json_deferred({"attachment_id": attachment_id}, request, status_code=201) def error_handler(error): + print error respond_json_deferred({"message": "Something went wrong. Attachement not saved."}, request, status_code=500) deferred.addCallback(send_location) |