aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/model/list.py
diff options
context:
space:
mode:
authorJ08nY2017-06-19 18:55:44 +0200
committerJ08nY2017-06-19 18:55:44 +0200
commitc8a7543b99ffa1f28def431e9d77fd74c3f2f00f (patch)
tree35a4c8c114a8842c9171ce0acbd3370aceca75f0 /src/mailman_pgp/model/list.py
parent64ef87abf4599f096743081c7be721bacc255606 (diff)
downloadmailman-pgp-c8a7543b99ffa1f28def431e9d77fd74c3f2f00f.tar.gz
mailman-pgp-c8a7543b99ffa1f28def431e9d77fd74c3f2f00f.tar.zst
mailman-pgp-c8a7543b99ffa1f28def431e9d77fd74c3f2f00f.zip
Diffstat (limited to 'src/mailman_pgp/model/list.py')
-rw-r--r--src/mailman_pgp/model/list.py67
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')