Skip to content

Commit 8d6bffc

Browse files
committed
Add dkimpy to requirements, remove unsafe key-cache monkey-patch
- Add dkimpy to requirements/base.txt (was missing after #205) - Remove thread-unsafe monkey-patch of dkim.parse_pem_private_key; PEM parse cost is negligible vs RSA (~0ms vs ~2.5ms per sign) - Add test_dkim_sign_after_error for signer recovery after errors
1 parent 3717ff1 commit 8d6bffc

2 files changed

Lines changed: 18 additions & 2 deletions

File tree

emails/signers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def __init__(self, selector: str, domain: str, key: str | bytes | IO[bytes] | No
2828
# Normalize to bytes
2929
privkey_bytes = privkey if isinstance(privkey, bytes) else str(privkey).encode()
3030

31-
# Validate key early; dkim.sign() re-parses on each call but
32-
# the PEM parse cost is negligible vs the RSA operation (~0ms vs ~2.5ms).
31+
# Validate key upfront; dkim.sign() re-parses PEM on each call
32+
# but the cost is negligible vs the RSA operation (~0ms vs ~2.5ms).
3333
try:
3434
dkim.crypto.parse_pem_private_key(privkey_bytes)
3535
except UnparsableKeyError as exc:

emails/testsuite/message/test_dkim.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ def test_dkim_as_bytes():
140140
assert b'DKIM-Signature: ' in result
141141

142142

143+
def test_dkim_sign_after_error():
144+
"""After a sign error with ignore_sign_errors, normal signing still works."""
145+
priv_key, pub_key = _generate_key(length=1024)
146+
147+
# First: sign with invalid include_headers (missing From), error ignored
148+
m1 = Message(**common_email_data())
149+
m1.dkim(key=priv_key, selector='_dkim', domain='somewhere.net',
150+
ignore_sign_errors=True, include_headers=['To'])
151+
m1.as_string() # should not raise
152+
153+
# Second: normal sign with same key must still work
154+
m2 = Message(**common_email_data())
155+
m2.dkim(key=priv_key, selector='_dkim', domain='somewhere.net')
156+
assert _check_dkim(m2, pub_key)
157+
158+
143159
def test_dkim_sign_twice():
144160

145161
# Test #44:

0 commit comments

Comments
 (0)