Releases: domainaware/checkdmarc
Releases · domainaware/checkdmarc
5.17.1
5.17.0
What's Changed
- More verbose nxdomain message by @kazet in #256
- Add warning for deprecated Sender ID TXT records by @EmailKarma in #255
New Contributors
- @EmailKarma made their first contribution in #255
Full Changelog: 5.16.2...5.17.0
5.16.2
Changes
- BIMI: forbidden
x/yattributes on the root<svg>element are now
actually rejected.get_svg_metadatawas reading the wrong xmltodict
keys, so the existing rejection incheck_svg_requirementsnever fired
on real SVGs. The metadata also lost theyvalue to a typo that
clobberedmetadata["x"]. - DNSSEC: narrowed three broad
except Exceptionclauses to specific
exception types (dns.exception.DNSException,OSError,EOFError)
so programming errors propagate instead of being silently swallowed.
5.16.1
Changes
- Simplify the warning emitted for
pct/rf/rito just "Support for
the {tag} tag was removed in RFC 9989".
5.16.0
Changes
- Rename DMARCbis references to RFC 9989
- In compliance with RFC 9989, treat a DMARC
ptag asp=none, instead of requiring it- Instead, a warning is raised that older versions of DMARC require it
- DMARC: the
pct,rf, andritags are removed in RFC 9989. They are no
longer implicitly added to parsed results, are no longer strictly validated
(invalid values that previously raised now just warn), and explicit use
emits a "removed in RFC 9989" warning. Pre-9989 readers may still honor
them, so the value is left intact for those consumers. - DMARC: unknown tags are now ignored with a warning instead of raising
InvalidDMARCTag, per RFC 9989 ("Unknown tags MUST be ignored"). - DMARC: the order constraint that
pmust immediately followvis now a
warning rather than a hard syntax error. RFC 9989 permits any tag ordering
afterv; older RFC 7489 readers may still expectpsecond. - DMARC: the
!sizesuffix onrua/rufURIs is now flagged as obsolete
syntax (RFC 9989 says reporters MUST ignore it). The warning still fires
because pre-9989 readers may still honor it. - DMARC: the RFC 9989 tree walk now continues all the way to single-label
parents (TLDs). PSD operators publish their policy at e.g._dmarc.gov
withpsd=y, and the previous "don't query TLDs" short-circuit prevented
PSD discovery (the main reason RFC 9989 added the tree walk). - DMARC: during the tree walk, parent queries no longer trigger the
apex-fallback "wrong-location" check. A strayv=DMARC1at a parent
domain's apex used to spuriously abort the walk with
DMARCRecordInWrongLocation; that check is now only applied to the
originally requested name.
5.15.5
Fixes
- BIMI: stop masking
MultipleBIMIRecords,UnrelatedTXTRecordFoundAtBIMI,
andBIMIRecordInWrongLocationbehindBIMIRecordNotFound. The
apex-fallback handler also had a missingraise, so a record placed at
the apex (instead of the_bimiselector) was silently treated as
"not found" (#246). - BIMI: extend the grammar to accept the canonical
lps=value
format — a comma-separated list of local-part selectors per
draft-bimi-14 § 4.3.14.
The grammar previously only accepted values matching one of
bimi1, an HTTPS URL,personal, orbrand, so the canonical
comma-separated form raisedBIMISyntaxError. Also fix the parser
to write the parsed selector list back to the tag value (#246). - DMARC: stop masking
DMARCRecordInWrongLocationbehind
DMARCRecordNotFoundin_query_dmarc_record's apex-fallback path (#248). - SMTP: the cache-write paths in
test_tlsandtest_starttlsused
if cache:, which is falsy for an emptyExpiringDict. The first
cache entry was silently dropped, so subsequent SMTP probes kept
hitting the network (#244). - SPF:
parse_spf_record's redirect handler usedexcept DNSException as error:, shadowing the function-levelerroraccumulator. Python
deletes the name on except-block exit, so the trailingif error:
raisedUnboundLocalError(#247).
Changes
- Test suite reorganized from a single
tests.pyinto per-module
files undertests/. Network-dependent tests are paired with
fully-mocked counterparts; CI runs the mocked branch, local runs
the real-network branch. - Project test coverage raised from 67% to 96%; every module is now
at ≥ 90%. Coverage and test results are uploaded to Codecov on
each CI run.
5.15.4
Fixes
- Stop reporting
jurisdictionOfIncorporationStateOrProvinceName/
jurisdictionOfIncorporationLocalityNameas required when both are absent.
Per VMC Requirements §7.1.4.2.2(j), entities incorporated at the country
level (e.g.bbc.co.uk) MUST include onlyjurisdictionCountryName—
state/province and locality MUST NOT be present. The same correction
applies to the parallelstatute*fields for Government Marks
(§7.1.4.2.2(s)). The locality-level form is still validated:
jurisdictionOfIncorporationLocalityName(andstatuteLocalityName)
now imply that their state/province counterpart must also be present
(#242). - Deduplicate the bidirectional "either A or B" error so the
localityName/stateOrProvinceNamerule is reported once instead
of twice when both fields are absent.
Changes
- Warn when a BIMI SVG
<title>element is a generator/template
placeholder (e.g.bimi-svg-tiny-12-ps,Untitled). The title should
be a descriptive name for the brand or mark. - Document that BIMI mark certificates are validated against the
AuthIndicators Working Group's
Minimum Security Requirements for Issuance of Mark Certificates.
5.15.3
Fixes
- Display a warning is a BIMI image is provided without a VMC/CMC
5.15.2
Changes
- Cap the per-query UDP timeout at
min(1.0, timeout)for single-nameserver
configurations as well as multi-nameserver ones. Previously, when only one
nameserver was configured (or the system default list had a single entry),
resolver.timeoutandresolver.lifetimewere both set to the full
timeoutbudget, which collapses dnspython's UDP retry loop to a single
attempt — a single dropped UDP datagram then consumed the whole lifetime
and raisedLifetimeTimeout, whiledig(which defaults to+tries=3)
would mask the same blip by retrying. dnspython now retries UDP within
the lifetime window (~2 attempts at the default 2s budget), matching
dig's behavior in spirit and eliminating spurious single-NS timeouts
on paths with occasional packet loss.
5.15.1
Changes
- Revert the 5.15.0 default of auto-configuring public nameservers
(1.1.1.1,8.8.8.8) when nonameserversare passed. Whennameservers
isNone,checkdmarcnow falls back to the system-configured resolvers
again (/etc/resolv.confon Linux/macOS, the OS resolver on Windows),
matching the 5.14.x and earlier behavior. The auto-configured default would
surprise users running split-horizon or internal DNS and broke workflows
that previously relied on the system resolver. - Rename the exposed constant from
DEFAULT_DNS_NAMESERVERSto
RECOMMENDED_DNS_NAMESERVERSto reflect that it is an opt-in
recommendation, not an automatic default. It is re-exported from the
package root ascheckdmarc.RECOMMENDED_DNS_NAMESERVERSso callers can
easily opt in with
check_domains(..., nameservers=RECOMMENDED_DNS_NAMESERVERS). - Documentation now calls out mixing public resolvers from different
providers as a best practice for public-internet checks.