1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
""""""
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 ListKeyGenerator
@public
class EncryptedMailingList(Base):
__tablename__ = 'encrypted_lists'
id = Column(Integer, primary_key=True)
list_id = Column(SAUnicode, index=True)
unsigned_msg_action = Column(Enum(Action))
nonencrypted_msg_action = Column(Enum(Action))
strip_original_signature = Column(Boolean)
sign_outgoing = Column(Boolean)
def __init__(self, mlist):
super().__init__()
self.list_id = mlist.list_id
self._mlist = mlist
self._key = None
self._key_queue = None
self._key_generator = None
self._generate(mlist)
def _generate(self, mlist):
self._key_queue = SimpleQueue()
self._key_generator = ListKeyGenerator(config.pgp.keypair_config,
mlist.display_name,
mlist.posting_address,
mlist.request_address,
self._key_queue,
self.key_path)
self._key_generator.start()
@property
def mlist(self):
if self._mlist is not None:
return self._mlist
return mailman_config.db.query(MailingList).filter_by(
_list_id=self.list_id).first()
@property
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.pgp.keydir_config['list_keydir'],
self.list_id,
'.asc')
|