From 19cda9ca7aa1aca18f61ebf659fc490f8ad4c15a Mon Sep 17 00:00:00 2001 From: Duda Dornelles Date: Wed, 2 Sep 2015 18:07:51 -0300 Subject: [feature] adding security_casing to LeapMail so we can show in the UI the signature and encryption status --- .../pixelated/adapter/mailstore/leap_mailstore.py | 25 ++++++++++++++-- .../extensions/incoming_decrypt_header.py | 35 ---------------------- 2 files changed, 23 insertions(+), 37 deletions(-) delete mode 100644 service/pixelated/extensions/incoming_decrypt_header.py (limited to 'service/pixelated') diff --git a/service/pixelated/adapter/mailstore/leap_mailstore.py b/service/pixelated/adapter/mailstore/leap_mailstore.py index 993f413c..a27ce5c4 100644 --- a/service/pixelated/adapter/mailstore/leap_mailstore.py +++ b/service/pixelated/adapter/mailstore/leap_mailstore.py @@ -16,13 +16,13 @@ import base64 from email.header import decode_header import quopri -import re from uuid import uuid4 + +import re from leap.mail.adaptors.soledad import SoledadMailAdaptor, ContentDocWrapper from twisted.internet import defer from pixelated.adapter.mailstore.body_parser import BodyParser from pixelated.adapter.mailstore.mailstore import MailStore, underscore_uuid - from leap.mail.mail import Message from pixelated.adapter.model.mail import Mail, InputMail @@ -74,6 +74,26 @@ class LeapMail(Mail): def mailbox_name(self): return self._mailbox_name + @property + def security_casing(self): + casing = dict(imprints=self._signature_information(), locks=[]) + if self._encrypted() == "decrypted": + casing["locks"] = [{"state": "valid"}] + return casing + + def _encrypted(self): + return self.headers.get("X-Leap-Encryption", "false") + + def _signature_information(self): + signature = self.headers.get("X-Leap-Signature", None) + if signature is None or signature.startswith("could not verify"): + return [{"state": "no_signature_information"}] + else: + if signature.startswith("valid"): + return [{"state": "valid", "seal": {"validity": "valid"}}] + else: + return [] + @property def raw(self): result = u'' @@ -107,6 +127,7 @@ class LeapMail(Mail): 'tags': self.tags, 'status': list(self.status), 'body': self._body, + 'security_casing': self.security_casing, 'textPlainBody': self._body, 'replying': self._replying_dict(), 'mailbox': self._mailbox_name.lower(), diff --git a/service/pixelated/extensions/incoming_decrypt_header.py b/service/pixelated/extensions/incoming_decrypt_header.py deleted file mode 100644 index 2db5dd1d..00000000 --- a/service/pixelated/extensions/incoming_decrypt_header.py +++ /dev/null @@ -1,35 +0,0 @@ -import leap.mail.imap.fetch as fetch - - -def mark_as_encrypted_inline(f): - - def w(*args, **kwargs): - msg, valid_sign = f(*args) - is_encrypted = fetch.PGP_BEGIN in args[1].as_string() and fetch.PGP_END in args[1].as_string() - decrypted_successfully = fetch.PGP_BEGIN not in msg.as_string() and fetch.PGP_END not in msg.as_string() - - if not is_encrypted: - encrypted = 'false' - else: - if decrypted_successfully: - encrypted = 'true' - else: - encrypted = 'fail' - - msg.add_header('X-Pixelated-encryption-status', encrypted) - return msg, valid_sign - - return w - - -def mark_as_encrypted_multipart(f): - - def w(*args, **kwargs): - msg, valid_sign = f(*args) - msg.add_header('X-Pixelated-encryption-status', 'true') - return msg, valid_sign - return w - - -fetch.LeapIncomingMail._maybe_decrypt_inline_encrypted_msg = mark_as_encrypted_inline(fetch.LeapIncomingMail._maybe_decrypt_inline_encrypted_msg) -fetch.LeapIncomingMail._decrypt_multipart_encrypted_msg = mark_as_encrypted_multipart(fetch.LeapIncomingMail._decrypt_multipart_encrypted_msg) -- cgit v1.2.3