diff options
Diffstat (limited to 'src/mailman_pgp/model/list.py')
| -rw-r--r-- | src/mailman_pgp/model/list.py | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/src/mailman_pgp/model/list.py b/src/mailman_pgp/model/list.py index 001b6b3..fa5b89b 100644 --- a/src/mailman_pgp/model/list.py +++ b/src/mailman_pgp/model/list.py @@ -1,14 +1,18 @@ """""" +from multiprocessing import SimpleQueue +from os.path import exists, isfile, join + from mailman.config import config as mailman_config, config from mailman.database.types import Enum, SAUnicode from mailman.interfaces.action import Action from mailman.model.mailinglist import MailingList +from pgpy import PGPKey from public import public from sqlalchemy import Boolean, Column, Integer from mailman_pgp.model.base import Base -from mailman_pgp.pgp.keygen import KeyGenerator +from mailman_pgp.pgp.keygen import ListKeyGenerator @public @@ -17,7 +21,6 @@ class EncryptedMailingList(Base): id = Column(Integer, primary_key=True) list_id = Column(SAUnicode, index=True) - _key_fingerprint = Column('key_fingerprint', SAUnicode) unsigned_msg_action = Column(Enum(Action)) nonencrypted_msg_action = Column(Enum(Action)) strip_original_signature = Column(Boolean) @@ -27,28 +30,21 @@ class EncryptedMailingList(Base): super().__init__() self.list_id = mlist.list_id self._mlist = mlist - self._pubkey = None + self._key = None + self._key_queue = None + self._key_generator = None + self._generate(mlist) - self._key_generator = self._create_generator(mlist) + def _generate(self, mlist): + self._key_queue = SimpleQueue() + self._key_generator = ListKeyGenerator(config.gpg.keypair_config, + mlist.display_name, + mlist.posting_address, + mlist.request_address, + self._key_queue, + self.key_path) self._key_generator.start() - def _create_generator(self, mlist): - return KeyGenerator(mlist.list_id, mlist.fqdn_listname) - - @property - def key_fingerprint(self): - if self._key_fingerprint is None: - if self._key_generator.has_key: - self._key_fingerprint = self._key_generator.key_fingerprint - else: - if not self._key_generator.is_alive(): - # TODO this is not the best solution, we should lookup the - # key by mlist.fqdn_listname, if it actually got created - # and key generator didn't receive it. - self._key_generator = self._create_generator(self.mlist) - self._key_generator.start() - return self._key_fingerprint - @property def mlist(self): if self._mlist is not None: @@ -57,9 +53,26 @@ class EncryptedMailingList(Base): _list_id=self.list_id).first() @property - def pubkey(self): - if self._pubkey is None: - if self._key_fingerprint is None: - return None - self._pubkey = config.gpg.export_keys(self._key_fingerprint) - return self._pubkey + def key(self): + if self._key is None: + # First try the queue + if self._key_queue is not None and not self._key_queue.empty(): + self._key = self._key_queue.get() + # Then check the file + elif exists(self.key_path) and isfile(self.key_path): + self._key = PGPKey.from_file(self.key_path) + else: + # Check if key generator is running or what? Restart it if not. + # If we race it shutting down and saving the key file + queue + # it will simply check the key_file exists and put it into a + # queue for us. + if self._key_generator is None or \ + not self._key_generator.is_alive(): + self._generate(self.mlist) + return self._key + + @property + def key_path(self): + return join(config.gpg.keydir_config['list_keydir'], + self.list_id, + '.asc') |
