aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/pgp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman_pgp/pgp')
-rw-r--r--src/mailman_pgp/pgp/keygen.py36
-rw-r--r--src/mailman_pgp/pgp/tests/test_keygen.py85
-rw-r--r--src/mailman_pgp/pgp/tests/test_pgp.py7
3 files changed, 77 insertions, 51 deletions
diff --git a/src/mailman_pgp/pgp/keygen.py b/src/mailman_pgp/pgp/keygen.py
index 684b81a..57a94d7 100644
--- a/src/mailman_pgp/pgp/keygen.py
+++ b/src/mailman_pgp/pgp/keygen.py
@@ -25,22 +25,32 @@ from pgpy import PGPKey, PGPUID
from pgpy.constants import (
CompressionAlgorithm, HashAlgorithm, KeyFlags, SymmetricKeyAlgorithm)
+from mailman_pgp.config import config
+from mailman_pgp.utils.pgp import key_from_file
+
class ListKeyGenerator(mp.Process):
"""A multiprocessing list key generator."""
- def __init__(self, primary_args, subkey_args, display_name,
- posting_address,
- request_address, key_path):
+ def __init__(self, pgp_list):
super().__init__(
- target=self.generate,
- args=(primary_args, subkey_args, display_name, posting_address,
- request_address, key_path),
+ target=self._run,
+ args=(config.pgp.primary_key_args, config.pgp.sub_key_args,
+ pgp_list.mlist.display_name,
+ pgp_list.mlist.posting_address,
+ pgp_list.mlist.request_address,
+ pgp_list.key_path),
daemon=True)
+ self._pgp_list = pgp_list
+
+ def generate(self, block=False):
+ self.start()
+ if block:
+ self.join()
+ return key_from_file(self._pgp_list.key_path)
- def generate(self, primary_args, subkey_args, display_name,
- posting_address,
- request_address, key_path):
+ def _run(self, primary_args, subkey_args, display_name, posting_address,
+ request_address, key_path):
"""
Generate the list keypair and save it.
@@ -51,11 +61,11 @@ class ListKeyGenerator(mp.Process):
:param request_address:
:param key_path:
"""
- key = self._create(primary_args, subkey_args, display_name,
- posting_address,
- request_address)
+ self.key = self._create(primary_args, subkey_args, display_name,
+ posting_address,
+ request_address)
with Lock(key_path + '.lock'):
- self._save(key, key_path)
+ self._save(self.key, key_path)
def _create(self, primary_args, subkey_args, display_name, posting_address,
request_address):
diff --git a/src/mailman_pgp/pgp/tests/test_keygen.py b/src/mailman_pgp/pgp/tests/test_keygen.py
index a3a5499..7de1a19 100644
--- a/src/mailman_pgp/pgp/tests/test_keygen.py
+++ b/src/mailman_pgp/pgp/tests/test_keygen.py
@@ -16,25 +16,29 @@
# this program. If not, see <http://www.gnu.org/licenses/>.
"""Test the out-of-process key generator."""
-from os.path import exists, isfile, join
-from tempfile import TemporaryDirectory
+from os.path import exists, isfile
from unittest import TestCase
+from mailman.app.lifecycle import create_list
from parameterized import parameterized
-from pgpy import PGPKey
from pgpy.constants import EllipticCurveOID, PubKeyAlgorithm
+from mailman_pgp.config import config
+from mailman_pgp.database import mm_transaction
+from mailman_pgp.model.list import PGPMailingList
from mailman_pgp.pgp.keygen import ListKeyGenerator
-from mailman_pgp.testing.layers import PGPLayer
+from mailman_pgp.testing.layers import PGPConfigLayer
+from mailman_pgp.utils.pgp import key_from_file
class TestKeygen(TestCase):
- layer = PGPLayer
+ layer = PGPConfigLayer
def setUp(self):
- self.display_name = 'Display Name'
- self.posting_address = 'posting@address.com'
- self.request_address = 'posting-request@address.com'
+ with mm_transaction():
+ self.mlist = create_list('test@example.com',
+ style_name='pgp-default')
+ self.pgp_list = PGPMailingList.for_list(self.mlist)
@parameterized.expand([
# RSA + RSA
@@ -49,36 +53,43 @@ class TestKeygen(TestCase):
])
def test_generate(self, primary_key_type, primary_key_size, sub_key_type,
sub_key_size):
- with TemporaryDirectory() as temp_dir:
- key_path = join(temp_dir, 'key.asc')
- keygen = ListKeyGenerator((primary_key_type, primary_key_size),
- (sub_key_type, sub_key_size),
- self.display_name,
- self.posting_address,
- self.request_address, key_path)
- keygen.start()
- keygen.join()
- self.assertTrue(exists(key_path))
- self.assertTrue(isfile(key_path))
+ def reset_primary(primary_key_args):
+ config.pgp.primary_key_args = primary_key_args
- key, _ = PGPKey.from_file(key_path)
- self.assertEqual(key.key_algorithm,
- primary_key_type)
- self.assertEqual(key.key_size,
- primary_key_size)
+ self.addCleanup(reset_primary, config.pgp.primary_key_args)
- subs = key.subkeys
- self.assertEqual(len(subs), 1)
+ def reset_sub(sub_key_args):
+ config.pgp.sub_key_args = sub_key_args
- keyid, sub = subs.popitem()
- self.assertEqual(sub.key_algorithm,
- sub_key_type)
- self.assertEqual(sub.key_size,
- sub_key_size)
+ self.addCleanup(reset_sub, config.pgp.sub_key_args)
- uids = key.userids
- self.assertEqual(len(uids), 2)
- for uid in uids:
- self.assertEqual(uid.name, self.display_name)
- self.assertIn(uid.email,
- (self.posting_address, self.request_address))
+ config.pgp.primary_key_args = (primary_key_type, primary_key_size)
+ config.pgp.sub_key_args = (sub_key_type, sub_key_size)
+
+ key_path = self.pgp_list.key_path
+ keygen = ListKeyGenerator(self.pgp_list)
+ ret_key = keygen.generate(True)
+ list_key = self.pgp_list.key
+ self.assertTrue(exists(key_path))
+ self.assertTrue(isfile(key_path))
+
+ key = key_from_file(key_path)
+ self.assertEqual(key.key_algorithm, primary_key_type)
+ self.assertEqual(key.key_size, primary_key_size)
+ self.assertEqual(ret_key.fingerprint, key.fingerprint)
+ self.assertEqual(list_key.fingerprint, key.fingerprint)
+
+ subs = key.subkeys
+ self.assertEqual(len(subs), 1)
+
+ keyid, sub = subs.popitem()
+ self.assertEqual(sub.key_algorithm, sub_key_type)
+ self.assertEqual(sub.key_size, sub_key_size)
+
+ uids = key.userids
+ self.assertEqual(len(uids), 2)
+ for uid in uids:
+ self.assertEqual(uid.name, self.pgp_list.mlist.display_name)
+ self.assertIn(uid.email,
+ (self.pgp_list.mlist.posting_address,
+ self.pgp_list.mlist.request_address))
diff --git a/src/mailman_pgp/pgp/tests/test_pgp.py b/src/mailman_pgp/pgp/tests/test_pgp.py
index ab2a69a..6ef531e 100644
--- a/src/mailman_pgp/pgp/tests/test_pgp.py
+++ b/src/mailman_pgp/pgp/tests/test_pgp.py
@@ -25,6 +25,7 @@ from mailman_pgp.config import config
from mailman_pgp.database import mm_transaction, transaction
from mailman_pgp.model.address import PGPAddress
from mailman_pgp.model.list import PGPMailingList
+from mailman_pgp.pgp.keygen import ListKeyGenerator
from mailman_pgp.testing.layers import PGPConfigLayer
from mailman_pgp.testing.pgp import load_key
@@ -37,7 +38,7 @@ class TestPGP(TestCase):
self.mlist = create_list('test@example.com',
style_name='pgp-default')
self.pgp_list = PGPMailingList.for_list(self.mlist)
- self.list_key = self.pgp_list.generate_key(True)
+ self.list_key = ListKeyGenerator(self.pgp_list).generate(True)
# Make Anne a member of this mailing list.
self.anne = subscribe(self.mlist, 'Anne', email='anne@example.org')
@@ -61,3 +62,7 @@ class TestPGP(TestCase):
with keyring.key(self.anne_key.fingerprint) as key:
self.assertTrue(key.is_public)
self.assertEqual(key.fingerprint, self.anne_key.fingerprint)
+
+ def test_archive_keydir(self):
+ keyring = config.pgp.archive_keyring
+ self.assertEqual(len(keyring), 0)