- Do not replace subdomains with base domains in SPF
a
mechanisms (Close #151)
- Raise a warning instead of a
UnicodeDecodeError
when encountering aTXT
record that is not decodable (Close issue #124) - Alow CIDR notation on SPF
a
mechanisms (Close #128) - Fix documentation for
check_smtp_tls_reporting
(Close #133) - Fix SVG verification checks for BIMI SVG files (Close #150)
- Allow BIMI Mark Verification Certificates to be used for subdomains (Close #151)
- Fix crash on CSV output for a domain with BIMI errors (Close issue #153)
- Fix generation of API documentation
- Add an error message to
["bimi"]["image]["error"]
instead of["bimi"]["warnings"]
when a BIMI image download fails - Add an error message to
["bimi"]["certificate]["error"]
instead of["bimi"]["warnings"]
when a BIMI certificate download fails
- Move SVG validation errors from
["bimi"]["warnings"]
to["bimi"]["image"]["validation_errors"]
(#150)
- Fix VMC validation errors not appearing (close #149)
- Fix crash when trying to output to CSV format
- Fix BIMI lookup for subdomains that do not have a BIMI record (fixes #148)
- Add additional checks for
tiny-ps
SVG requirements
- BIMI images and mark certificates
- Better error handling
- Simplified warning messages
sha256_hash
output fields renamed tosha256
- Account for float SVG sizes
- Properly parse a certificate SAN
- Certificate warnings fire properly
- Make the
expires
timestamp more readable
checkdmarc
will now validate Verified Mark Certificates (VMCs) and Common Mark Certificates (CMC),
snd will verify that SHA256 hash of the logo embedded in the certificate matches the SHA256 hash
logo at the URL at the BIMI l
tag.
Additionally, SVG and certificate metadata is now included in the checkdmarc.bimi.parse_bimi_record()
API and
JSON CLI output.
- Add a warning when BIMI records do not provide a mark certificate
- Ude the correct dependency (
xmltodict
, notxml2dict
)
- Fix SVG base profile detection
- Automatically check for a BIMI DNS record at the
default
selector when using the CLI - Fix parsing of BIMI record tags when they are separated by a
;
without a space - Validate the file at the URL in the BIMI
l
tag value- Must be an SVG file
- The SVG version must be
1.2
- The SVG base profile must be
tiny-ps
- The SVG dimensions must be square
- The file size must not exceed 32 KB
Note: This does not currently include certificate validation.
- SPF record validation fixes (PR #147)
- Accept mechanisms with domains that start with
all
(Fixes #145) - Ignore multiple trailing mechanisms and random text with spaces
- Accept mechanisms with domains that start with
- Support
redirect
in SPF (PR #144)
- Fix TLS/STARTTLS check (Fixes issue #138)
- Consider
tls: true
ifstarttls: true
- Handle records not existing if ignoring unrelated records (PR #131 fixes #130)
- Query the base domain if a DMARC record is not found at the subdomain (PR #132)
- Do not accept
include=
in the SPF record (PR #134 fixes issue #134) - Fix DNSSEC cache (PR #136 Fixes issue #137)
- Fixed checking whether there is some text after
all
SPF directive (PR #139)
- Ignore
UnicodeDecodeError
exceptions when querying forTXT
records (close #124)
- Check DNSSEC on MX hostnames
- USE DNSSEC when requesting
DNSKEY
records
- Do not require an
RRSIG
answer when querying forDNSKEY
records- On Windows and macOS, querying for a
DNSKEY
record onproton.ch
will return aRRSET
andRRSIG
. However, running the same query on Debian-based Linux will only return aRRSET
- On Windows and macOS, querying for a
- Pass in
nameservers
andtimeout
when runningget_dnskey
recursively
- Revert change introduced in 5.2.4 that caused the DNSSEC test to always return
True
- Test for multiple RDATA types when testing DNSSEC
- Properly cache DNSSEC test results
- Properly cache DNSKEY answers
- Workaround DNSSEC testing bug in Debian for some domains
- On Windows, querying for a
DNSKEY
record onproton.ch
will return aRRSET
andRRSIG
. However, running the same query on Linux will only return aRRSET
, but will return aRRSET
andRRSIG
if another record type is requested, such asA
- On Windows, querying for a
- Fix exception handling for
query_mta_sts_record
- Fix exception handling for
query_smtp_tls_reporting_record
- Better exception handling for
query_mta_sts_record
- More verbose debug logging
- Fix bug where TLSA records would not be checked in some cases
- Improved debug logging
- Check for TLSA records
- Add support for parsing SMTP TLS Reporting (RFC8460) DNS records
- Fix DNSSEC test
- Add missing
import dns.dnssec
- Always use the actual subdomain or domain provided (close #114)
- Add missing
- Include MTA-STS and BIMI results in CSV output
- Renamed
include_dmarc_tag_descriptions
parameter incheckdmarc.check_domains()
toinclude_tag_descriptions
- Added the
include_tag_descriptions
parameter tocheckdmarc.bimi.check_bimi()
- Ignore encoding value when checking the
Content-Type
header during the MTA-STS policy download - Added the exception class
MTASTSPolicyDownloadError
- Update documentation
- Major refactoring: Change from a single module to a package of modules, with each checked standard as its own package
- Add support for MTA-STS RFC 8461
- Add support for BIMI
- Specify a BIMI selector using the
--bimi-selector
/-b
option
- Specify a BIMI selector using the
- Various bug fixes
- Fix SPF query error and warning messages
- More clear
fo
tag warning (PR #106) - Do not raise a
DMAECRecordNotFound
exception when theMultipleDMARCRecordsException
is raised (PR #108) - Add support for null MX records - RFC 7505 (PR #109)
- Make DMARC retorting URI error messages more clear (PR #104)
- Fix compatibility with Python 3.8
SPFRecordNotFound
exception now includes adomain
argument (PR #103)- The DMARC missing authorization error message now includes the full expected DNS record
- Lots of code cleanup
- Added missing docstrings
get_base_domain()
will return the input string instead ofNone
if it can't parse a domain- Always use the base domain when testing DNSSEC
- Fix DNSSEC test
- Do not treat
include
mechanisms with macros as domains (Close issue #81) - Add
DMARCRecordStartsWithWhitespace
exception (PR #97) - Properly parse DMARC and BIMI records for domains that do not have an identified base domain (PR #98)
- Add
ignore_unrelated_records
argument toquery_dmarc_record()
(Slight modification of PR #99 - Close issue #91) - Mark syntax error positions (Slight modification of PR #100)
- Break up code into smaller methods (PR #93)
- Replace publicsuffix2 with publicsuffixlist (PR #92)
- Maintain the original character case of the DMARC record
- Always treat tag names as lowercase
- Always treat the DMARC
v
tag value as if it was uppercase - Always treat the DMARC
p
, andfo
tag values as if they were lowercase - Always treat URI schemes as lowercase, but maintain the case of the address
- Remove inaccurate
testInvalidDMARCfo
test
- Ignore case and whitespace when parsing DMARC and BIMI key=value pairs (Closes #75)
- Handle missing
PTR
records more gracefully (Closes #64) - Redundant DMARC
fo
tag values now result in a warning instead of a syntax error (Closes #71)
- Detect non-trivial loops (PR #88)
- Raise a
SPFSyntaxError
exception when an IP address and IP version do not match (PR #87) - Fix raising the
DMARCRecordNotFound
exception when a DMARC record does not exist (PR #86 closes issue #72) - Add void lookup limit (PR #85)
- Add Support for User Defined DNS Resolver Object (PR #83)
- Fix tarball build (#78)
- Fix CSV output
- Always parse RUA and RUF fields, even if other parts of the record are invalid (PR #74)
- Convert documentation to markdown
- Migrate build from setuptools to hatch
- Migrate automated testing from Travis CI to GitHub Actions
- Pass in
nameserver
andtimeout
parameters when callingget_reverse_dns()
(Actually close issue #59)
- Use the system's DNS resolvers by default
- Make DMARC report destination errors warnings instead of fatal errors (Closes issue #54)
- Honor nameserver and DNS timeout settings when querying for PTR records (Closes issue #59)
- Separate
TLS
andSTARTTLS
checks (Closes issue #56) - Fix false positive SPF redirect loop error (Closes issue #55)
- Require the p tag to immediately follow the v tag (Closes issue #57)
- Loosen IP address checks (PR # 53)
- Include
nameservers
in call tocheck_wildcard_dmarc_report_authorization
(PR #51) - Fix
ipv4
validation and addipv6
validation (PR #52) - Fix
User-Agent
string
- Fix
publicsuffix2
minimum version
- Fix Python 3.4 support
- Fix warning introduced in newer versions of
publicsuffix2
(closes issue #46) - Set minimum dependency requirements (closes issue #47)
- Fix typo in Office 365 MX record verification warning
- Add test for DNSSEC (closes issue #44)
- Ignore SPF record content after the
all
mechanism (closes issue #45) - Use UDP instead of TCP for DNS queries
- Reduce default DNS timeout from
6.0
seconds to2.0
seconds - Require
dnspython>=1.16.0
- Make SPF mechanisms and modifiers case-insensitive, in compliance with RFC 7208, sections 4.6.1 and 12 (#42)
- Raise a warning instead of an error when an MX hostname does not exist
- Raise a specific warning when an Office 365 MX domain validation record is detected
- Fix typo in DMARC authorization record warning (#38)
- Add support for validating wildcard DMARC report authorization records
- Support reserved TLDs in
get_base_domain()
(#39)
- Still check STARTTLS when reverse DNS lookup fails
- Disable STARTTLS/TLS checks when running on Windows to avoid
timeout_decorator
Windows incompatibility
- Better DNS exception handling
- Show errors instead of warnings when checking NS and MX records for non-existent domains
- Fix TLS/STARTTLS failure output
- Add warning if MX hosts are missing A or AAAA records
- Timeout SMTP TLS check after 5 seconds
- Debug output fixes
- Fix
--skip-tls
option - Replace
publicsuffix
withpublicsuffix2
- Fix
tls
andstarttls
CSV fields
- Test for SSL/TLS over port 465 if
STARTTLS
is not supported - Fix display of SSL/TLS errors
- Improve
STARTTLS
test
- Add option to CLI and API to skip STARTTLS testing
- Fix CSV output
- Fix debug logging
- Documentation fixes
- Refactor API and CLI
- Save
public_suffix_list.dat
to a temporary folder instead of the current working directory (CWD) - Emulate a browser HTTP
User-Agent
string when downloadingpublic_suffix_list.dat
- Add requirement
requests
- Change list separator within CSV fields from
,
to|
- Fix returning
STARTTLS
results upon exception
- Fix debug output
- Fix crash when checking domains with more than 10 MX records
- Cache
STARTTLS
failures - Add warning for duplicate hostnames in MX records
- Increase cache sizes
- Disable check for SPF records on MX hostnames - too noisy
- Catch
BlockingIOError
exception when testingSTARTTLS
- Add warning if PTR records for MX do not match the hostname's A/AAAA records
- Use output path file extension to set output format
- Use substrings for matching approved 'MX' and 'NS' records, rather than the full string
- Add
get_nameservers()
to the API - Add
NS
record lookup to output asns
- Add
--ns
option to CLI for listing approved nameservers
- Fix
--mx
CLI option
- Bugfix: STARTTLS caching
- Add MX warnings for parked domains
- Increase default DNS timeout from 2.0 seconds to 6.0 seconds
- Bugfix: CSV format
-f csv
for starttls header - Bugfix: Always properly close an SMTP connection
- Cache DNS and STARTTLS results in memory
- Use python3 in docs Makefile for Sphinx build
- Add
--debug
option - Make warning about proper SPF records for MX hosts an only show with
--debug
(Very noisy - Many hosts use DKIM without SPF to DMARC align bouncebacks)
- Bugfix: Always raise warning when SPF type DNS records are found
- Add check for proper SPF records for MX hosts
- Add check for STARTTLS
- Add option
-p/--parked
to check for best practices for parked domains - Add option
--mx
to provide a list of approved MX hostnames - Add
query_bimi_record()
to the API
- Fix parsing of TXT records over multiple lines (PR #36)
- Fix false-negative SPF validation of
ipv4
mechanisms with a single digit CIDR notation (PR #35)
- Fix false-negative SPF and DMARC validations
- Fix report destination verification
- Reduce default DNS timeout to 2.0 seconds
- Always use
\n
as the newline when generating output
- Properly concatenate multi-line TXT records
- Fix exception generation
- Refactored
DMARCError
andSPFError
exceptions to support adding data to the results (seanthegeek) - Close #18 - include
dns_lookups
inspf
results when number of SPF lookups are exceeded (seanthegeek) - Added timeout rounding to the Exception classes (malvidin)
- Refactored
DMARCError
andSPFError
exceptions to support adding data to the results (seanthegeek) - Close #18 - include
dns_lookups
inspf
results when number of SPF lookups are exceeded (seanthegeek) - Added timeout rounding to the Exception classes (malvidin)
- PEP 8 fixes
- Close #32 - Raise
SPFSyntaxError
when an invalid value is encountered for anip4
SPF mechanism - Close #33 - Add
python3 setup.py sdist
tobuild.sh
, and publish source distribution to PyPI
- Close #31 - Public Suffix List checked before list is available (malvidin)
- Decrease precision of DNS timeout (malvidin)
- Close #15 - Add sorting of A/AAAA records (malvidin)
- Add basic logging of runtime warnings (seanthegeek)
- Use Cloudflare's DNS resolvers by default
- Fix DMARC record location when subdomain is missing record
- Fix typos
- prefix
.
topublic_suffix_list.dat
- Fix typo in help
- Treat
pct
< 1 as invalid - Issue warning if there are more than two URIs for
rua
orruf
(separate count)
- Allow whitespace in DMARC values
- Actually fix DMARC
rua
andruf
CSV output
- Fix DMARC
rua
andruf
CSV output
- More exception handling fixes
- Fix DNS report destination verification error message
- Yet more DNS error handling
- More DNS
SERVFAIL
handling - More descriptive warning if DMARC
pct
< 100
- Handle DNS failures better
- Properly handle a useless DMARC record at the root of a domain
- Use correct example output in documentation
- Replace
accenture.com
output from debugging withfbi.gov
output - That's what I get for copy/pasting without reading :(
- Replace
- Raise an error when multiple
spf1
TXT
records are found
- Fix external DMARC report destination validation
- Update sample output in documentation
- Improve DMARC regex for edge cases
- Use Organizational Domain when checking DMARC URI destination
- Simplify exceptions
- Refactor dome method return values
- Add more unit tests
- Many documentation improvements and fixes
- PEP 8 compliant
- Check for misplaced DMARC records
- Update documentation
- Write unit tests and deploy CI (#12)
- Fix a bug that causes all DMARC lookups to fail
- First unit tests
- Fix SPF loop false-positives (#20)
- Use the base/organizational domain name when validating DMARC report destinations (#21)
- Add more granular exception classes in preparation for unit tests in 2.0.0
- Fix SPF regex regression
- Make DMARC
p
required, as specified in the RFC - Improve SPF regex and syntax error details
- Update
mailto
regex to accept single char mailbox names - Clarify DMARC tag and value descriptions
- Pass in nameservers and timeout when querying for
MX
records
- Fix sample command in documentation
- Raise an error instead of a warning when DMARC reporting URIs cannot receive reports about a domain
- Fix JSON output structure or included/redirected SPF records
- Fix typo in error message
- Detect Requests for
_dmarc
records that actually return SPF records - Correct documentation for
get_mx_hosts(domain, nameservers=None, timeout=6.0)
- Update output sample in documentation
- Change in JSON structure - Separate DMARC URI scheme and address to better support potential future URI schemes
- Change in JSON structure - Parse
mailto:
DMARC URIs, including size limits (if any) - More granular Exception classes
- Updated documentation
- Refactor and simplify DNS queries
- Properly look for DMARC records in base/organizational domains
- Properly count DNS lookups for SPF
- Update sample output in the documentation
- Remove faulty
ruf
tag warning
- Fix another show-stopping bug :(
- Fix show-stopping bug
- Turn
rua
andruf
tag values in to lists - Fix conversion of lists to strings in CSVs
- Raise
DMARCWarning
if the value of thepct
tag is less than 100 - Raise
DMARCError
if the value of thepct
tag is less than 0 or greater than 100
- Proper parsing of DMARC tags
fo
andrf
- Improve regex for the DMARC
mailto:
URI __version__
only needs to be updated in one place now- Fix docstring formatting
- Properly handle DMARC records that are made up of multiple strings
- Allow input file to be a CSV where the domain is the first field; all other fields are ignored
- Better handling of invalid DMARC values
- Rearrange the order of the CSV fields to that the longest entries are to the right
- Documentation improvements
- Fix external DMARC report destination validation
- Count each MX resource record once
- Clarify warning messages
- Pass timeout in for SPF queries when outputting in CSV format
- Raise default timeout to 6 seconds
- Only include hostname in mx SPF mechanism results
- Show MX preference in output
- Sort MX records by preference
- Mark package as supporting Python 3 only (Python 2 was never actually supported because Pyleri does not support it)
- Removed all previous versions from PyPI so someone doesn't think Python 2 was supported when it never was
- Change default timeout to 4 seconds
- Use ; to delimit warnings and MX records in CSV format
- Add MX warnings to output
- Fix DMARC warning CSV output
- Separate SPF MX record limit from SPF DNS mechanism limit
- Fix DMARC CSV output
- Fix more SPF exceptions
- Fix SPF exceptions
- Fix DMARC record discovery
- Rename mx domain key to hostname
- Add example output to README
- Fix PyPI readme display
- Fix typos
- Add MX records to output
- Fix
--timeout/-t
option - Add
--wait/-w
option
- Make SPF loops errors instead of warnings
- Check SPF records for
redirect
loops
- Ignore blank lines/domains in input
- Include the DMARC organizational domain in JSON and CSV output
- Change CSV field order for readability
- Make JSON output order consistent
- Resolve SPF
redirect
- Put include results in a JSON list
- Count
exists
SPF mechanisms in the overall SPF query limit - Make
a
SPF mechanisms count as one lookup instead of twocheckdmarc
actually makes two queries pera
mechanism, one forA
records, and one forAAAA
records. However, RFC 7208, Section 1.6.4 only mentions counting the mechanisms that use lookups (i.e.mx
,a
,exists
,include
, andredirect
), and including eachMX
record returned in the overall count, (since those in turn will need to be resolved). This alignscheckdmarc
with 3rd party SPF validators at MxToolbox and DMARC Analyzer
- Removed from PyPI due to bugs
- Subdomains inherit the DMARC record of the organizational domain
- Removed from PyPI due to bugs
- Validate existence of MX amd A/AAAA records
- Add a
--timeout/-t
option - Improve DMARC record syntax validation
- Check for SPF include loops
- Validate
rua
andruf
URIs - Fail SPF validation if query limit reached RFC 7208, Section 1.6.4
- First release on PyPi (since removed due to bugs)
- Initial commit to GitHub