# Copyright (C) 2017 Jan Jancar # # This file is a part of the Mailman PGP plugin. # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. # # This program 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 General Public License for # more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . """Strict inline PGP message wrapper.""" from pgpy import PGPMessage from pgpy.types import Armorable from public import public @public class InlineWrapper: """Inline PGP wrapper.""" def __init__(self, msg): """ Wrap the given message. :param msg: The message to wrap. :type msg: mailman.email.message.Message """ self.msg = msg def _is_inline(self): return not self.msg.is_multipart() def _as_string(self): return str(self.msg.get_payload()) def _has_armor(self, block_type): try: dearm = Armorable.ascii_unarmor(self._as_string()) if dearm['magic'] == block_type: return True except: pass return False def is_signed(self): """ Whether the message is inline signed (cleartext). :return: If the message is inline signed. :rtype: bool """ # XXX: This doesnt handle non-cleartext signatures (gpg -s -a) return self._is_inline() and self._has_armor('SIGNATURE') def is_encrypted(self): """ Whether the message is inline encrypted. :return: If the message is inline encrypted. :rtype: bool """ # XXX: This mistakes non-cleartext signature as encrypted. return self._is_inline() and self._has_armor('MESSAGE') def verify(self, key): """ Verify the signature of this message with key. :param key: The key to verify with. :type key: pgpy.PGPKey :return: The verified signature. :rtype: pgpy.types.SignatureVerification """ message = PGPMessage.from_blob(self._as_string()) return key.verify(message) def sign(self): pass def decrypt(self, key): """ Decrypt this message with key. :param key: The key to decrypt with. :type key: pgpy.PGPKey :return: The decrypted message. :rtype: PGPMessage """ message = PGPMessage.from_blob(self._as_string()) return key.decrypt(message) def encrypt(self): pass