diff options
Diffstat (limited to 'src/mailman_pgp/workflows/base.py')
| -rw-r--r-- | src/mailman_pgp/workflows/base.py | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/mailman_pgp/workflows/base.py b/src/mailman_pgp/workflows/base.py new file mode 100644 index 0000000..40ff4d7 --- /dev/null +++ b/src/mailman_pgp/workflows/base.py @@ -0,0 +1,97 @@ +# 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 <http://www.gnu.org/licenses/>. + +"""""" +from mailman.email.message import UserNotification +from mailman.interfaces.subscriptions import TokenOwner + +from mailman_pgp.model.address import PGPAddress +from mailman_pgp.model.list import PGPMailingList +from mailman_pgp.pgp.wrapper import PGPWrapper + +KEY_REQUEST = """\ +---------- +TODO: this is a pgp enabled list. +We need your pubkey. +Reply to this message with it as a PGP/MIME(preferred) or inline. +----------""" + +CONFIRM_REQUEST = """\ +---------- +TODO: this is a pgp enabled list. +Reply to this message with this whole text +signed with your supplied key, either inline or PGP/MIME. + +Fingerprint: {} +Token: {} +---------- +""" + + +class PubkeyMixin: + def __init__(self, pubkey=None): + self.pubkey = pubkey + + def _step_pubkey_checks(self): + if not self.pubkey: + self.push('send_key_request') + + def _step_send_key_request(self): + self._set_token(TokenOwner.subscriber) + self.push('receive_key') + self.save() + request_address = self.mlist.request_address + email_address = self.address.email + msg = UserNotification(email_address, request_address, + 'key set {}'.format(self.token), + KEY_REQUEST) + msg.send(self.mlist, add_precedence=False) + # Now we wait for the confirmation. + raise StopIteration + + def _step_receive_key(self): + pgp_address = PGPAddress.for_address(self.address) + if pgp_address is None or pgp_address.key: + # The workflow was confirmed but we still dont have an address + # or the pubkey. So resend request and wait. + self.push('send_key_request') + return + else: + self.pubkey = pgp_address.key + self.push('send_confirm_request') + + def _step_send_confirm_request(self): + self._set_token(TokenOwner.subscriber) + self.push('receive_confirmation') + self.save() + request_address = self.mlist.request_address + email_address = self.address.email + msg = UserNotification(email_address, request_address, + 'key confirm {}'.format(self.token), + CONFIRM_REQUEST.format(self.pubkey.fingerprint, + self.token)) + pgp_list = PGPMailingList.for_list(self.mlist) + wrapped = PGPWrapper(msg) + encrypted = wrapped.encrypt(self.pubkey, pgp_list.pubkey) + + # XXX: This is not good: + msg.set_payload(encrypted) + msg.send(self.mlist) + raise StopIteration + + def _step_receive_confirmation(self): + pass |
