aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/rules/signature.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman_pgp/rules/signature.py')
-rw-r--r--src/mailman_pgp/rules/signature.py25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/mailman_pgp/rules/signature.py b/src/mailman_pgp/rules/signature.py
index 55b9b87..395dd7d 100644
--- a/src/mailman_pgp/rules/signature.py
+++ b/src/mailman_pgp/rules/signature.py
@@ -17,6 +17,7 @@
"""Signature checking rule for the pgp-posting-chain."""
from email.utils import parseaddr
+from operator import attrgetter
from mailman.core.i18n import _
from mailman.interfaces.action import Action
@@ -28,8 +29,10 @@ from zope.interface import implementer
from mailman_pgp.model.address import PGPAddress
from mailman_pgp.model.list import PGPMailingList
+from mailman_pgp.model.sighash import PGPSigHash
from mailman_pgp.pgp.wrapper import PGPWrapper
from mailman_pgp.utils.moderation import record_action
+from mailman_pgp.utils.pgp import hashes, verifies
@public
@@ -89,14 +92,34 @@ class Signature:
'No key set for address {}.'.format(email))
return True
+ if not pgp_address.key_confirmed:
+ record_action(msg, msgdata, Action.reject, email,
+ 'Key not confirmed.')
+ return True
+
+ verifications = list(wrapped.verify(key))
+
# Take the `invalid_sig_action` if the verification failed.
- if not wrapped.verifies(key):
+ if not verifies(verifications):
action = pgp_list.invalid_sig_action
if action != Action.defer:
record_action(msg, msgdata, action, email,
'Signature did not verify.')
return True
+ sig_hashes = set(hashes(verifications))
+ duplicates = set(PGPSigHash.hashes(sig_hashes))
+ if duplicates:
+ fingerprints = map(attrgetter('fingerprint'), duplicates)
+ if key.fingerprint in fingerprints:
+ action = pgp_list.duplicate_sig_action
+ if action != Action.defer:
+ record_action(msg, msgdata, action, email,
+ 'Signature duplicate.')
+ return True
+
+ # TODO: add the sig hashes to the db.
+
# XXX: we need to track key revocation separately to use it here
# TODO: check key revocation here