aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/model/list.py
blob: fa5b89baa5b10e2ea965c3499a6f9de575dd980e (plain)
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.gpg.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.gpg.keydir_config['list_keydir'],
                    self.list_id,
                    '.asc')