aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/model/list.py
blob: 4699599714598019d533e6b16495fa96a113d844 (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
""""""

from mailman.config import config as mailman_config
from mailman.database.types import Enum, SAUnicode
from mailman.interfaces.action import Action
from mailman.model.mailinglist import MailingList
from public import public
from sqlalchemy import Boolean, Column, Integer

from mailman_pgp.model.base import Base
from mailman_pgp.pgp.keygen import KeyGenerator


@public
class EncryptedMailingList(Base):
    __tablename__ = 'encrypted_lists'

    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)
    sign_outgoing = Column(Boolean)

    def __init__(self, mlist):
        super().__init__()
        self.list_id = mlist.list_id

        self._key_generator = self._create_generator(mlist)
        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):
        return mailman_config.db.query(MailingList).filter_by(
            _list_id=self.list_id).first()