From 2973852fbbd4f11a633dc4e4630e042f9169c998 Mon Sep 17 00:00:00 2001 From: Scott Kitterman Date: Sun, 3 Nov 2019 11:57:30 -0500 Subject: [PATCH] - Add new DKIM.present function to allow applications to test if a DKIM signature is present without doing validation (LP: #1851141) --- ChangeLog | 2 ++ dkim/__init__.py | 5 +++++ dkim/tests/test_dkim.py | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/ChangeLog b/ChangeLog index 5774634..cd4c3fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ Version 1.0.0 - Add support for RFC 8460 tlsrpt DKIM signature processing (LP: #1847020) - Add new timeout parameter to enable DNS lookup timeouts to be adjusted + - Add new DKIM.present function to allow applications to test if a DKIM + signature is present without doing validation (LP: #1851141) - Drop usage of pymilter Milter.dns in dnsplug since it doesn't support havine a timeout passed to it diff --git a/dkim/__init__.py b/dkim/__init__.py index e00908c..d3f1fb0 100644 --- a/dkim/__init__.py +++ b/dkim/__init__.py @@ -872,6 +872,11 @@ class DKIM(DomainSigner): self.signature_fields = dict(sigfields) return b'DKIM-Signature: ' + res + #: Checks if any DKIM signature is present + #: @return: True if there is one or more DKIM signatures present or False otherwise + def present(self): + return (len([(x,y) for x,y in self.headers if x.lower() == b"dkim-signature"]) > 0) + #: Verify a DKIM signature. #: @type idx: int #: @param idx: which signature to verify. The first (topmost) signature is 0. diff --git a/dkim/tests/test_dkim.py b/dkim/tests/test_dkim.py index 6b6f7b6..578c260 100644 --- a/dkim/tests/test_dkim.py +++ b/dkim/tests/test_dkim.py @@ -300,6 +300,16 @@ p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=""" res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc) self.assertTrue(res) + def test_present(self): + # Test DKIM.present(). + d = dkim.DKIM(self.message,signature_algorithm=b'rsa-sha256') + present = d.present() + self.assertFalse(present) + sig = d.sign(b"test", b"example.com", self.key) + signed = sig + self.message + d2 = dkim.DKIM(signed) + present = d2.present() + self.assertTrue(present) def test_badly_encoded_domain_fails(self): # Domains should be ASCII. Bad ASCII causes verification to fail.