diff --git a/.security/CRYPTO_NOTICE.adoc b/.security/CRYPTO_NOTICE.adoc new file mode 100644 index 0000000..2a49345 --- /dev/null +++ b/.security/CRYPTO_NOTICE.adoc @@ -0,0 +1,24 @@ +== Cryptographic Hash Policy + +=== Current Status + +This repo uses MD5 or SHA1 in some files. + +=== Policy + +* *NEVER* use MD5/SHA1 for security purposes (passwords, signatures, +integrity) +* MD5/SHA1 is acceptable ONLY for: +** Cache key generation (non-security) +** Legacy format compatibility +** File checksums (when not security-critical) + +=== Migration + +Replace security-critical usage: - `+md5(password)+` → `+argon2+` or +`+bcrypt+` - `+sha1(signature)+` → `+sha256+` or `+sha384+` - +`+md5(integrity)+` → `+sha256+` + +=== Files to Review + +Check files flagged by CI for MD5/SHA1 usage. diff --git a/.security/CRYPTO_NOTICE.md b/.security/CRYPTO_NOTICE.md deleted file mode 100644 index ed724d6..0000000 --- a/.security/CRYPTO_NOTICE.md +++ /dev/null @@ -1,24 +0,0 @@ - -# Cryptographic Hash Policy - -## Current Status -This repo uses MD5 or SHA1 in some files. - -## Policy -- **NEVER** use MD5/SHA1 for security purposes (passwords, signatures, integrity) -- MD5/SHA1 is acceptable ONLY for: - - Cache key generation (non-security) - - Legacy format compatibility - - File checksums (when not security-critical) - -## Migration -Replace security-critical usage: -- `md5(password)` → `argon2` or `bcrypt` -- `sha1(signature)` → `sha256` or `sha384` -- `md5(integrity)` → `sha256` - -## Files to Review -Check files flagged by CI for MD5/SHA1 usage. diff --git a/ARCHITECTURE.adoc b/ARCHITECTURE.adoc new file mode 100644 index 0000000..1c0a7a6 --- /dev/null +++ b/ARCHITECTURE.adoc @@ -0,0 +1,48 @@ +== Architecture + +=== Overview + +This repository follows a modular, maintainable architecture designed +for clarity, scalability, and long-term sustainability. + +=== Directory Structure + +.... +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +.... + +=== Design Principles + +* *Separation of Concerns*: Each module has a single responsibility +* *Testability*: Code is written to be easily testable +* *Documentation*: All public APIs are documented +* *Configuration*: Environment-specific settings are externalized + +=== Dependencies + +* External dependencies are minimized and clearly declared +* Version pinning is used for reproducibility + +=== Security Considerations + +* Sensitive data is never committed to the repository +* Secrets are managed through environment variables or secure vaults +* Regular dependency audits are performed + +=== Maintainability + +* Code follows consistent style guidelines +* Pull requests require review and CI checks +* Issues and discussions are tracked transparently + +''''' + +_Last updated: 2026-07-18_ diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index 607e3d8..0000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -1,47 +0,0 @@ -# Architecture - -## Overview - -This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. - -## Directory Structure - -``` -. -├── src/ # Source code -├── tests/ # Test suites -├── docs/ # Documentation -├── scripts/ # Utility scripts -├── config/ # Configuration files -├── LICENSE # License file -├── LICENSES/ # Full license texts -└── README.adoc # Project documentation -``` - -## Design Principles - -- **Separation of Concerns**: Each module has a single responsibility -- **Testability**: Code is written to be easily testable -- **Documentation**: All public APIs are documented -- **Configuration**: Environment-specific settings are externalized - -## Dependencies - -- External dependencies are minimized and clearly declared -- Version pinning is used for reproducibility - -## Security Considerations - -- Sensitive data is never committed to the repository -- Secrets are managed through environment variables or secure vaults -- Regular dependency audits are performed - -## Maintainability - -- Code follows consistent style guidelines -- Pull requests require review and CI checks -- Issues and discussions are tracked transparently - ---- - -*Last updated: 2026-07-18* diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 7269efd..40b62fb 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -1,612 +1,699 @@ -// SPDX-License-Identifier: CC-BY-SA-4.0 -// Copyright (c) Jonathan D.A. Jewell -= Changelog - - +== Changelog All notable changes to this project will be documented in this file. -== Unreleased - -=== Other - -- Added Russian translation. - -== 6.2.0 (2025-09-18) - -=== Enhancements - -- Authentication-Results header: Sort DKIM, SPF and DMARC results from ARH, even when not replacing the add-ons verification (#534). -- Authentication-Results header: All results are now accepted if reading of non RFC compliant ARHs is enabled (#547). - This improves support for invalid headers by Outlook. -- Detect outgoing messages in Locals Folder (#114). -- Provide preview of the colors for the From header highlighting (#439). - -=== Fixes - -- Libunbound resolver: Make unloading of libraries more robust in case the wrong one got loaded. -- Fix alignment of warning symbol on MacOS (#531). - -=== Other +=== Unreleased -- Updated default rules and favicons. +==== Other -== 6.1.0 (2025-06-01) +* Added Russian translation. -=== Enhancements +=== 6.2.0 (2025-09-18) -- Added an option to display the DKIM header when an e-mail with a DKIM signature, SPF or DMARC result is viewed (#462). -- Authentication-Results header: Invalid headers by Outlook are now accepted if reading of non RFC compliant ARHs is enabled (#423). -- The DKIM selector is now displayed in the DKIM button pop-up (#510). -- The options page of the add-on can now be opened from the DKIM button pop-up. +==== Enhancements -=== Fixes +* Authentication-Results header: Sort DKIM, SPF and DMARC results from +ARH, even when not replacing the add-ons verification (#534). +* Authentication-Results header: All results are now accepted if reading +of non RFC compliant ARHs is enabled (#547). This improves support for +invalid headers by Outlook. +* Detect outgoing messages in Locals Folder (#114). +* Provide preview of the colors for the From header highlighting (#439). -- Fixed parsing of a From header that contains MIME encoded non-ASCII characters when reading a saved result (#529). +==== Fixes -=== Other +* Libunbound resolver: Make unloading of libraries more robust in case +the wrong one got loaded. +* Fix alignment of warning symbol on MacOS (#531). -- Updated default rules and favicons. +==== Other -== 6.0.1 (2025-03-10) +* Updated default rules and favicons. -=== Fixes +=== 6.1.0 (2025-06-01) -- Fixed the JavaScript DNS library resolver (#501). +==== Enhancements -== 6.0.0 (2025-03-09) +* Added an option to display the DKIM header when an e-mail with a DKIM +signature, SPF or DMARC result is viewed (#462). +* Authentication-Results header: Invalid headers by Outlook are now +accepted if reading of non RFC compliant ARHs is enabled (#423). +* The DKIM selector is now displayed in the DKIM button pop-up (#510). +* The options page of the add-on can now be opened from the DKIM button +pop-up. -=== Breaking Changes +==== Fixes -- Now requires at least Thunderbird 128. -- Remove migration of options from versions before 4.0.0. +* Fixed parsing of a From header that contains MIME encoded non-ASCII +characters when reading a saved result (#529). -=== Enhancements +==== Other -- Fixed incompatibility with Thunderbird 136 (#494). -- Authentication-Results header: Improve default behavior about which headers are trusted. - Instead of trusting all it now depends on the newest ARH (#465). +* Updated default rules and favicons. -=== Fixes +=== 6.0.1 (2025-03-10) -- If the DKIM result fails because of the check of the sign rules the detailed view now still shows the details of the DKIM signature (#495). -- Authentication-Results header: If only an AUID is included again heuristically extract the SDID from it. -- Fixed setting default values for boolean preferences with policies on macOS via a `.plist` (#499). +==== Fixes -=== Other +* Fixed the JavaScript DNS library resolver (#501). -- Updated default rules and favicons (#497). +=== 6.0.0 (2025-03-09) -== 5.6.0 (2025-02-17) +==== Breaking Changes -=== Enhancements +* Now requires at least Thunderbird 128. +* Remove migration of options from versions before 4.0.0. -- Support setting default values for preferences with managed storage (#268). -- An explicit alignment between the AUID and the From address is no longer enforced. -- Authentication-Results header: If replacing the add-ons verification, the SDID alignment is checked against the From address (#452). -- Authentication-Results header: If replacing the add-ons verification, the signature and hash algorithm are now shown in the details view. +==== Enhancements -=== Fixes +* Fixed incompatibility with Thunderbird 136 (#494). +* Authentication-Results header: Improve default behavior about which +headers are trusted. Instead of trusting all it now depends on the +newest ARH (#465). -- Encoding errors in the RSA/Ed25519 key or signature now result in an invalid DKIM signature instead of an internal error. +==== Fixes -== 5.5.0 (2025-01-11) +* If the DKIM result fails because of the check of the sign rules the +detailed view now still shows the details of the DKIM signature (#495). +* Authentication-Results header: If only an AUID is included again +heuristically extract the SDID from it. +* Fixed setting default values for boolean preferences with policies on +macOS via a `+.plist+` (#499). -=== Enhancements +==== Other -- Show all DKIM signatures with additional details in the DKIM button pop-up (#160, #299). -- Improved table views for sign rules and DKIM keys (#248, #305). - E.g. it is now possible to delete multiple entries at once. -- Allow multiple `*` globs in the From pattern of sign rules (#471, #472). -- Changed the default color scheme for highlighting of the From header to better work with dark mode (#460). -- Changed the header icon to now have the same colors as Thunderbirds own icons. +* Updated default rules and favicons (#497). -=== Fixes +=== 5.6.0 (2025-02-17) -- Fixed potential parsing error when extracting the received time from the last Received header (#455). -- When parsing now support comments inside comments up to a recursion of 3 (#466). +==== Enhancements -=== Other +* Support setting default values for preferences with managed storage +(#268). +* An explicit alignment between the AUID and the From address is no +longer enforced. +* Authentication-Results header: If replacing the add-ons verification, +the SDID alignment is checked against the From address (#452). +* Authentication-Results header: If replacing the add-ons verification, +the signature and hash algorithm are now shown in the details view. -- Added Vietnamese translation (by vtvinh24) (#485). -- Updated default rules and favicons (#440, #443, #444, #447, #457, #461). -- Updated Brazilian Portuguese translations (#450). -- Updated French translations (#459). +==== Fixes -== 5.4.0 (2023-11-16) +* Encoding errors in the RSA/Ed25519 key or signature now result in an +invalid DKIM signature instead of an internal error. -=== Enhancements +=== 5.5.0 (2025-01-11) -- Added support for using the Brand Indicators for Message Identification (BIMI) - when showing favicons is enabled (#242). -- Added the possibility to show a favicon for a specific From address or AUID (#107). -- Don't save DKIM results that contain a temporary error. -- Show proper error message if parsing of a message failed. -- Show DKIM label if "Hide labels column" is enabled. -- Authentication-Results header: if reading of non RFC compliant ARHs is enabled, - a `:` in a property value is now allowed without the value being in a quoted-string. -- Authentication-Results header: don't restrict result keyword for unknown methods. +==== Enhancements -=== Fixes +* Show all DKIM signatures with additional details in the DKIM button +pop-up (#160, #299). +* Improved table views for sign rules and DKIM keys (#248, #305). E.g. +it is now possible to delete multiple entries at once. +* Allow multiple `+*+` globs in the From pattern of sign rules (#471, +#472). +* Changed the default color scheme for highlighting of the From header +to better work with dark mode (#460). +* Changed the header icon to now have the same colors as Thunderbirds +own icons. -- Fixed signature verification if a signed header contains a non ASCII character. -- Fixed support for Thunderbird Conversations add-on in Thunderbird 115 and later (#395). -- Libunbound resolver: Fixed using a relative path to the profile directory in Thunderbird 115 and later (#385). +==== Fixes -=== Other +* Fixed potential parsing error when extracting the received time from +the last Received header (#455). +* When parsing now support comments inside comments up to a recursion of +3 (#466). -- Added Polish translation (by dMbski) (#392). -- Options navigation is now flat. -- Updated default rules and favicons (#387, #393, #399). +==== Other -== 5.3.1 (2023-06-08) +* Added Vietnamese translation (by vtvinh24) (#485). +* Updated default rules and favicons (#440, #443, #444, #447, #457, +#461). +* Updated Brazilian Portuguese translations (#450). +* Updated French translations (#459). -=== Fixes +=== 5.4.0 (2023-11-16) -- Fixed incompatibility with Thunderbird 115 if no preferences exist, e.g. a new installation. +==== Enhancements -== 5.3.0 (2023-06-06) +* Added support for using the Brand Indicators for Message +Identification (BIMI) when showing favicons is enabled (#242). +* Added the possibility to show a favicon for a specific From address or +AUID (#107). +* Don’t save DKIM results that contain a temporary error. +* Show proper error message if parsing of a message failed. +* Show DKIM label if "`Hide labels column`" is enabled. +* Authentication-Results header: if reading of non RFC compliant ARHs is +enabled, a `+:+` in a property value is now allowed without the value +being in a quoted-string. +* Authentication-Results header: don’t restrict result keyword for +unknown methods. -=== Enhancements +==== Fixes -- Fixed incompatibility with Thunderbird 115 (#364). -- Support the offline mode of Thunderbird. - No DNS queries are done if Thunderbird is in the offline mode (#129). -- JSDNS: Support IPv6 addresses (#363) -- JSDNS: Improved how the addon behaves if all DNS servers were not reachable. - By default the addon will now try them again instead of getting in a state there all further DNS queries will fail (#269). - If getting DNS servers from OS configuration is enabled, they will now also be read from the OS again (#90). +* Fixed signature verification if a signed header contains a non ASCII +character. +* Fixed support for Thunderbird Conversations add-on in Thunderbird 115 +and later (#395). +* Libunbound resolver: Fixed using a relative path to the profile +directory in Thunderbird 115 and later (#385). -=== Other +==== Other -- Updated default rules and favicons (#365). +* Added Polish translation (by dMbski) (#392). +* Options navigation is now flat. +* Updated default rules and favicons (#387, #393, #399). -== 5.2.0 (2023-04-02) +=== 5.3.1 (2023-06-08) -=== Enhancements +==== Fixes -- Extract the received time from the last Received header and use it as the verification time (#336). -- Fixed incompatibility with Thunderbird 113 (#352). +* Fixed incompatibility with Thunderbird 115 if no preferences exist, +e.g. a new installation. -=== Fixes +=== 5.3.0 (2023-06-06) -- Fixed extension not working for attached or external messages (#216). - Requires Thunderbird 106 or later. -- Fixed empty tags being treated as ill-formed. This e.g. fixes revoked DKIM keys. -- Fixed tooltip for From header in Thunderbird 102 or newer (#311). -- Fixed missing body resulting in internal error (#347). +==== Enhancements -=== Other +* Fixed incompatibility with Thunderbird 115 (#364). +* Support the offline mode of Thunderbird. No DNS queries are done if +Thunderbird is in the offline mode (#129). +* JSDNS: Support IPv6 addresses (#363) +* JSDNS: Improved how the addon behaves if all DNS servers were not +reachable. By default the addon will now try them again instead of +getting in a state there all further DNS queries will fail (#269). If +getting DNS servers from OS configuration is enabled, they will now also +be read from the OS again (#90). -- Added Traditional Chinese translation (by NightFeather) (#335). -- Updated default rules and favicons (#334, #337). +==== Other -== 5.1.1 (2022-08-15) +* Updated default rules and favicons (#365). -=== Fixes +=== 5.2.0 (2023-04-02) -- Invalid Reply-To header is now ignored instead of resulting in internal error (#321). +==== Enhancements -=== Other +* Extract the received time from the last Received header and use it as +the verification time (#336). +* Fixed incompatibility with Thunderbird 113 (#352). -- Updated default rules and favicons (#323, #326, #327). +==== Fixes -== 5.1.0 (2022-07-17) +* Fixed extension not working for attached or external messages (#216). +Requires Thunderbird 106 or later. +* Fixed empty tags being treated as ill-formed. This e.g. fixes revoked +DKIM keys. +* Fixed tooltip for From header in Thunderbird 102 or newer (#311). +* Fixed missing body resulting in internal error (#347). -=== Enhancements +==== Other -- Added heuristic to detect maliciously added unsigned headers (#102). -- Configurable option to warn about unsigned headers that are recommended to be signed (#102, #277). -- Improved theming of header icon in Thunderbird 102. -- Authentication-Results header: Prefer to show failure results that include a reason and are related to the sending domain (#247). +* Added Traditional Chinese translation (by NightFeather) (#335). +* Updated default rules and favicons (#334, #337). -=== Fixes +=== 5.1.1 (2022-08-15) -- Fixed error when opening messages in a new window in Thunderbird 102. +==== Fixes -=== Other +* Invalid Reply-To header is now ignored instead of resulting in +internal error (#321). -- updated default rules and favicons +==== Other -== 5.0.0 (2022-06-12) +* Updated default rules and favicons (#323, #326, #327). -=== Breaking Changes +=== 5.1.0 (2022-07-17) -- now requires at least Thunderbird 91 +==== Enhancements -=== Enhancements +* Added heuristic to detect maliciously added unsigned headers (#102). +* Configurable option to warn about unsigned headers that are +recommended to be signed (#102, #277). +* Improved theming of header icon in Thunderbird 102. +* Authentication-Results header: Prefer to show failure results that +include a reason and are related to the sending domain (#247). -- fixed incompatibility with Thunderbird 102 (#306, #312) -- Added support for signing algorithm Ed25519-SHA256 (RFC 8463) (#142) -- JSDNS: fixed incompatibility with Thunderbird 101 (#303) -- Authentication-Results header: check sign algorithm used for DKIM (RFC 8601) (#219) +==== Fixes -=== Fixes +* Fixed error when opening messages in a new window in Thunderbird 102. -- fixed multiple from addresses being treated as ill-formed (#304) +==== Other -=== Other +* updated default rules and favicons -- updated default rules and favicons +=== 5.0.0 (2022-06-12) -== 4.1.1 (2022-02-22) +==== Breaking Changes -- fixed blank line in header if email does not contain DKIM signature (Thunderbird 97) (#293) -- fixed some dialog windows being to small (#296) -- fixed header spanning multiple lines possibly being cropped at the bottom -- fixed wrapping of header in Thunderbird 99 -- added Ukrainian translation (by lexxai) (#297) +* now requires at least Thunderbird 91 -== 4.1.0 (2022-02-06) +==== Enhancements -- fixed incompatibility with Thunderbird 96 (#279) -- Re-added support for Thunderbird Conversations add-on (#203) -- show proper error message on ill-formed from (#238) -- ignore ill-formed List-Id (#262) and fix parsing of List-Id -- Authentication-Results header: fixed sorting of DKIM results in regards to list id -- fixed options styling for Thunderbird 91 -- added Brazilian Portuguese translation (by David BrazSan) (#283) -- Add ability to export/import sign rules (#220) -- Fix layout issues in table views (Sign rules / stored keys) (#248) -- updated default rules and favicons (#263, #266, #274, #281, #284) +* fixed incompatibility with Thunderbird 102 (#306, #312) +* Added support for signing algorithm Ed25519-SHA256 (RFC 8463) (#142) +* JSDNS: fixed incompatibility with Thunderbird 101 (#303) +* Authentication-Results header: check sign algorithm used for DKIM (RFC +8601) (#219) -== 4.0.0 (2021-04-18) +==== Fixes -- now requires at least Thunderbird 78 -- fixed incompatibility with Thunderbird 78 (#199) -- removed option to show DKIM result in the statusbarpanel -- Authentication-Results header: fixed parsing of version -- Authentication-Results header: fixed parsing of quoted SDID and AUID (#229, #234) -- Authentication-Results header: fixed missing reason on fail resulting in error (#232) -- libunbound resolver: Don't provide a default path (#199) -- libunbound resolver: Improve options description (#199) -- added about page in options -- added incomplete Swedish translation (by Phoenix) -- added Spanish translation (by Peter O Brien) (#239) -- updated default rules and favicons (#208, #209, #210) +* fixed multiple from addresses being treated as ill-formed (#304) -== 3.1.0 (2020-01-22) +==== Other -- includes changes from 2.2.0 -- fix default rules and favicons (#197) +* updated default rules and favicons -== 2.2.0 (2020-01-19) +=== 4.1.1 (2022-02-22) -- Authentication-Results header: fix relaxed parsing option and trailing ";" -- exposed option on how to treat weak keys. Default is now ignore (was warning since 2.1.0) (#174) -- fixed default text color for unsigned e-mail in dark theme if highlighting of From header is enabled (#181) -- libunbound resolver: add ability to explicitly load dependencies of libunbound (#170, #179) -- updated default rules and favicons (#165, #168, #169, #180) +* fixed blank line in header if email does not contain DKIM signature +(Thunderbird 97) (#293) +* fixed some dialog windows being to small (#296) +* fixed header spanning multiple lines possibly being cropped at the +bottom +* fixed wrapping of header in Thunderbird 99 +* added Ukrainian translation (by lexxai) (#297) -== 3.0.1 (2019-09-22) +=== 4.1.0 (2022-02-06) -- fixed incompatibility with Thunderbird 70 (#167) -- fixed DKIM status not visible when a message is opened in a new window (#172) -- fixed incompatibility with CompactHeader add-on (#177) -- JSDNS: fixed proxy support (#173) +* fixed incompatibility with Thunderbird 96 (#279) +* Re-added support for Thunderbird Conversations add-on (#203) +* show proper error message on ill-formed from (#238) +* ignore ill-formed List-Id (#262) and fix parsing of List-Id +* Authentication-Results header: fixed sorting of DKIM results in +regards to list id +* fixed options styling for Thunderbird 91 +* added Brazilian Portuguese translation (by David BrazSan) (#283) +* Add ability to export/import sign rules (#220) +* Fix layout issues in table views (Sign rules / stored keys) (#248) +* updated default rules and favicons (#263, #266, #274, #281, #284) -== 3.0.0 (2019-09-01) +=== 4.0.0 (2021-04-18) -- now requires at least Thunderbird 68 -- fixed incompatibility with Thunderbird 68/69 (#115) -- libunbound resolver: remove old root trust anchor (key tag 19036) +* now requires at least Thunderbird 78 +* fixed incompatibility with Thunderbird 78 (#199) +* removed option to show DKIM result in the statusbarpanel +* Authentication-Results header: fixed parsing of version +* Authentication-Results header: fixed parsing of quoted SDID and AUID +(#229, #234) +* Authentication-Results header: fixed missing reason on fail resulting +in error (#232) +* libunbound resolver: Don’t provide a default path (#199) +* libunbound resolver: Improve options description (#199) +* added about page in options +* added incomplete Swedish translation (by Phoenix) +* added Spanish translation (by Peter O Brien) (#239) +* updated default rules and favicons (#208, #209, #210) -== 2.1.0 (2019-08-29) +=== 3.1.0 (2020-01-22) -- Cryptographic Algorithm and Key Usage Update (RFC 8301, #141) -- updated default rules and favicons (#140, #145, #152, #157, #159) -- added Hungarian translation (by Óvári) (#164) +* includes changes from 2.2.0 +* fix default rules and favicons (#197) -== 2.0.1 (2019-01-18) +=== 2.2.0 (2020-01-19) -- fixed signature verification in case the RSA key has an odd key length (#112) -- fixed DMARC heuristic (#125) -- fixed "*" not being recognized as valid Service Type in DKIM Keys (#134) -- changed update DKIM key button to now update the keys of all DKIM signatures in the e-mail -- Authentication-Results header: fixed mixed case results specified by older SPF specs resulting in a parsing error (#135) -- JSDNS: fixed a problem getting the default DNS servers on Windows (#116, #120) -- JSDNS: reduced default DNS server timeout from 10 to 5 seconds -- updated included third-party libraries -- updated default rules and favicons +* Authentication-Results header: fix relaxed parsing option and trailing +"`;`" +* exposed option on how to treat weak keys. Default is now ignore (was +warning since 2.1.0) (#174) +* fixed default text color for unsigned e-mail in dark theme if +highlighting of From header is enabled (#181) +* libunbound resolver: add ability to explicitly load dependencies of +libunbound (#170, #179) +* updated default rules and favicons (#165, #168, #169, #180) -== 2.0.0 (2018-04-19) +=== 3.0.1 (2019-09-22) -- now requires at least Thunderbird 52 -- added toolbar button and menuitem for sign rules -- added option to try to read non RFC compliant Authentication-Results header -- fixed incompatibility with Thunderbird 57/59/60 -- fixed favicons not being shown if the CardBook add-on is installed -- fixed "Add must be signed exception" button being disabled if wrong signer is only a warning -- updated default rules and favicons +* fixed incompatibility with Thunderbird 70 (#167) +* fixed DKIM status not visible when a message is opened in a new window +(#172) +* fixed incompatibility with CompactHeader add-on (#177) +* JSDNS: fixed proxy support (#173) -== 1.7.0 (2017-07-22) +=== 3.0.0 (2019-09-01) -- libunbound resolver: added ability to specify multiple trust anchors -- libunbound resolver: added new root trust anchor (key tag 20326) -- updated default rules and favicons +* now requires at least Thunderbird 68 +* fixed incompatibility with Thunderbird 68/69 (#115) +* libunbound resolver: remove old root trust anchor (key tag 19036) -== 1.6.5 (2017-05-14) +=== 2.1.0 (2019-08-29) -- added Japanese translation (by SAKURAI Kenichi) -- updated default rules +* Cryptographic Algorithm and Key Usage Update (RFC 8301, #141) +* updated default rules and favicons (#140, #145, #152, #157, #159) +* added Hungarian translation (by Óvári) (#164) -== 1.6.4 (2017-02-09) +=== 2.0.1 (2019-01-18) -- fixed saving of result with DNSSEC lock enabled -- fixed incompatibility with Thunderbird 52 and libunbound -- updated default rules and favicons +* fixed signature verification in case the RSA key has an odd key length +(#112) +* fixed DMARC heuristic (#125) +* fixed “*” not being recognized as valid Service Type in DKIM Keys +(#134) +* changed update DKIM key button to now update the keys of all DKIM +signatures in the e-mail +* Authentication-Results header: fixed mixed case results specified by +older SPF specs resulting in a parsing error (#135) +* JSDNS: fixed a problem getting the default DNS servers on Windows +(#116, #120) +* JSDNS: reduced default DNS server timeout from 10 to 5 seconds +* updated included third-party libraries +* updated default rules and favicons + +=== 2.0.0 (2018-04-19) + +* now requires at least Thunderbird 52 +* added toolbar button and menuitem for sign rules +* added option to try to read non RFC compliant Authentication-Results +header +* fixed incompatibility with Thunderbird 57/59/60 +* fixed favicons not being shown if the CardBook add-on is installed +* fixed "`Add must be signed exception`" button being disabled if wrong +signer is only a warning +* updated default rules and favicons + +=== 1.7.0 (2017-07-22) + +* libunbound resolver: added ability to specify multiple trust anchors +* libunbound resolver: added new root trust anchor (key tag 20326) +* updated default rules and favicons + +=== 1.6.5 (2017-05-14) + +* added Japanese translation (by SAKURAI Kenichi) +* updated default rules -== 1.6.3 (2016-11-20) +=== 1.6.4 (2017-02-09) -- fixed incompatibility with Thunderbird 52 -- updated default rules and favicons +* fixed saving of result with DNSSEC lock enabled +* fixed incompatibility with Thunderbird 52 and libunbound +* updated default rules and favicons -== 1.6.2 (2016-10-24) +=== 1.6.3 (2016-11-20) -- fixed incompatibility with Silvermel/Charamel -- fixed Problem with copied header fields -- updated default rules and favicons +* fixed incompatibility with Thunderbird 52 +* updated default rules and favicons -== 1.6.1 (2016-09-26) +=== 1.6.2 (2016-10-24) -- fixed problem with old Thunderbird versions and sign rules +* fixed incompatibility with Silvermel/Charamel +* fixed Problem with copied header fields +* updated default rules and favicons -== 1.6.0 (2016-09-25) +=== 1.6.1 (2016-09-26) -- added option to indicate successful DNSSEC validation with a lock (enabled by default) -- added option to show the favicon of some known signing domains (enabled by default) -- added option to show the ARH result alongside the add-ons, instead of replacing it -- JSDNS: differentiate between a server error and an non existing DKIM key -- sign rules: ignore must be signed for outgoing messages -- sign rules: updated default rules -- fixed updating a DKIM key or marking it as secure via the "Other Actions" button +* fixed problem with old Thunderbird versions and sign rules -== 1.5.1 (2016-06-11) +=== 1.6.0 (2016-09-25) -- fixed verification for external messages -- sign rules: updated default rules +* added option to indicate successful DNSSEC validation with a lock +(enabled by default) +* added option to show the favicon of some known signing domains +(enabled by default) +* added option to show the ARH result alongside the add-ons, instead of +replacing it +* JSDNS: differentiate between a server error and an non existing DKIM +key +* sign rules: ignore must be signed for outgoing messages +* sign rules: updated default rules +* fixed updating a DKIM key or marking it as secure via the "`Other +Actions`" button -== 1.5.0 (2016-05-17) +=== 1.5.1 (2016-06-11) -- added option to enable/disable DKIM verification for each account -- JavaScript DNS library: added support to use a proxy -- sign rules: updated default rules (added firefox.com) -- DKIM key: empty, but existing DNS record is now treated as a missing key instead as an ill-formed one -- fixed installing problem if extensions.getAddons.cache.enabled is set to false () +* fixed verification for external messages +* sign rules: updated default rules -== 1.4.1 (2016-02-13) +=== 1.5.0 (2016-05-17) -- fixed incompatibility with Thunderbird 46 -- Authentication-Results header: fixed trusting all authentication servers +* added option to enable/disable DKIM verification for each account +* JavaScript DNS library: added support to use a proxy +* sign rules: updated default rules (added firefox.com) +* DKIM key: empty, but existing DNS record is now treated as a missing +key instead as an ill-formed one +* fixed installing problem if extensions.getAddons.cache.enabled is set +to false (https://bugzilla.mozilla.org/show_bug.cgi?id=1187725) -== 1.4.0 (2016-02-08) +=== 1.4.1 (2016-02-13) -- simplified shown error reasons and added advanced option for detailed reasons -- Authentication-Results header: reading of the ARH can now be set for each account -- Authentication-Results header: added option to only trust specific authentication servers -- Authentication-Results header: continue verification if there is no DKIM result in the ARH header -- Authentication-Results header: allow also unknown property types to be compliant with RFC 7601 -- Authentication-Results header: fixed bug if ARH header exists, but no message authentication was done -- JavaScript DNS library: no longer get the DNS servers from deactivated interfaces under windows -- libunbound resolver: no longer blocks the UI of Thunderbird -- libunbound resolver: changing preferences no longer needs a restart +* fixed incompatibility with Thunderbird 46 +* Authentication-Results header: fixed trusting all authentication +servers -== 1.3.6 (2015-09-13) +=== 1.4.0 (2016-02-08) -- fixed error in parsing of Authentication-Results header -- added additional debugging calls +* simplified shown error reasons and added advanced option for detailed +reasons +* Authentication-Results header: reading of the ARH can now be set for +each account +* Authentication-Results header: added option to only trust specific +authentication servers +* Authentication-Results header: continue verification if there is no +DKIM result in the ARH header +* Authentication-Results header: allow also unknown property types to be +compliant with RFC 7601 +* Authentication-Results header: fixed bug if ARH header exists, but no +message authentication was done +* JavaScript DNS library: no longer get the DNS servers from deactivated +interfaces under windows +* libunbound resolver: no longer blocks the UI of Thunderbird +* libunbound resolver: changing preferences no longer needs a restart -== 1.3.5 (2015-07-11) +=== 1.3.6 (2015-09-13) -- fixed bug if a header field body started with a ":" +* fixed error in parsing of Authentication-Results header +* added additional debugging calls -== 1.3.4 (2015-06-21) +=== 1.3.5 (2015-07-11) -- added compatibility for Thunderbird 40 +* fixed bug if a header field body started with a "`:`" -== 1.3.3 (2015-03-21) +=== 1.3.4 (2015-06-21) -- fixed bug in the sorting of the results of multiple DKIM signatures +* added compatibility for Thunderbird 40 -== 1.3.2 (2015-02-21) +=== 1.3.3 (2015-03-21) -- updated default sign rules +* fixed bug in the sorting of the results of multiple DKIM signatures -== 1.3.1 (2014-12-10) +=== 1.3.2 (2015-02-21) -- DNS errors in DMARC heuristic are now ignored (previously this resulted in an internal error) -- fixed error resulting in incompatibility with Thunderbird 36 +* updated default sign rules -== 1.3.0 (2014-12-08) +=== 1.3.1 (2014-12-10) -- added option to treat ill-formed selector tag as as error/warning/nothing (default warning; previous behavior was error) -- added support for multiple signatures -- added option to read Authentication-Results header -- added French translation (by Christophe CHAUVET) +* DNS errors in DMARC heuristic are now ignored (previously this +resulted in an internal error) +* fixed error resulting in incompatibility with Thunderbird 36 -- fixed problem with JavaScript DNS Resolver and long DKIM keys, resulting in error "Key couldn't be decoded" -- fixed incompatibility with compact headers add-on +=== 1.3.0 (2014-12-08) -== 1.2.2 (2014-08-16) +* added option to treat ill-formed selector tag as as +error/warning/nothing (default warning; previous behavior was error) +* added support for multiple signatures +* added option to read Authentication-Results header +* added French translation (by Christophe CHAUVET) +* fixed problem with JavaScript DNS Resolver and long DKIM keys, +resulting in error "`Key couldn’t be decoded`" +* fixed incompatibility with compact headers add-on -- added Chinese (Simplified) translation (by YFdyh000) -- fixed the showing of a wrong error reason in some cases of a bad RSA signature +=== 1.2.2 (2014-08-16) -== 1.2.1 (2014-06-30) +* added Chinese (Simplified) translation (by YFdyh000) +* fixed the showing of a wrong error reason in some cases of a bad RSA +signature -- fixed an issue in formated strings ("%S" was not replaced) +=== 1.2.1 (2014-06-30) -== 1.2.0 (2014-06-25) +* fixed an issue in formated strings ("`%S`" was not replaced) -- added option for sign rules to allow also subdomains of the SDIDs (enabled by default) -- fixed comparison of domains (was case sensitive) -- updated default sign rules +=== 1.2.0 (2014-06-25) -== 1.1.2 (2014-05-08) +* added option for sign rules to allow also subdomains of the SDIDs +(enabled by default) +* fixed comparison of domains (was case sensitive) +* updated default sign rules -- fixed error if e-mail is from a domain on the public suffix list (like "googlecode.com") -- updated default sign rules +=== 1.1.2 (2014-05-08) -== 1.1.1 (2014-04-10) +* fixed error if e-mail is from a domain on the public suffix list (like +"`googlecode.com`") +* updated default sign rules -- fixed bug in use of libundboud (non existing domain was treated as server error; caused problems with DMARC) +=== 1.1.1 (2014-04-10) -== 1.1.0 (2014-04-07) +* fixed bug in use of libundboud (non existing domain was treated as +server error; caused problems with DMARC) -- added options for automatically added sign rules -- added option to use DMARC to heuristically determinate if an e-mail should be signed -- fixed sign rules being automatically added even if signRules are disabled -- fixed bug in getting DNS name server from OS under Linux/Mac (last line was not read) +=== 1.1.0 (2014-04-07) -== 1.0.5 (2014-01-14) +* added options for automatically added sign rules +* added option to use DMARC to heuristically determinate if an e-mail +should be signed +* fixed sign rules being automatically added even if signRules are +disabled +* fixed bug in getting DNS name server from OS under Linux/Mac (last +line was not read) -- added Italian translation (by Michele Locati) -- statusbarpanel and tooltip are now set to loading on reverify -- DKIM Keys and signers rules window can now be opened at the same time +=== 1.0.5 (2014-01-14) -== 1.0.4 (2013-12-20) +* added Italian translation (by Michele Locati) +* statusbarpanel and tooltip are now set to loading on reverify +* DKIM Keys and signers rules window can now be opened at the same time -- fixed bug in an error message of the JavaScript DNS library -- added advanced options for the JavaScript DNS library useful in case of bad network connection (not available through GUI) +=== 1.0.4 (2013-12-20) -== 1.0.3 (2013-12-12) +* fixed bug in an error message of the JavaScript DNS library +* added advanced options for the JavaScript DNS library useful in case +of bad network connection (not available through GUI) -- fixed bug in sign rules if from address contains capital letters -- fixed verification of unsigned e-mails which are marked as should be signed by sign rules +=== 1.0.3 (2013-12-12) -== 1.0.2 (2013-11-22) +* fixed bug in sign rules if from address contains capital letters +* fixed verification of unsigned e-mails which are marked as should be +signed by sign rules -- fixed internal error if sign rules are disabled +=== 1.0.2 (2013-11-22) -== 1.0.1 (2013-11-22) +* fixed internal error if sign rules are disabled -- fixed DKIM_SIGWARNING_FROM_NOT_IN_SDID +=== 1.0.1 (2013-11-22) -== 1.0.0 (2013-11-21) +* fixed DKIM_SIGWARNING_FROM_NOT_IN_SDID -- added signers rules -- added key storing -- added libunbound as second DNS resolver (supports DNSSEC) -- from tooltip now also works if Thunderbird's status bar is disabled +=== 1.0.0 (2013-11-21) -- fixed some patterns (A-z to A-Za-z, dkim_safe_char, qp_hdr_value) -- fixed pattern for note tag in DKIM key -- fixed bug in DKIM_SIGWARNING_FROM_NOT_IN_AUID -- validate tag list as specified in Section 3.2 of RFC 6376 -- now differentiation between missing and ill-formed tags -- added check that hash declared in DKIM-Signature is included in the hashs declared in the key record -- added check that the hash algorithm in the public key is the same as in the header +* added signers rules +* added key storing +* added libunbound as second DNS resolver (supports DNSSEC) +* from tooltip now also works if Thunderbird’s status bar is disabled +* fixed some patterns (A-z to A-Za-z, dkim_safe_char, qp_hdr_value) +* fixed pattern for note tag in DKIM key +* fixed bug in DKIM_SIGWARNING_FROM_NOT_IN_AUID +* validate tag list as specified in Section 3.2 of RFC 6376 +* now differentiation between missing and ill-formed tags +* added check that hash declared in DKIM-Signature is included in the +hashs declared in the key record +* added check that the hash algorithm in the public key is the same as +in the header -== 0.6.3 (2013-10-13) +=== 0.6.3 (2013-10-13) -- fixed bug for detection of configured DNS Servers in Windows - (if more then one DNS server was configured for an adapter) +* fixed bug for detection of configured DNS Servers in Windows (if more +then one DNS server was configured for an adapter) -== 0.6.2 (2013-10-13) +=== 0.6.2 (2013-10-13) -- fixed bug if "other actions" button of CompactHeader add-on toolbar is not included +* fixed bug if "`other actions`" button of CompactHeader add-on toolbar +is not included -== 0.6.1 (2013-10-12) +=== 0.6.1 (2013-10-12) -- better detection of configured DNS Servers in Windows +* better detection of configured DNS Servers in Windows -== 0.6.0 (2013-09-26) +=== 0.6.0 (2013-09-26) -- added option for displaying of header, status bar and tooltip for From header -- fixed false detection of DKIM_SIGERROR_DOMAIN_I -- made options height smaller -- fixed error in "simple" body canonicalization algorithm resulting in "Wrong body hash" -- fixed bug for mixed CRLF and LF EOLs in body (resulting in "Wrong body hash") -- fixed error if external message was viewed (but there is still a problem with IMAP attachments) -- fixed bug ("DKIM-Signature" header name was case sensitive) +* added option for displaying of header, status bar and tooltip for From +header +* fixed false detection of DKIM_SIGERROR_DOMAIN_I +* made options height smaller +* fixed error in "`simple`" body canonicalization algorithm resulting in +"`Wrong body hash`" +* fixed bug for mixed CRLF and LF EOLs in body (resulting in "`Wrong +body hash`") +* fixed error if external message was viewed (but there is still a +problem with IMAP attachments) +* fixed bug ("`DKIM-Signature`" header name was case sensitive) -== 0.5.1 (2013-09-20) +=== 0.5.1 (2013-09-20) -- added option to get DNS Servers from OS +* added option to get DNS Servers from OS -== 0.5.0 (2013-09-10) +=== 0.5.0 (2013-09-10) -- added support of multiple DNS servers -- added optional saving of the result -- DNS Server not reachable no longer treated as a PERMFAIL -- added TEMPFAIL +* added support of multiple DNS servers +* added optional saving of the result +* DNS Server not reachable no longer treated as a PERMFAIL +* added TEMPFAIL -== 0.4.4 (2013-08-02) +=== 0.4.4 (2013-08-02) -- changed how msgHdrViewOverlay.css is loaded +* changed how msgHdrViewOverlay.css is loaded -== 0.4.3 (2013-07-27) +=== 0.4.3 (2013-07-27) -- header highlighting now works with collapsed header from CompactHeader addon -- works now also if e-mail has LF line ending +* header highlighting now works with collapsed header from CompactHeader +addon +* works now also if e-mail has LF line ending -== 0.4.2 (2013-06-28) +=== 0.4.2 (2013-06-28) -- fixed alignment of warning-icon in mac (by Nils Maier) +* fixed alignment of warning-icon in mac (by Nils Maier) -== 0.4.1 (2013-06-28) +=== 0.4.1 (2013-06-28) -- DKIM-Signature header field name now in same style as the others (by Nils Maier) -- fixed bug if message needs to be downloaded from IMAP server -- added German translation (by ionum) -- fixed relaxed canonicalization of a body with only empty lines (by ionum) -- small displaying changes in options +* DKIM-Signature header field name now in same style as the others (by +Nils Maier) +* fixed bug if message needs to be downloaded from IMAP server +* added German translation (by ionum) +* fixed relaxed canonicalization of a body with only empty lines (by +ionum) +* small displaying changes in options -== 0.4.0 (2013-06-09) +=== 0.4.0 (2013-06-09) -- warnings are displayed -- added warning for - - Signature is expired - - Signature is in the future - - From is not in SDID - - From is not in AUID - - Signature key is small -- added option to treat testmode as warning, not as error -- added options for highlighting of From header -- added option to always show DKIM-Signature header field -- fixed relaxed body canonicalization for non trailing CRLF -- fixed parsing of Message canonicalization if only one algorithm is named -- added partial support of CNAME record type in DNS Library -- fix bug if nonexisting header field is signed -- fixed parsing of AUID +* warnings are displayed +* added warning for +** Signature is expired +** Signature is in the future +** From is not in SDID +** From is not in AUID +** Signature key is small +* added option to treat testmode as warning, not as error +* added options for highlighting of From header +* added option to always show DKIM-Signature header field +* fixed relaxed body canonicalization for non trailing CRLF +* fixed parsing of Message canonicalization if only one algorithm is +named +* added partial support of CNAME record type in DNS Library +* fix bug if nonexisting header field is signed +* fixed parsing of AUID -== 0.3.3 (2013-05-31) +=== 0.3.3 (2013-05-31) -- fixed issue with RSS feeds -- added debug info to rsasign-1.2.js +* fixed issue with RSS feeds +* added debug info to rsasign-1.2.js -== 0.3.2 (2013-05-30) +=== 0.3.2 (2013-05-30) -- fixed regex pattern for SDID, Selector and local_part +* fixed regex pattern for SDID, Selector and local_part -== 0.3.1 (2013-05-30) +=== 0.3.1 (2013-05-30) -- fixed problem with CompactHeader addon +* fixed problem with CompactHeader addon -== 0.3.0 (2013-05-29) +=== 0.3.0 (2013-05-29) -- options dialog added -- body length tag was checked before canonicalization -- fixed simple body canonicalization for empty body or no trailing CRLF -- DNS, RSA, ... helper scripts now in DKIM_Verifier namespace +* options dialog added +* body length tag was checked before canonicalization +* fixed simple body canonicalization for empty body or no trailing CRLF +* DNS, RSA, … helper scripts now in DKIM_Verifier namespace -== 0.2.2 (2013-05-22) +=== 0.2.2 (2013-05-22) -- fixed regex pattern for domain_name ("." was not escaped) +* fixed regex pattern for domain_name ("`.`" was not escaped) -== 0.2.1 (2013-05-22) +=== 0.2.1 (2013-05-22) -- query method was parsed wrong -- last header field was parsed wrong -- DNS exception now caught +* query method was parsed wrong +* last header field was parsed wrong +* DNS exception now caught -== 0.2 (2013-05-16) +=== 0.2 (2013-05-16) -- check that from header is signed now included -- key record flags are no longer ignored -- Multiple Instances of a header Field are now supported -- encoding issue for body hash fixed +* check that from header is signed now included +* key record flags are no longer ignored +* Multiple Instances of a header Field are now supported +* encoding issue for body hash fixed -== 0.1 (2013-05-13) +=== 0.1 (2013-05-13) -- Initial release +* Initial release diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 697502d..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,614 +0,0 @@ - -# Changelog - - - -All notable changes to this project will be documented in this file. - -## Unreleased - -### Other - -- Added Russian translation. - -## 6.2.0 (2025-09-18) - -### Enhancements - -- Authentication-Results header: Sort DKIM, SPF and DMARC results from ARH, even when not replacing the add-ons verification (#534). -- Authentication-Results header: All results are now accepted if reading of non RFC compliant ARHs is enabled (#547). - This improves support for invalid headers by Outlook. -- Detect outgoing messages in Locals Folder (#114). -- Provide preview of the colors for the From header highlighting (#439). - -### Fixes - -- Libunbound resolver: Make unloading of libraries more robust in case the wrong one got loaded. -- Fix alignment of warning symbol on MacOS (#531). - -### Other - -- Updated default rules and favicons. - -## 6.1.0 (2025-06-01) - -### Enhancements - -- Added an option to display the DKIM header when an e-mail with a DKIM signature, SPF or DMARC result is viewed (#462). -- Authentication-Results header: Invalid headers by Outlook are now accepted if reading of non RFC compliant ARHs is enabled (#423). -- The DKIM selector is now displayed in the DKIM button pop-up (#510). -- The options page of the add-on can now be opened from the DKIM button pop-up. - -### Fixes - -- Fixed parsing of a From header that contains MIME encoded non-ASCII characters when reading a saved result (#529). - -### Other - -- Updated default rules and favicons. - -## 6.0.1 (2025-03-10) - -### Fixes - -- Fixed the JavaScript DNS library resolver (#501). - -## 6.0.0 (2025-03-09) - -### Breaking Changes - -- Now requires at least Thunderbird 128. -- Remove migration of options from versions before 4.0.0. - -### Enhancements - -- Fixed incompatibility with Thunderbird 136 (#494). -- Authentication-Results header: Improve default behavior about which headers are trusted. - Instead of trusting all it now depends on the newest ARH (#465). - -### Fixes - -- If the DKIM result fails because of the check of the sign rules the detailed view now still shows the details of the DKIM signature (#495). -- Authentication-Results header: If only an AUID is included again heuristically extract the SDID from it. -- Fixed setting default values for boolean preferences with policies on macOS via a `.plist` (#499). - -### Other - -- Updated default rules and favicons (#497). - -## 5.6.0 (2025-02-17) - -### Enhancements - -- Support setting default values for preferences with managed storage (#268). -- An explicit alignment between the AUID and the From address is no longer enforced. -- Authentication-Results header: If replacing the add-ons verification, the SDID alignment is checked against the From address (#452). -- Authentication-Results header: If replacing the add-ons verification, the signature and hash algorithm are now shown in the details view. - -### Fixes - -- Encoding errors in the RSA/Ed25519 key or signature now result in an invalid DKIM signature instead of an internal error. - -## 5.5.0 (2025-01-11) - -### Enhancements - -- Show all DKIM signatures with additional details in the DKIM button pop-up (#160, #299). -- Improved table views for sign rules and DKIM keys (#248, #305). - E.g. it is now possible to delete multiple entries at once. -- Allow multiple `*` globs in the From pattern of sign rules (#471, #472). -- Changed the default color scheme for highlighting of the From header to better work with dark mode (#460). -- Changed the header icon to now have the same colors as Thunderbirds own icons. - -### Fixes - -- Fixed potential parsing error when extracting the received time from the last Received header (#455). -- When parsing now support comments inside comments up to a recursion of 3 (#466). - -### Other - -- Added Vietnamese translation (by vtvinh24) (#485). -- Updated default rules and favicons (#440, #443, #444, #447, #457, #461). -- Updated Brazilian Portuguese translations (#450). -- Updated French translations (#459). - -## 5.4.0 (2023-11-16) - -### Enhancements - -- Added support for using the Brand Indicators for Message Identification (BIMI) - when showing favicons is enabled (#242). -- Added the possibility to show a favicon for a specific From address or AUID (#107). -- Don't save DKIM results that contain a temporary error. -- Show proper error message if parsing of a message failed. -- Show DKIM label if "Hide labels column" is enabled. -- Authentication-Results header: if reading of non RFC compliant ARHs is enabled, - a `:` in a property value is now allowed without the value being in a quoted-string. -- Authentication-Results header: don't restrict result keyword for unknown methods. - -### Fixes - -- Fixed signature verification if a signed header contains a non ASCII character. -- Fixed support for Thunderbird Conversations add-on in Thunderbird 115 and later (#395). -- Libunbound resolver: Fixed using a relative path to the profile directory in Thunderbird 115 and later (#385). - -### Other - -- Added Polish translation (by dMbski) (#392). -- Options navigation is now flat. -- Updated default rules and favicons (#387, #393, #399). - -## 5.3.1 (2023-06-08) - -### Fixes - -- Fixed incompatibility with Thunderbird 115 if no preferences exist, e.g. a new installation. - -## 5.3.0 (2023-06-06) - -### Enhancements - -- Fixed incompatibility with Thunderbird 115 (#364). -- Support the offline mode of Thunderbird. - No DNS queries are done if Thunderbird is in the offline mode (#129). -- JSDNS: Support IPv6 addresses (#363) -- JSDNS: Improved how the addon behaves if all DNS servers were not reachable. - By default the addon will now try them again instead of getting in a state there all further DNS queries will fail (#269). - If getting DNS servers from OS configuration is enabled, they will now also be read from the OS again (#90). - -### Other - -- Updated default rules and favicons (#365). - -## 5.2.0 (2023-04-02) - -### Enhancements - -- Extract the received time from the last Received header and use it as the verification time (#336). -- Fixed incompatibility with Thunderbird 113 (#352). - -### Fixes - -- Fixed extension not working for attached or external messages (#216). - Requires Thunderbird 106 or later. -- Fixed empty tags being treated as ill-formed. This e.g. fixes revoked DKIM keys. -- Fixed tooltip for From header in Thunderbird 102 or newer (#311). -- Fixed missing body resulting in internal error (#347). - -### Other - -- Added Traditional Chinese translation (by NightFeather) (#335). -- Updated default rules and favicons (#334, #337). - -## 5.1.1 (2022-08-15) - -### Fixes - -- Invalid Reply-To header is now ignored instead of resulting in internal error (#321). - -### Other - -- Updated default rules and favicons (#323, #326, #327). - -## 5.1.0 (2022-07-17) - -### Enhancements - -- Added heuristic to detect maliciously added unsigned headers (#102). -- Configurable option to warn about unsigned headers that are recommended to be signed (#102, #277). -- Improved theming of header icon in Thunderbird 102. -- Authentication-Results header: Prefer to show failure results that include a reason and are related to the sending domain (#247). - -### Fixes - -- Fixed error when opening messages in a new window in Thunderbird 102. - -### Other - -- updated default rules and favicons - -## 5.0.0 (2022-06-12) - -### Breaking Changes - -- now requires at least Thunderbird 91 - -### Enhancements - -- fixed incompatibility with Thunderbird 102 (#306, #312) -- Added support for signing algorithm Ed25519-SHA256 (RFC 8463) (#142) -- JSDNS: fixed incompatibility with Thunderbird 101 (#303) -- Authentication-Results header: check sign algorithm used for DKIM (RFC 8601) (#219) - -### Fixes - -- fixed multiple from addresses being treated as ill-formed (#304) - -### Other - -- updated default rules and favicons - -## 4.1.1 (2022-02-22) - -- fixed blank line in header if email does not contain DKIM signature (Thunderbird 97) (#293) -- fixed some dialog windows being to small (#296) -- fixed header spanning multiple lines possibly being cropped at the bottom -- fixed wrapping of header in Thunderbird 99 -- added Ukrainian translation (by lexxai) (#297) - -## 4.1.0 (2022-02-06) - -- fixed incompatibility with Thunderbird 96 (#279) -- Re-added support for Thunderbird Conversations add-on (#203) -- show proper error message on ill-formed from (#238) -- ignore ill-formed List-Id (#262) and fix parsing of List-Id -- Authentication-Results header: fixed sorting of DKIM results in regards to list id -- fixed options styling for Thunderbird 91 -- added Brazilian Portuguese translation (by David BrazSan) (#283) -- Add ability to export/import sign rules (#220) -- Fix layout issues in table views (Sign rules / stored keys) (#248) -- updated default rules and favicons (#263, #266, #274, #281, #284) - -## 4.0.0 (2021-04-18) - -- now requires at least Thunderbird 78 -- fixed incompatibility with Thunderbird 78 (#199) -- removed option to show DKIM result in the statusbarpanel -- Authentication-Results header: fixed parsing of version -- Authentication-Results header: fixed parsing of quoted SDID and AUID (#229, #234) -- Authentication-Results header: fixed missing reason on fail resulting in error (#232) -- libunbound resolver: Don't provide a default path (#199) -- libunbound resolver: Improve options description (#199) -- added about page in options -- added incomplete Swedish translation (by Phoenix) -- added Spanish translation (by Peter O Brien) (#239) -- updated default rules and favicons (#208, #209, #210) - -## 3.1.0 (2020-01-22) - -- includes changes from 2.2.0 -- fix default rules and favicons (#197) - -## 2.2.0 (2020-01-19) - -- Authentication-Results header: fix relaxed parsing option and trailing ";" -- exposed option on how to treat weak keys. Default is now ignore (was warning since 2.1.0) (#174) -- fixed default text color for unsigned e-mail in dark theme if highlighting of From header is enabled (#181) -- libunbound resolver: add ability to explicitly load dependencies of libunbound (#170, #179) -- updated default rules and favicons (#165, #168, #169, #180) - -## 3.0.1 (2019-09-22) - -- fixed incompatibility with Thunderbird 70 (#167) -- fixed DKIM status not visible when a message is opened in a new window (#172) -- fixed incompatibility with CompactHeader add-on (#177) -- JSDNS: fixed proxy support (#173) - -## 3.0.0 (2019-09-01) - -- now requires at least Thunderbird 68 -- fixed incompatibility with Thunderbird 68/69 (#115) -- libunbound resolver: remove old root trust anchor (key tag 19036) - -## 2.1.0 (2019-08-29) - -- Cryptographic Algorithm and Key Usage Update (RFC 8301, #141) -- updated default rules and favicons (#140, #145, #152, #157, #159) -- added Hungarian translation (by Óvári) (#164) - -## 2.0.1 (2019-01-18) - -- fixed signature verification in case the RSA key has an odd key length (#112) -- fixed DMARC heuristic (#125) -- fixed "*" not being recognized as valid Service Type in DKIM Keys (#134) -- changed update DKIM key button to now update the keys of all DKIM signatures in the e-mail -- Authentication-Results header: fixed mixed case results specified by older SPF specs resulting in a parsing error (#135) -- JSDNS: fixed a problem getting the default DNS servers on Windows (#116, #120) -- JSDNS: reduced default DNS server timeout from 10 to 5 seconds -- updated included third-party libraries -- updated default rules and favicons - -## 2.0.0 (2018-04-19) - -- now requires at least Thunderbird 52 -- added toolbar button and menuitem for sign rules -- added option to try to read non RFC compliant Authentication-Results header -- fixed incompatibility with Thunderbird 57/59/60 -- fixed favicons not being shown if the CardBook add-on is installed -- fixed "Add must be signed exception" button being disabled if wrong signer is only a warning -- updated default rules and favicons - -## 1.7.0 (2017-07-22) - -- libunbound resolver: added ability to specify multiple trust anchors -- libunbound resolver: added new root trust anchor (key tag 20326) -- updated default rules and favicons - -## 1.6.5 (2017-05-14) - -- added Japanese translation (by SAKURAI Kenichi) -- updated default rules - -## 1.6.4 (2017-02-09) - -- fixed saving of result with DNSSEC lock enabled -- fixed incompatibility with Thunderbird 52 and libunbound -- updated default rules and favicons - -## 1.6.3 (2016-11-20) - -- fixed incompatibility with Thunderbird 52 -- updated default rules and favicons - -## 1.6.2 (2016-10-24) - -- fixed incompatibility with Silvermel/Charamel -- fixed Problem with copied header fields -- updated default rules and favicons - -## 1.6.1 (2016-09-26) - -- fixed problem with old Thunderbird versions and sign rules - -## 1.6.0 (2016-09-25) - -- added option to indicate successful DNSSEC validation with a lock (enabled by default) -- added option to show the favicon of some known signing domains (enabled by default) -- added option to show the ARH result alongside the add-ons, instead of replacing it -- JSDNS: differentiate between a server error and an non existing DKIM key -- sign rules: ignore must be signed for outgoing messages -- sign rules: updated default rules -- fixed updating a DKIM key or marking it as secure via the "Other Actions" button - -## 1.5.1 (2016-06-11) - -- fixed verification for external messages -- sign rules: updated default rules - -## 1.5.0 (2016-05-17) - -- added option to enable/disable DKIM verification for each account -- JavaScript DNS library: added support to use a proxy -- sign rules: updated default rules (added firefox.com) -- DKIM key: empty, but existing DNS record is now treated as a missing key instead as an ill-formed one -- fixed installing problem if extensions.getAddons.cache.enabled is set to false () - -## 1.4.1 (2016-02-13) - -- fixed incompatibility with Thunderbird 46 -- Authentication-Results header: fixed trusting all authentication servers - -## 1.4.0 (2016-02-08) - -- simplified shown error reasons and added advanced option for detailed reasons -- Authentication-Results header: reading of the ARH can now be set for each account -- Authentication-Results header: added option to only trust specific authentication servers -- Authentication-Results header: continue verification if there is no DKIM result in the ARH header -- Authentication-Results header: allow also unknown property types to be compliant with RFC 7601 -- Authentication-Results header: fixed bug if ARH header exists, but no message authentication was done -- JavaScript DNS library: no longer get the DNS servers from deactivated interfaces under windows -- libunbound resolver: no longer blocks the UI of Thunderbird -- libunbound resolver: changing preferences no longer needs a restart - -## 1.3.6 (2015-09-13) - -- fixed error in parsing of Authentication-Results header -- added additional debugging calls - -## 1.3.5 (2015-07-11) - -- fixed bug if a header field body started with a ":" - -## 1.3.4 (2015-06-21) - -- added compatibility for Thunderbird 40 - -## 1.3.3 (2015-03-21) - -- fixed bug in the sorting of the results of multiple DKIM signatures - -## 1.3.2 (2015-02-21) - -- updated default sign rules - -## 1.3.1 (2014-12-10) - -- DNS errors in DMARC heuristic are now ignored (previously this resulted in an internal error) -- fixed error resulting in incompatibility with Thunderbird 36 - -## 1.3.0 (2014-12-08) - -- added option to treat ill-formed selector tag as as error/warning/nothing (default warning; previous behavior was error) -- added support for multiple signatures -- added option to read Authentication-Results header -- added French translation (by Christophe CHAUVET) - -- fixed problem with JavaScript DNS Resolver and long DKIM keys, resulting in error "Key couldn't be decoded" -- fixed incompatibility with compact headers add-on - -## 1.2.2 (2014-08-16) - -- added Chinese (Simplified) translation (by YFdyh000) -- fixed the showing of a wrong error reason in some cases of a bad RSA signature - -## 1.2.1 (2014-06-30) - -- fixed an issue in formated strings ("%S" was not replaced) - -## 1.2.0 (2014-06-25) - -- added option for sign rules to allow also subdomains of the SDIDs (enabled by default) -- fixed comparison of domains (was case sensitive) -- updated default sign rules - -## 1.1.2 (2014-05-08) - -- fixed error if e-mail is from a domain on the public suffix list (like "googlecode.com") -- updated default sign rules - -## 1.1.1 (2014-04-10) - -- fixed bug in use of libundboud (non existing domain was treated as server error; caused problems with DMARC) - -## 1.1.0 (2014-04-07) - -- added options for automatically added sign rules -- added option to use DMARC to heuristically determinate if an e-mail should be signed -- fixed sign rules being automatically added even if signRules are disabled -- fixed bug in getting DNS name server from OS under Linux/Mac (last line was not read) - -## 1.0.5 (2014-01-14) - -- added Italian translation (by Michele Locati) -- statusbarpanel and tooltip are now set to loading on reverify -- DKIM Keys and signers rules window can now be opened at the same time - -## 1.0.4 (2013-12-20) - -- fixed bug in an error message of the JavaScript DNS library -- added advanced options for the JavaScript DNS library useful in case of bad network connection (not available through GUI) - -## 1.0.3 (2013-12-12) - -- fixed bug in sign rules if from address contains capital letters -- fixed verification of unsigned e-mails which are marked as should be signed by sign rules - -## 1.0.2 (2013-11-22) - -- fixed internal error if sign rules are disabled - -## 1.0.1 (2013-11-22) - -- fixed DKIM_SIGWARNING_FROM_NOT_IN_SDID - -## 1.0.0 (2013-11-21) - -- added signers rules -- added key storing -- added libunbound as second DNS resolver (supports DNSSEC) -- from tooltip now also works if Thunderbird's status bar is disabled - -- fixed some patterns (A-z to A-Za-z, dkim_safe_char, qp_hdr_value) -- fixed pattern for note tag in DKIM key -- fixed bug in DKIM_SIGWARNING_FROM_NOT_IN_AUID -- validate tag list as specified in Section 3.2 of RFC 6376 -- now differentiation between missing and ill-formed tags -- added check that hash declared in DKIM-Signature is included in the hashs declared in the key record -- added check that the hash algorithm in the public key is the same as in the header - -## 0.6.3 (2013-10-13) - -- fixed bug for detection of configured DNS Servers in Windows - (if more then one DNS server was configured for an adapter) - -## 0.6.2 (2013-10-13) - -- fixed bug if "other actions" button of CompactHeader add-on toolbar is not included - -## 0.6.1 (2013-10-12) - -- better detection of configured DNS Servers in Windows - -## 0.6.0 (2013-09-26) - -- added option for displaying of header, status bar and tooltip for From header -- fixed false detection of DKIM_SIGERROR_DOMAIN_I -- made options height smaller -- fixed error in "simple" body canonicalization algorithm resulting in "Wrong body hash" -- fixed bug for mixed CRLF and LF EOLs in body (resulting in "Wrong body hash") -- fixed error if external message was viewed (but there is still a problem with IMAP attachments) -- fixed bug ("DKIM-Signature" header name was case sensitive) - -## 0.5.1 (2013-09-20) - -- added option to get DNS Servers from OS - -## 0.5.0 (2013-09-10) - -- added support of multiple DNS servers -- added optional saving of the result -- DNS Server not reachable no longer treated as a PERMFAIL -- added TEMPFAIL - -## 0.4.4 (2013-08-02) - -- changed how msgHdrViewOverlay.css is loaded - -## 0.4.3 (2013-07-27) - -- header highlighting now works with collapsed header from CompactHeader addon -- works now also if e-mail has LF line ending - -## 0.4.2 (2013-06-28) - -- fixed alignment of warning-icon in mac (by Nils Maier) - -## 0.4.1 (2013-06-28) - -- DKIM-Signature header field name now in same style as the others (by Nils Maier) -- fixed bug if message needs to be downloaded from IMAP server -- added German translation (by ionum) -- fixed relaxed canonicalization of a body with only empty lines (by ionum) -- small displaying changes in options - -## 0.4.0 (2013-06-09) - -- warnings are displayed -- added warning for - - Signature is expired - - Signature is in the future - - From is not in SDID - - From is not in AUID - - Signature key is small -- added option to treat testmode as warning, not as error -- added options for highlighting of From header -- added option to always show DKIM-Signature header field -- fixed relaxed body canonicalization for non trailing CRLF -- fixed parsing of Message canonicalization if only one algorithm is named -- added partial support of CNAME record type in DNS Library -- fix bug if nonexisting header field is signed -- fixed parsing of AUID - -## 0.3.3 (2013-05-31) - -- fixed issue with RSS feeds -- added debug info to rsasign-1.2.js - -## 0.3.2 (2013-05-30) - -- fixed regex pattern for SDID, Selector and local_part - -## 0.3.1 (2013-05-30) - -- fixed problem with CompactHeader addon - -## 0.3.0 (2013-05-29) - -- options dialog added -- body length tag was checked before canonicalization -- fixed simple body canonicalization for empty body or no trailing CRLF -- DNS, RSA, ... helper scripts now in DKIM_Verifier namespace - -## 0.2.2 (2013-05-22) - -- fixed regex pattern for domain_name ("." was not escaped) - -## 0.2.1 (2013-05-22) - -- query method was parsed wrong -- last header field was parsed wrong -- DNS exception now caught - -## 0.2 (2013-05-16) - -- check that from header is signed now included -- key record flags are no longer ignored -- Multiple Instances of a header Field are now supported -- encoding issue for body hash fixed - -## 0.1 (2013-05-13) - -- Initial release diff --git a/CODE_OF_CONDUCT.adoc b/CODE_OF_CONDUCT.adoc new file mode 100644 index 0000000..fd83f18 --- /dev/null +++ b/CODE_OF_CONDUCT.adoc @@ -0,0 +1,253 @@ +== Code of Conduct + +=== 🤝 Our Pledge + +We as members, contributors, and maintainers pledge to make +participation in our community a harassment-free experience for +everyone, regardless of age, body size, visible or invisible disability, +ethnicity, sex characteristics, gender identity and expression, level of +experience, education, socio-economic status, nationality, personal +appearance, race, caste, color, religion, or sexual identity and +orientation. + +We pledge to act and interact in ways that contribute to an *open, +welcoming, diverse, inclusive, and healthy community* focused on *email +security for all*. + +=== 🎯 Our Standards + +==== Positive Behavior (Encouraged) + +✅ *Be Respectful* - Demonstrating empathy and kindness toward other +people - Being respectful of differing opinions, viewpoints, and +experiences - Giving and gracefully accepting constructive feedback + +✅ *Be Inclusive* - Using welcoming and inclusive language - Respecting +people’s pronouns and names - Acknowledging and learning from mistakes + +✅ *Be Collaborative* - Focusing on what is best for the community and +users - Showing empathy towards other community members - Helping +newcomers get started + +✅ *Be Professional* - Accepting responsibility and apologizing for +mistakes - Focusing on technical merit over personal preferences - Being +open to learning and growth + +✅ *Be Transparent* - Communicating clearly and honestly - Explaining +decisions and technical choices - Documenting work for future +contributors + +==== Unacceptable Behavior (Prohibited) + +❌ *Harassment* - Trolling, insulting/derogatory comments, and personal +or political attacks - Public or private harassment - Sexual attention +or advances of any kind + +❌ *Discrimination* - Discriminatory jokes and language - Exclusionary +behavior or gatekeeping - Assuming incompetence based on identity + +❌ *Privacy Violations* - Publishing others’ private information without +explicit permission - Doxxing or threatening to reveal private +information + +❌ *Dishonesty* - Deliberately spreading misinformation - Plagiarism or +claiming others’ work as your own - Sockpuppeting or astroturfing + +❌ *Professional Misconduct* - Sustained disruption of discussions or +development - Repeatedly ignoring community standards - Abusing +maintainer privileges + +=== 🛡️ Security-Specific Standards + +Given that DKIM Verifier is a *security-critical* project: + +==== Required Practices + +✅ *Responsible Disclosure* - Never publicly disclose security +vulnerabilities before patches - Follow SECURITY.md guidelines for +reporting - Allow maintainers reasonable time to respond + +✅ *Security-Conscious Development* - Consider security implications of +all code changes - Document potential security impacts in PRs - Err on +side of caution for authentication/crypto code + +✅ *Privacy Respect* - Never request user emails or private data in +issues - Redact sensitive information from bug reports - Respect user +privacy in all interactions + +==== Prohibited Practices + +❌ *Security Violations* - Weaponizing vulnerabilities before disclosure +- Attempting to exploit users through malicious contributions - Social +engineering or phishing community members + +❌ *Bad Faith Security Reports* - Filing frivolous "`security`" reports +for attention - Demanding bounties when none are offered - Threatening +public disclosure without reasonable timeline + +=== 🌡️ Emotional Safety + +We follow principles from the *Compassionate Code Contribution Protocol +(CCCP)*: + +==== Emotional Temperature + +Contributors should feel *psychologically safe* to: - Ask "`beginner`" +questions without shame - Admit mistakes and learn from them - +Experiment without fear of harsh criticism - Disagree respectfully on +technical matters + +==== Reversibility + +* Code can be reverted; relationships cannot +* Assume good intentions; clarify before criticizing +* Focus feedback on code, not people +* Celebrate learning over perfection + +==== Anxiety Reduction + +* Clear, kind communication +* Transparent decision-making +* Predictable review processes +* Acknowledging contributions promptly + +=== 👮 Enforcement Responsibilities + +==== Maintainer Responsibilities + +Community maintainers are responsible for clarifying and enforcing our +standards of acceptable behavior and will take appropriate and fair +corrective action in response to any behavior that they deem +inappropriate, threatening, offensive, or harmful. + +Maintainers have the right and responsibility to: - Remove, edit, or +reject comments, commits, code, issues, and other contributions - Ban +temporarily or permanently any contributor for behaviors deemed +inappropriate + +==== Scope + +This Code of Conduct applies within all community spaces (GitHub, email, +chat, in-person events) and when an individual is representing the +project or community in public spaces. + +=== 📢 Reporting Violations + +==== How to Report + +[arabic] +. *Email Maintainers*: See MAINTAINERS.md for contact information +. *Private Message*: Contact any maintainer privately +. *Anonymous Form*: _(To be implemented)_ + +==== What to Include + +* Description of the incident +* When and where it occurred +* Who was involved +* Any relevant screenshots or logs +* Impact on you or others + +==== Confidentiality + +All reports will be handled with *strictest confidence*. We will not +share: - Reporter’s identity (unless they explicitly allow it) - Details +beyond what’s necessary for resolution - Information with anyone not +involved in enforcement + +=== ⚖️ Enforcement Guidelines + +Maintainers will follow these Community Impact Guidelines: + +==== 1. Correction (Minor Infraction) + +*Community Impact*: Use of inappropriate language or other +unprofessional behavior. + +*Consequence*: Private, written warning from maintainers, with clarity +around the nature of the violation and why it was inappropriate. A +public apology may be requested. + +==== 2. Warning (Moderate Infraction) + +*Community Impact*: A violation through a single incident or series of +actions. + +*Consequence*: Warning with consequences for continued behavior. No +interaction with people involved (including community members) for a +specified period. This includes avoiding interactions in community +spaces and external channels. Violating these terms may lead to +temporary or permanent ban. + +==== 3. Temporary Ban (Serious Infraction) + +*Community Impact*: Serious violation, including sustained inappropriate +behavior. + +*Consequence*: Temporary ban from any interaction or public +communication with the community for a specified period. No public or +private interaction with people involved during this period. Violating +these terms may lead to permanent ban. + +==== 4. Permanent Ban (Severe/Repeated Infractions) + +*Community Impact*: Pattern of violation, harassment, or aggression +toward others. + +*Consequence*: Permanent ban from all community interaction. + +=== 🔄 Appeals Process + +If you believe an enforcement decision was made in error: + +[arabic] +. Email maintainers within *14 days* of decision +. Explain why you believe the decision was incorrect +. Provide any additional context or evidence +. Maintainers will review and respond within *7 days* + +Appeals are handled by maintainers who were not involved in the original +decision when possible. + +=== 🌟 Positive Reinforcement + +We believe in recognizing positive contributions: + +* *Helpful Community Members*: Acknowledged in CHANGELOG +* *Quality Contributors*: Advanced through TPCF perimeters +* *Exceptional Work*: Featured in project updates +* *Long-term Contributors*: Listed in MAINTAINERS.md + +=== 📚 Attribution + +This Code of Conduct is adapted from: - +https://www.contributor-covenant.org/version/2/1/code_of_conduct.html[Contributor +Covenant v2.1] - https://www.rust-lang.org/policies/code-of-conduct[Rust +Code of Conduct] - *Compassionate Code Contribution Protocol (CCCP)* +principles - Mozilla Community Participation Guidelines + +=== 🔗 Related Documents + +* *CONTRIBUTING.md*: Contribution guidelines and TPCF +* *SECURITY.md*: Security vulnerability reporting +* *MAINTAINERS.md*: Current maintainer contacts + +=== 📞 Contact + +* *General Questions*: +https://github.com/lieser/dkim_verifier/discussions[GitHub Discussions] +* *Code of Conduct Violations*: See MAINTAINERS.md for private contact +* *Security Issues*: See SECURITY.md + +=== 📝 Changes to This Document + +This Code of Conduct may be revised from time to time. Major changes +will be announced and subject to community feedback. Check the Git +history for version tracking. + +*Version*: 1.0 *Last Updated*: 2025-11-22 *Effective Date*: 2025-11-22 + +''''' + +*Remember*: We’re all here to make email safer. Let’s do it together +with kindness, professionalism, and respect. 🛡️💙 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index bd1e9cd..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,242 +0,0 @@ - -# Code of Conduct - -## 🤝 Our Pledge - -We as members, contributors, and maintainers pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. - -We pledge to act and interact in ways that contribute to an **open, welcoming, diverse, inclusive, and healthy community** focused on **email security for all**. - -## 🎯 Our Standards - -### Positive Behavior (Encouraged) - -✅ **Be Respectful** -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback - -✅ **Be Inclusive** -- Using welcoming and inclusive language -- Respecting people's pronouns and names -- Acknowledging and learning from mistakes - -✅ **Be Collaborative** -- Focusing on what is best for the community and users -- Showing empathy towards other community members -- Helping newcomers get started - -✅ **Be Professional** -- Accepting responsibility and apologizing for mistakes -- Focusing on technical merit over personal preferences -- Being open to learning and growth - -✅ **Be Transparent** -- Communicating clearly and honestly -- Explaining decisions and technical choices -- Documenting work for future contributors - -### Unacceptable Behavior (Prohibited) - -❌ **Harassment** -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Sexual attention or advances of any kind - -❌ **Discrimination** -- Discriminatory jokes and language -- Exclusionary behavior or gatekeeping -- Assuming incompetence based on identity - -❌ **Privacy Violations** -- Publishing others' private information without explicit permission -- Doxxing or threatening to reveal private information - -❌ **Dishonesty** -- Deliberately spreading misinformation -- Plagiarism or claiming others' work as your own -- Sockpuppeting or astroturfing - -❌ **Professional Misconduct** -- Sustained disruption of discussions or development -- Repeatedly ignoring community standards -- Abusing maintainer privileges - -## 🛡️ Security-Specific Standards - -Given that DKIM Verifier is a **security-critical** project: - -### Required Practices - -✅ **Responsible Disclosure** -- Never publicly disclose security vulnerabilities before patches -- Follow SECURITY.md guidelines for reporting -- Allow maintainers reasonable time to respond - -✅ **Security-Conscious Development** -- Consider security implications of all code changes -- Document potential security impacts in PRs -- Err on side of caution for authentication/crypto code - -✅ **Privacy Respect** -- Never request user emails or private data in issues -- Redact sensitive information from bug reports -- Respect user privacy in all interactions - -### Prohibited Practices - -❌ **Security Violations** -- Weaponizing vulnerabilities before disclosure -- Attempting to exploit users through malicious contributions -- Social engineering or phishing community members - -❌ **Bad Faith Security Reports** -- Filing frivolous "security" reports for attention -- Demanding bounties when none are offered -- Threatening public disclosure without reasonable timeline - -## 🌡️ Emotional Safety - -We follow principles from the **Compassionate Code Contribution Protocol (CCCP)**: - -### Emotional Temperature - -Contributors should feel **psychologically safe** to: -- Ask "beginner" questions without shame -- Admit mistakes and learn from them -- Experiment without fear of harsh criticism -- Disagree respectfully on technical matters - -### Reversibility - -- Code can be reverted; relationships cannot -- Assume good intentions; clarify before criticizing -- Focus feedback on code, not people -- Celebrate learning over perfection - -### Anxiety Reduction - -- Clear, kind communication -- Transparent decision-making -- Predictable review processes -- Acknowledging contributions promptly - -## 👮 Enforcement Responsibilities - -### Maintainer Responsibilities - -Community maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. - -Maintainers have the right and responsibility to: -- Remove, edit, or reject comments, commits, code, issues, and other contributions -- Ban temporarily or permanently any contributor for behaviors deemed inappropriate - -### Scope - -This Code of Conduct applies within all community spaces (GitHub, email, chat, in-person events) and when an individual is representing the project or community in public spaces. - -## 📢 Reporting Violations - -### How to Report - -1. **Email Maintainers**: See MAINTAINERS.md for contact information -2. **Private Message**: Contact any maintainer privately -3. **Anonymous Form**: *(To be implemented)* - -### What to Include - -- Description of the incident -- When and where it occurred -- Who was involved -- Any relevant screenshots or logs -- Impact on you or others - -### Confidentiality - -All reports will be handled with **strictest confidence**. We will not share: -- Reporter's identity (unless they explicitly allow it) -- Details beyond what's necessary for resolution -- Information with anyone not involved in enforcement - -## ⚖️ Enforcement Guidelines - -Maintainers will follow these Community Impact Guidelines: - -### 1. Correction (Minor Infraction) - -**Community Impact**: Use of inappropriate language or other unprofessional behavior. - -**Consequence**: Private, written warning from maintainers, with clarity around the nature of the violation and why it was inappropriate. A public apology may be requested. - -### 2. Warning (Moderate Infraction) - -**Community Impact**: A violation through a single incident or series of actions. - -**Consequence**: Warning with consequences for continued behavior. No interaction with people involved (including community members) for a specified period. This includes avoiding interactions in community spaces and external channels. Violating these terms may lead to temporary or permanent ban. - -### 3. Temporary Ban (Serious Infraction) - -**Community Impact**: Serious violation, including sustained inappropriate behavior. - -**Consequence**: Temporary ban from any interaction or public communication with the community for a specified period. No public or private interaction with people involved during this period. Violating these terms may lead to permanent ban. - -### 4. Permanent Ban (Severe/Repeated Infractions) - -**Community Impact**: Pattern of violation, harassment, or aggression toward others. - -**Consequence**: Permanent ban from all community interaction. - -## 🔄 Appeals Process - -If you believe an enforcement decision was made in error: - -1. Email maintainers within **14 days** of decision -2. Explain why you believe the decision was incorrect -3. Provide any additional context or evidence -4. Maintainers will review and respond within **7 days** - -Appeals are handled by maintainers who were not involved in the original decision when possible. - -## 🌟 Positive Reinforcement - -We believe in recognizing positive contributions: - -- **Helpful Community Members**: Acknowledged in CHANGELOG -- **Quality Contributors**: Advanced through TPCF perimeters -- **Exceptional Work**: Featured in project updates -- **Long-term Contributors**: Listed in MAINTAINERS.md - -## 📚 Attribution - -This Code of Conduct is adapted from: -- [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html) -- [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) -- **Compassionate Code Contribution Protocol (CCCP)** principles -- Mozilla Community Participation Guidelines - -## 🔗 Related Documents - -- **CONTRIBUTING.md**: Contribution guidelines and TPCF -- **SECURITY.md**: Security vulnerability reporting -- **MAINTAINERS.md**: Current maintainer contacts - -## 📞 Contact - -- **General Questions**: [GitHub Discussions](https://github.com/lieser/dkim_verifier/discussions) -- **Code of Conduct Violations**: See MAINTAINERS.md for private contact -- **Security Issues**: See SECURITY.md - -## 📝 Changes to This Document - -This Code of Conduct may be revised from time to time. Major changes will be announced and subject to community feedback. Check the Git history for version tracking. - -**Version**: 1.0 -**Last Updated**: 2025-11-22 -**Effective Date**: 2025-11-22 - ---- - -**Remember**: We're all here to make email safer. Let's do it together with kindness, professionalism, and respect. 🛡️💙 diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc new file mode 100644 index 0000000..f8a5bdb --- /dev/null +++ b/CONTRIBUTING.adoc @@ -0,0 +1,369 @@ +== Contributing to DKIM Verifier + +Thank you for your interest in contributing to DKIM Verifier! This +document outlines our *Tri-Perimeter Contribution Framework (TPCF)* and +how to get involved. + +=== 🎯 Tri-Perimeter Contribution Framework (TPCF) + +We use a graduated trust model with three perimeters: + +==== Perimeter 3: Community Sandbox (🌍 Public) + +*Anyone can contribute here without special permissions* + +* *Bug Reports*: Open issues for bugs, feature requests +* *Discussions*: Participate in GitHub Discussions +* *Documentation*: Suggest improvements via issues +* *Translations*: Submit translation updates +* *Testing*: Test beta versions and provide feedback +* *Code Review*: Comment on pull requests + +*Access*: Public, no approval needed *Scope*: Read-only access, issue +creation, discussions *Review*: Maintainers review all contributions + +==== Perimeter 2: Trusted Contributors (🤝 Vetted) + +*Contributors who have demonstrated sustained, quality contributions* + +* *Pull Requests*: Direct PR submissions +* *Code Changes*: Implement features, fix bugs +* *Test Development*: Add unit/integration tests +* *Documentation Editing*: Direct doc improvements +* *Triage*: Help triage and label issues + +*How to Advance*: 1. 3+ quality contributions accepted from Perimeter 3 +2. Demonstrated understanding of codebase and standards 3. Positive +community interactions 4. Maintainer nomination + +*Access*: Write access to feature branches, PR creation *Scope*: All +repos, except main/release branches *Review*: Maintainer approval +required for merge + +==== Perimeter 1: Maintainer Core (⚡ Core Team) + +*Core maintainers with full repository access* + +* *Release Management*: Cut releases, manage versions +* *Merge to Main*: Approve and merge PRs +* *Security Response*: Handle security vulnerabilities +* *Governance*: Make project decisions +* *Infrastructure*: Manage CI/CD, hosting + +*Current Maintainers*: See MAINTAINERS.md + +*How to Advance*: 1. Sustained contributions over 6+ months 2. Deep +expertise in email security / WebExtensions 3. Unanimous approval from +existing maintainers 4. Demonstrated leadership and mentorship + +*Access*: Full repository access, release permissions *Scope*: All +operations including security-sensitive *Review*: Peer review from other +maintainers + +=== 📋 Contribution Guidelines + +==== Code Contributions + +===== Before You Start + +[arabic] +. *Check Issues*: See if someone is already working on it +. *Open Discussion*: For large features, discuss first +. *Read CLAUDE.md*: Understand project architecture +. *Review Roadmap*: See ROADMAP.md for planned features + +===== Code Standards + +* *Language*: JavaScript ES2024, TypeScript checking via JSDoc +* *Style*: Follow existing conventions (enforced by ESLint) +* *Types*: Add comprehensive JSDoc type annotations +* *Tests*: Add tests for new functionality +* *Docs*: Update documentation for user-facing changes + +===== Development Workflow + +[arabic] +. *Fork & Clone* ++ +[source,bash] +---- +git clone https://github.com/YOUR_USERNAME/dkim_verifier.git +cd dkim_verifier +---- +. *Create Feature Branch* ++ +[source,bash] +---- +git checkout -b feature/your-feature-name +---- +. *Make Changes* +* Follow code conventions (see CLAUDE.md) +* Add `+// @ts-check+` to new .mjs.js files +* Use tabs (4 spaces width) for indentation +* Double quotes for strings +* Semicolons required +. *Run Checks* ++ +[source,bash] +---- +npm run lint # ESLint (zero warnings required) +npm run checkJs # TypeScript type checking +npm run test # Unit tests +---- +. *Commit* ++ +[source,bash] +---- +git add . +git commit -m "Brief description of changes" +---- +* Use clear, descriptive commit messages +* Reference issue numbers: `+Fixes #123+` +. *Push & PR* ++ +[source,bash] +---- +git push origin feature/your-feature-name +---- +* Open Pull Request on GitHub +* Fill out PR template completely +* Link related issues + +===== Pull Request Requirements + +*Must Have*: - ✅ All CI checks passing (lint, type check, tests) - ✅ +Descriptive title and description - ✅ Tests for new code (aim for >80% +coverage) - ✅ Documentation updates if user-facing - ✅ No merge +conflicts with main branch + +*Nice to Have*: - 📝 Screenshots/GIFs for UI changes - 📝 Performance +benchmarks for optimizations - 📝 Migration guide for breaking changes + +==== Bug Reports + +*Use the Bug Report Template* + +Include: - *Thunderbird Version*: From Help → About - *Extension +Version*: From Add-ons Manager - *Steps to Reproduce*: Detailed, +numbered steps - *Expected Behavior*: What should happen - *Actual +Behavior*: What actually happens - *Error Console*: Any errors from +Tools → Error Console - *Sample Email*: If possible, provide .eml file +(redact sensitive info) + +==== Feature Requests + +*Use the Feature Request Template* + +Include: - *Problem Statement*: What problem does this solve? - +*Proposed Solution*: How should it work? - *Alternatives*: Other +approaches considered - *Use Case*: Real-world scenario - *Impact*: Who +benefits? How many users? + +==== Translation Contributions + +See `+_locales/Readme.md+` for details. + +[arabic] +. *Check Existing*: See if your language already exists +. *Reference Locale*: Use `+_locales/en_US/messages.json+` +. *Submit PR*: Add/update `+_locales/YOUR_LOCALE/messages.json+` +. *Test*: Load extension in Thunderbird with your locale + +*Current Languages*: 15 supported *Priority Languages*: German, French, +Spanish, Japanese, Chinese + +==== Documentation Improvements + +All documentation lives in: - `+README.md+` - Project overview - +`+CLAUDE.md+` - AI assistant / developer guide - `+ROADMAP.md+` - +Feature roadmap - `+test/Readme.md+`, `+_locales/Readme.md+` - Component +docs - https://github.com/lieser/dkim_verifier/wiki[Wiki] - User guide + +*Small Fixes*: Direct PR *Large Changes*: Open issue first for +discussion + +=== 🧪 Testing + +==== Unit Tests + +[source,bash] +---- +npm run test # Run in Node.js +npm run test:ci # CI mode with JSON output +---- + +*Browser Testing*: + +[source,bash] +---- +npx http-server . -c-1 +# Open: http://localhost:8080/test/unittest/SpecRunner.html +---- + +==== Manual Testing + +[arabic] +. Load extension in Thunderbird (see CLAUDE.md) +. Test with real emails (use test accounts) +. Check error console for warnings/errors +. Verify all features still work + +==== Test Coverage + +* *Target*: >80% line coverage +* *Current*: ~70% (v6.2) +* *Framework*: Mocha + Chai + Sinon + +=== 🏗️ Development Environment + +==== Prerequisites + +* *Node.js*: >= 22.0.0 +* *Git*: In PATH +* *Thunderbird*: 128.0 or later + +==== Setup + +[source,bash] +---- +npm install +---- + +==== Useful Commands + +[source,bash] +---- +npm run lint # ESLint +npm run lint:ci # CI mode (no warnings) +npm run checkJs # Type checking +npm run test # Unit tests +npm run pack # Package extension +npm run update-thirdparty # Update dependencies +---- + +==== IDE Setup + +*VS Code* (Recommended): - Extensions: ESLint, TypeScript - Settings +already in `+.vscode/settings.json+` + +*Other Editors*: - Ensure EditorConfig support (.editorconfig) - +Configure for tabs (4-width), LF line endings + +=== 📚 Learning Resources + +==== Email Security + +* https://datatracker.ietf.org/doc/html/rfc6376[DKIM RFC 6376] +* https://datatracker.ietf.org/doc/html/rfc7208[SPF RFC 7208] +* https://datatracker.ietf.org/doc/html/rfc7489[DMARC RFC 7489] + +==== Thunderbird Development + +* https://webextension-api.thunderbird.net/[Thunderbird Extension API] +* https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions[WebExtension +Docs] +* https://thunderbird-webextensions.readthedocs.io[Experiment APIs] + +==== Project Architecture + +* *CLAUDE.md*: Comprehensive developer guide +* *ROADMAP.md*: Feature plans and architecture +* Module documentation in source files + +=== 🎓 First-Time Contributors + +==== Good First Issues + +Look for issues labeled: - `+good first issue+` - Beginner-friendly - +`+documentation+` - Docs improvements - `+translation+` - Localization +help - `+help wanted+` - Community assistance needed + +==== Mentorship + +* Ask questions in GitHub Discussions +* Tag `+@maintainers+` for guidance +* Join discussion on complex issues + +=== 🤝 Code of Conduct + +We follow our link:CODE_OF_CONDUCT.md[Code of Conduct]. Summary: + +* *Be Respectful*: Treat everyone with respect +* *Be Inclusive*: Welcome diverse perspectives +* *Be Collaborative*: Work together constructively +* *Be Professional*: Focus on technical merit + +*Violations*: Report to maintainers privately + +=== 🔒 Security Contributions + +See SECURITY.md for: - Responsible disclosure process - Security +vulnerability reporting - Bug bounty (if applicable) + +*Do NOT* open public issues for security bugs! + +=== 📄 License + +By contributing, you agree that your contributions will be licensed +under the *MIT License* (see LICENSE.txt). + +*Note*: We are considering dual-licensing with *Palimpsest License v0.8* +for future versions. Contributors will be consulted before any license +changes. + +==== Third-Party Code + +If submitting code from other sources: - Ensure compatible license (MIT, +BSD, Apache 2.0) - Add attribution to `+THIRDPARTY_LICENSE.txt+` - +Document in commit message + +=== 🚀 Release Process (Maintainers Only) + +[arabic] +. Update `+CHANGELOG.md+` with version and date +. Update `+manifest.json+` version +. Run full test suite: +`+npm run lint && npm run checkJs && npm run test+` +. Tag release: `+git tag v7.0.0+` +. Push tags: `+git push origin v7.0.0+` +. Run `+npm run pack+` +. Upload to addons.thunderbird.net +. Create GitHub Release with changelog + +=== 📊 Contribution Statistics + +We value all contributions! Stats tracked: - Code commits - Issues +opened/commented - PRs submitted/reviewed - Documentation improvements - +Community support + +*Top Contributors*: See GitHub Insights + +=== 🙏 Recognition + +Contributors are recognized in: - Release notes (CHANGELOG.md) - GitHub +contributors page - Special thanks in major releases + +*Want to be listed?*: Make 3+ quality contributions! + +=== 📞 Getting Help + +* *GitHub Discussions*: General questions, ideas +* *GitHub Issues*: Bug reports, feature requests +* *Email*: See MAINTAINERS.md for contact +* *Wiki*: https://github.com/lieser/dkim_verifier/wiki[User +documentation] + +=== 🗺️ Roadmap Alignment + +See ROADMAP.md for: - Planned features (v7.0 - v8.0) - Architecture +vision - Priority areas + +*Want to work on roadmap items?* Open an issue to claim it! + +''''' + +*Thank you for contributing to email security! Together, we make email +safer for everyone.* 🛡️ + +*Last Updated*: 2025-11-22 *TPCF Version*: 1.0 *Maintained By*: See +MAINTAINERS.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a9329ae..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,362 +0,0 @@ - -# Contributing to DKIM Verifier - -Thank you for your interest in contributing to DKIM Verifier! This document outlines our **Tri-Perimeter Contribution Framework (TPCF)** and how to get involved. - -## 🎯 Tri-Perimeter Contribution Framework (TPCF) - -We use a graduated trust model with three perimeters: - -### Perimeter 3: Community Sandbox (🌍 Public) -**Anyone can contribute here without special permissions** - -- **Bug Reports**: Open issues for bugs, feature requests -- **Discussions**: Participate in GitHub Discussions -- **Documentation**: Suggest improvements via issues -- **Translations**: Submit translation updates -- **Testing**: Test beta versions and provide feedback -- **Code Review**: Comment on pull requests - -**Access**: Public, no approval needed -**Scope**: Read-only access, issue creation, discussions -**Review**: Maintainers review all contributions - -### Perimeter 2: Trusted Contributors (🤝 Vetted) -**Contributors who have demonstrated sustained, quality contributions** - -- **Pull Requests**: Direct PR submissions -- **Code Changes**: Implement features, fix bugs -- **Test Development**: Add unit/integration tests -- **Documentation Editing**: Direct doc improvements -- **Triage**: Help triage and label issues - -**How to Advance**: -1. 3+ quality contributions accepted from Perimeter 3 -2. Demonstrated understanding of codebase and standards -3. Positive community interactions -4. Maintainer nomination - -**Access**: Write access to feature branches, PR creation -**Scope**: All repos, except main/release branches -**Review**: Maintainer approval required for merge - -### Perimeter 1: Maintainer Core (⚡ Core Team) -**Core maintainers with full repository access** - -- **Release Management**: Cut releases, manage versions -- **Merge to Main**: Approve and merge PRs -- **Security Response**: Handle security vulnerabilities -- **Governance**: Make project decisions -- **Infrastructure**: Manage CI/CD, hosting - -**Current Maintainers**: See MAINTAINERS.md - -**How to Advance**: -1. Sustained contributions over 6+ months -2. Deep expertise in email security / WebExtensions -3. Unanimous approval from existing maintainers -4. Demonstrated leadership and mentorship - -**Access**: Full repository access, release permissions -**Scope**: All operations including security-sensitive -**Review**: Peer review from other maintainers - -## 📋 Contribution Guidelines - -### Code Contributions - -#### Before You Start -1. **Check Issues**: See if someone is already working on it -2. **Open Discussion**: For large features, discuss first -3. **Read CLAUDE.md**: Understand project architecture -4. **Review Roadmap**: See ROADMAP.md for planned features - -#### Code Standards -- **Language**: JavaScript ES2024, TypeScript checking via JSDoc -- **Style**: Follow existing conventions (enforced by ESLint) -- **Types**: Add comprehensive JSDoc type annotations -- **Tests**: Add tests for new functionality -- **Docs**: Update documentation for user-facing changes - -#### Development Workflow - -1. **Fork & Clone** - ```bash - git clone https://github.com/YOUR_USERNAME/dkim_verifier.git - cd dkim_verifier - ``` - -2. **Create Feature Branch** - ```bash - git checkout -b feature/your-feature-name - ``` - -3. **Make Changes** - - Follow code conventions (see CLAUDE.md) - - Add `// @ts-check` to new .mjs.js files - - Use tabs (4 spaces width) for indentation - - Double quotes for strings - - Semicolons required - -4. **Run Checks** - ```bash - npm run lint # ESLint (zero warnings required) - npm run checkJs # TypeScript type checking - npm run test # Unit tests - ``` - -5. **Commit** - ```bash - git add . - git commit -m "Brief description of changes" - ``` - - Use clear, descriptive commit messages - - Reference issue numbers: `Fixes #123` - -6. **Push & PR** - ```bash - git push origin feature/your-feature-name - ``` - - Open Pull Request on GitHub - - Fill out PR template completely - - Link related issues - -#### Pull Request Requirements - -**Must Have**: -- ✅ All CI checks passing (lint, type check, tests) -- ✅ Descriptive title and description -- ✅ Tests for new code (aim for >80% coverage) -- ✅ Documentation updates if user-facing -- ✅ No merge conflicts with main branch - -**Nice to Have**: -- 📝 Screenshots/GIFs for UI changes -- 📝 Performance benchmarks for optimizations -- 📝 Migration guide for breaking changes - -### Bug Reports - -**Use the Bug Report Template** - -Include: -- **Thunderbird Version**: From Help → About -- **Extension Version**: From Add-ons Manager -- **Steps to Reproduce**: Detailed, numbered steps -- **Expected Behavior**: What should happen -- **Actual Behavior**: What actually happens -- **Error Console**: Any errors from Tools → Error Console -- **Sample Email**: If possible, provide .eml file (redact sensitive info) - -### Feature Requests - -**Use the Feature Request Template** - -Include: -- **Problem Statement**: What problem does this solve? -- **Proposed Solution**: How should it work? -- **Alternatives**: Other approaches considered -- **Use Case**: Real-world scenario -- **Impact**: Who benefits? How many users? - -### Translation Contributions - -See `_locales/Readme.md` for details. - -1. **Check Existing**: See if your language already exists -2. **Reference Locale**: Use `_locales/en_US/messages.json` -3. **Submit PR**: Add/update `_locales/YOUR_LOCALE/messages.json` -4. **Test**: Load extension in Thunderbird with your locale - -**Current Languages**: 15 supported -**Priority Languages**: German, French, Spanish, Japanese, Chinese - -### Documentation Improvements - -All documentation lives in: -- `README.md` - Project overview -- `CLAUDE.md` - AI assistant / developer guide -- `ROADMAP.md` - Feature roadmap -- `test/Readme.md`, `_locales/Readme.md` - Component docs -- [Wiki](https://github.com/lieser/dkim_verifier/wiki) - User guide - -**Small Fixes**: Direct PR -**Large Changes**: Open issue first for discussion - -## 🧪 Testing - -### Unit Tests -```bash -npm run test # Run in Node.js -npm run test:ci # CI mode with JSON output -``` - -**Browser Testing**: -```bash -npx http-server . -c-1 -# Open: http://localhost:8080/test/unittest/SpecRunner.html -``` - -### Manual Testing -1. Load extension in Thunderbird (see CLAUDE.md) -2. Test with real emails (use test accounts) -3. Check error console for warnings/errors -4. Verify all features still work - -### Test Coverage -- **Target**: >80% line coverage -- **Current**: ~70% (v6.2) -- **Framework**: Mocha + Chai + Sinon - -## 🏗️ Development Environment - -### Prerequisites -- **Node.js**: >= 22.0.0 -- **Git**: In PATH -- **Thunderbird**: 128.0 or later - -### Setup -```bash -npm install -``` - -### Useful Commands -```bash -npm run lint # ESLint -npm run lint:ci # CI mode (no warnings) -npm run checkJs # Type checking -npm run test # Unit tests -npm run pack # Package extension -npm run update-thirdparty # Update dependencies -``` - -### IDE Setup - -**VS Code** (Recommended): -- Extensions: ESLint, TypeScript -- Settings already in `.vscode/settings.json` - -**Other Editors**: -- Ensure EditorConfig support (.editorconfig) -- Configure for tabs (4-width), LF line endings - -## 📚 Learning Resources - -### Email Security -- [DKIM RFC 6376](https://datatracker.ietf.org/doc/html/rfc6376) -- [SPF RFC 7208](https://datatracker.ietf.org/doc/html/rfc7208) -- [DMARC RFC 7489](https://datatracker.ietf.org/doc/html/rfc7489) - -### Thunderbird Development -- [Thunderbird Extension API](https://webextension-api.thunderbird.net/) -- [WebExtension Docs](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions) -- [Experiment APIs](https://thunderbird-webextensions.readthedocs.io) - -### Project Architecture -- **CLAUDE.md**: Comprehensive developer guide -- **ROADMAP.md**: Feature plans and architecture -- Module documentation in source files - -## 🎓 First-Time Contributors - -### Good First Issues -Look for issues labeled: -- `good first issue` - Beginner-friendly -- `documentation` - Docs improvements -- `translation` - Localization help -- `help wanted` - Community assistance needed - -### Mentorship -- Ask questions in GitHub Discussions -- Tag `@maintainers` for guidance -- Join discussion on complex issues - -## 🤝 Code of Conduct - -We follow our [Code of Conduct](CODE_OF_CONDUCT.md). Summary: - -- **Be Respectful**: Treat everyone with respect -- **Be Inclusive**: Welcome diverse perspectives -- **Be Collaborative**: Work together constructively -- **Be Professional**: Focus on technical merit - -**Violations**: Report to maintainers privately - -## 🔒 Security Contributions - -See [SECURITY.md](SECURITY.md) for: -- Responsible disclosure process -- Security vulnerability reporting -- Bug bounty (if applicable) - -**Do NOT** open public issues for security bugs! - -## 📄 License - -By contributing, you agree that your contributions will be licensed under the **MIT License** (see LICENSE.txt). - -**Note**: We are considering dual-licensing with **Palimpsest License v0.8** for future versions. Contributors will be consulted before any license changes. - -### Third-Party Code -If submitting code from other sources: -- Ensure compatible license (MIT, BSD, Apache 2.0) -- Add attribution to `THIRDPARTY_LICENSE.txt` -- Document in commit message - -## 🚀 Release Process (Maintainers Only) - -1. Update `CHANGELOG.md` with version and date -2. Update `manifest.json` version -3. Run full test suite: `npm run lint && npm run checkJs && npm run test` -4. Tag release: `git tag v7.0.0` -5. Push tags: `git push origin v7.0.0` -6. Run `npm run pack` -7. Upload to addons.thunderbird.net -8. Create GitHub Release with changelog - -## 📊 Contribution Statistics - -We value all contributions! Stats tracked: -- Code commits -- Issues opened/commented -- PRs submitted/reviewed -- Documentation improvements -- Community support - -**Top Contributors**: See GitHub Insights - -## 🙏 Recognition - -Contributors are recognized in: -- Release notes (CHANGELOG.md) -- GitHub contributors page -- Special thanks in major releases - -**Want to be listed?**: Make 3+ quality contributions! - -## 📞 Getting Help - -- **GitHub Discussions**: General questions, ideas -- **GitHub Issues**: Bug reports, feature requests -- **Email**: See MAINTAINERS.md for contact -- **Wiki**: [User documentation](https://github.com/lieser/dkim_verifier/wiki) - -## 🗺️ Roadmap Alignment - -See [ROADMAP.md](ROADMAP.md) for: -- Planned features (v7.0 - v8.0) -- Architecture vision -- Priority areas - -**Want to work on roadmap items?** Open an issue to claim it! - ---- - -**Thank you for contributing to email security! Together, we make email safer for everyone.** 🛡️ - -**Last Updated**: 2025-11-22 -**TPCF Version**: 1.0 -**Maintained By**: See MAINTAINERS.md diff --git a/GOVERNANCE.adoc b/GOVERNANCE.adoc new file mode 100644 index 0000000..9b836fb --- /dev/null +++ b/GOVERNANCE.adoc @@ -0,0 +1,60 @@ +== Governance + +=== Overview + +This project is governed by the following principles and structures to +ensure transparent, inclusive, and effective decision-making. + +=== Roles and Responsibilities + +==== Maintainers + +Maintainers are responsible for: - Reviewing and merging pull requests - +Managing releases and versioning - Ensuring code quality and standards - +Triaging issues and bug reports - Community engagement and support + +==== Contributors + +Contributors are expected to: - Follow the code of conduct - Submit +well-documented pull requests - Write tests for new functionality - +Maintain existing tests - Update documentation as needed + +=== Decision Making + +==== Minor Changes + +* Can be made by any maintainer +* Include bug fixes, documentation updates, dependency updates + +==== Major Changes + +* Require discussion in issues or pull requests +* Include new features, architectural changes, API changes +* Need approval from at least 2 maintainers + +==== Breaking Changes + +* Require RFC (Request for Comments) process +* Need approval from majority of maintainers +* Must include migration guide + +=== Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations +can be reported to the maintainers. + +=== Communication + +* *Issues*: For bug reports and feature requests +* *Discussions*: For questions and general discussion +* *Pull Requests*: For code contributions + +=== Licensing + +All contributions are made under the terms of the repository’s LICENSE +file. By submitting a pull request, you agree to license your +contributions accordingly. + +''''' + +_Last updated: 2026-07-18_ diff --git a/GOVERNANCE.md b/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/MAINTAINERS.adoc b/MAINTAINERS.adoc index aa23a55..9945f9f 100644 --- a/MAINTAINERS.adoc +++ b/MAINTAINERS.adoc @@ -1,48 +1,252 @@ -// SPDX-License-Identifier: CC-BY-SA-4.0 -// Copyright (c) Jonathan D.A. Jewell -= Maintainers -:toc: preamble +== Maintainers -This document lists the maintainers of this project and their responsibilities. +This document lists the current maintainers of the DKIM Verifier project +and their areas of responsibility. -== Current Maintainers +=== 🎯 TPCF Perimeter 1: Core Maintainers -[cols="2,3,2",options="header"] +Core maintainers have full repository access and make final decisions on +project direction, releases, and governance. + +==== Philippe Lieser (@lieser) + +*Role*: Lead Maintainer & Creator *Responsibilities*: - Overall project +direction and roadmap - Release management and versioning - Security +vulnerability coordination - Final review on major architectural changes +- Community governance + +*Contact*: - GitHub: https://github.com/lieser[@lieser] - Email: _(See +.well-known/security.txt for current contact)_ + +*Expertise*: - Email authentication protocols (DKIM, SPF, DMARC) - +Thunderbird WebExtension development - Cryptographic verification - 10+ +years maintaining DKIM Verifier + +*Active Since*: 2014 *Timezone*: CET/CEST (Europe/Berlin) *Languages*: +German, English + +''''' + +=== 👥 TPCF Perimeter 2: Trusted Contributors + +_(Currently seeking trusted contributors - see CONTRIBUTING.md for +advancement criteria)_ + +These contributors have demonstrated sustained quality contributions and +are granted write access to feature branches. + +*How to Become a Trusted Contributor*: 1. 3+ quality contributions +accepted 2. Demonstrated codebase understanding 3. Positive community +interactions 4. Maintainer nomination + +''''' + +=== 🌍 TPCF Perimeter 3: Community Contributors + +All community members who contribute through: - Bug reports and feature +requests - Pull requests and code review - Documentation improvements - +Translations - Testing and feedback + +*Top Community Contributors* (3+ contributions): - _(To be populated as +contributions grow)_ + +*View All Contributors*: +https://github.com/lieser/dkim_verifier/graphs/contributors[GitHub +Contributors Page] + +''''' + +=== 📋 Areas of Responsibility + +==== Code Ownership + +[cols=",,",options="header",] +|=== +|Area |Primary |Backup +|Core DKIM Verification |@lieser |- +|SPF Verification (v7.0) |@lieser |- +|DMARC Integration |@lieser |- +|Header Analysis (v7.0) |- |- +|Phishing Detection (v7.0) |- |- +|Bayesian Filter (v7.0) |- |- +|Email Sanitization (v7.0) |- |- +|Security Orchestrator (v7.0) |- |- +|UI/UX |@lieser |- +|Build System |@lieser |- +|CI/CD |@lieser |- +|Translations |Community |@lieser |=== -| Name | Role | Contact -| Jonathan D.A. Jewell -| Lead Maintainer -| https://github.com/hyperpolymath[@hyperpolymath] +==== Platform & Infrastructure + +[cols=",",options="header",] |=== +|Area |Owner +|GitHub Repository |@lieser +|Thunderbird Add-ons (ATN) |@lieser +|Wiki Documentation |@lieser +|Issue Triage |@lieser +|=== + +==== Special Roles + +*Security Team*: @lieser - Handles security vulnerability reports - +Coordinates security fixes - Reviews security-sensitive code + +*Release Manager*: @lieser - Cuts releases - Manages versioning - +Updates changelogs - Publishes to ATN + +*Community Manager*: @lieser - Moderates discussions - Enforces Code of +Conduct - Welcomes new contributors + +''''' + +=== 🔐 Security Contact + +For *security vulnerabilities*, contact maintainers via: 1. See +`+.well-known/security.txt+` (RFC 9116) 2. Private vulnerability report +on GitHub 3. Email to security contact (see security.txt) + +*Do NOT* open public GitHub issues for security bugs! + +''''' + +=== 🤝 Becoming a Maintainer + +==== Path to Maintainership + +*From Perimeter 3 → Perimeter 2* (Trusted Contributor): 1. 3+ quality +contributions accepted 2. Understanding of codebase and standards 3. +Positive community interactions 4. Maintainer nomination + +*From Perimeter 2 → Perimeter 1* (Core Maintainer): 1. Sustained +contributions over 6+ months 2. Deep expertise in email security / +WebExtensions 3. Demonstrated leadership and mentorship 4. Unanimous +approval from existing maintainers + +==== Expectations for Core Maintainers + +*Time Commitment*: - ~5-10 hours/month minimum - Responsive to security +issues (24-48h) - Attend monthly sync meetings (if established) + +*Responsibilities*: - Code review (1-2 PRs/week) - Issue triage - +Community support - Release participation - Documentation maintenance + +*Skills Required*: - JavaScript/TypeScript expertise - Email protocols +(DKIM, SPF, DMARC) - Thunderbird extension development - Security best +practices - Git/GitHub workflows + +''''' + +=== 📞 Contacting Maintainers + +==== Public Communication (Preferred) + +* *Issues*: https://github.com/lieser/dkim_verifier/issues[GitHub +Issues] +* *Discussions*: +https://github.com/lieser/dkim_verifier/discussions[GitHub Discussions] +* *Pull Requests*: https://github.com/lieser/dkim_verifier/pulls[GitHub +PRs] + +==== Private Communication + +* *Security*: See SECURITY.md and .well-known/security.txt +* *Code of Conduct*: Email maintainers (see below) +* *Sensitive Matters*: Email maintainers directly + +*Email*: _(See .well-known/humans.txt for current contact)_ + +''''' + +=== 🎓 Emeritus Maintainers + +Maintainers who have stepped down but made significant contributions: + +_(None yet - founding maintainer still active)_ + +''''' + +=== 🌟 Special Thanks + +==== Major Contributors + +* *Translators*: 15 languages supported thanks to community +* *Testers*: Beta testers who provide crucial feedback +* *Reporters*: Security researchers who responsibly disclose + +==== Institutional Support + +* *Mozilla Thunderbird*: Platform and community +* *Spamhaus*: DNSBL data and expertise +* *VirusTotal*: Malware/phishing intelligence + +''''' + +=== 📊 Maintainer Statistics + +==== Activity (Last 12 Months) + +* *Commits*: ~150 (primary: @lieser) +* *PRs Merged*: ~20 +* *Issues Closed*: ~40 +* *Releases*: 3 major (6.0, 6.1, 6.2) + +==== Contributor Growth + +* *Total Contributors*: 15+ (all-time) +* *Active Contributors*: 3-5 (monthly average) +* *Translations*: 15 languages maintained + +''''' + +=== 🗳️ Governance + +==== Decision Making + +*Minor Decisions* (code style, small features): - Lead maintainer +(@lieser) decides - Community input via issues/discussions + +*Major Decisions* (architecture, breaking changes): - Proposal in GitHub +Discussion - Community feedback period (7+ days) - Maintainer consensus +(currently @lieser) - Document in ROADMAP.md or CHANGELOG.md + +*Security Decisions*: - Security team decides immediately - Public +disclosure after patch + 7-14 days + +==== Conflict Resolution + +[arabic] +. Discussion in GitHub (public) or email (private) +. Attempt consensus through compromise +. Lead maintainer (@lieser) makes final call if needed +. Document decision rationale -== Responsibilities +==== Removing Maintainers -Maintainers are responsible for: +*Voluntary*: Maintainer can step down anytime, moves to Emeritus +*Involuntary*: For serious Code of Conduct violations or prolonged +inactivity - Requires unanimous vote of remaining maintainers - Clear +documentation of reasons - Graceful transition period when possible -* Reviewing and merging pull requests -* Triaging issues and feature requests -* Ensuring code quality and security standards -* Managing releases and versioning -* Upholding the project's code of conduct +''''' -== Becoming a Maintainer +=== 📜 Changes to This Document -Contributors who demonstrate: +This document is updated as maintainer roster changes. -* Consistent, high-quality contributions -* Understanding of the project's goals and standards -* Constructive participation in discussions -* Commitment to the project's long-term health +*Version*: 1.0 *Last Updated*: 2025-11-22 *Next Review*: 2026-01-01 +(annually, or as needed) -May be invited to become maintainers at the discretion of existing maintainers. +''''' -== Decision Making +=== 🙏 Thank You -* Routine decisions (bug fixes, minor improvements) can be made by any maintainer -* Significant changes require discussion and consensus among maintainers -* Breaking changes or major features should be discussed in issues before implementation +To all maintainers, past and present, thank you for your dedication to +making email safer for everyone! 🛡️ -== Contact +''''' -For questions about project governance, open an issue or contact the maintainers listed above. +*Related Documents*: - CONTRIBUTING.md - How to contribute (TPCF) - +CODE_OF_CONDUCT.md - Community standards - SECURITY.md - Security +policies diff --git a/MAINTAINERS.md b/MAINTAINERS.md deleted file mode 100644 index 7296ac4..0000000 --- a/MAINTAINERS.md +++ /dev/null @@ -1,273 +0,0 @@ - -# Maintainers - -This document lists the current maintainers of the DKIM Verifier project and their areas of responsibility. - -## 🎯 TPCF Perimeter 1: Core Maintainers - -Core maintainers have full repository access and make final decisions on project direction, releases, and governance. - -### Philippe Lieser (@lieser) -**Role**: Lead Maintainer & Creator -**Responsibilities**: -- Overall project direction and roadmap -- Release management and versioning -- Security vulnerability coordination -- Final review on major architectural changes -- Community governance - -**Contact**: -- GitHub: [@lieser](https://github.com/lieser) -- Email: *(See .well-known/security.txt for current contact)* - -**Expertise**: -- Email authentication protocols (DKIM, SPF, DMARC) -- Thunderbird WebExtension development -- Cryptographic verification -- 10+ years maintaining DKIM Verifier - -**Active Since**: 2014 -**Timezone**: CET/CEST (Europe/Berlin) -**Languages**: German, English - ---- - -## 👥 TPCF Perimeter 2: Trusted Contributors - -*(Currently seeking trusted contributors - see CONTRIBUTING.md for advancement criteria)* - -These contributors have demonstrated sustained quality contributions and are granted write access to feature branches. - -**How to Become a Trusted Contributor**: -1. 3+ quality contributions accepted -2. Demonstrated codebase understanding -3. Positive community interactions -4. Maintainer nomination - ---- - -## 🌍 TPCF Perimeter 3: Community Contributors - -All community members who contribute through: -- Bug reports and feature requests -- Pull requests and code review -- Documentation improvements -- Translations -- Testing and feedback - -**Top Community Contributors** (3+ contributions): -- *(To be populated as contributions grow)* - -**View All Contributors**: [GitHub Contributors Page](https://github.com/lieser/dkim_verifier/graphs/contributors) - ---- - -## 📋 Areas of Responsibility - -### Code Ownership - -| Area | Primary | Backup | -|------|---------|--------| -| Core DKIM Verification | @lieser | - | -| SPF Verification (v7.0) | @lieser | - | -| DMARC Integration | @lieser | - | -| Header Analysis (v7.0) | - | - | -| Phishing Detection (v7.0) | - | - | -| Bayesian Filter (v7.0) | - | - | -| Email Sanitization (v7.0) | - | - | -| Security Orchestrator (v7.0) | - | - | -| UI/UX | @lieser | - | -| Build System | @lieser | - | -| CI/CD | @lieser | - | -| Translations | Community | @lieser | - -### Platform & Infrastructure - -| Area | Owner | -|------|-------| -| GitHub Repository | @lieser | -| Thunderbird Add-ons (ATN) | @lieser | -| Wiki Documentation | @lieser | -| Issue Triage | @lieser | - -### Special Roles - -**Security Team**: @lieser -- Handles security vulnerability reports -- Coordinates security fixes -- Reviews security-sensitive code - -**Release Manager**: @lieser -- Cuts releases -- Manages versioning -- Updates changelogs -- Publishes to ATN - -**Community Manager**: @lieser -- Moderates discussions -- Enforces Code of Conduct -- Welcomes new contributors - ---- - -## 🔐 Security Contact - -For **security vulnerabilities**, contact maintainers via: -1. See `.well-known/security.txt` (RFC 9116) -2. Private vulnerability report on GitHub -3. Email to security contact (see security.txt) - -**Do NOT** open public GitHub issues for security bugs! - ---- - -## 🤝 Becoming a Maintainer - -### Path to Maintainership - -**From Perimeter 3 → Perimeter 2** (Trusted Contributor): -1. 3+ quality contributions accepted -2. Understanding of codebase and standards -3. Positive community interactions -4. Maintainer nomination - -**From Perimeter 2 → Perimeter 1** (Core Maintainer): -1. Sustained contributions over 6+ months -2. Deep expertise in email security / WebExtensions -3. Demonstrated leadership and mentorship -4. Unanimous approval from existing maintainers - -### Expectations for Core Maintainers - -**Time Commitment**: -- ~5-10 hours/month minimum -- Responsive to security issues (24-48h) -- Attend monthly sync meetings (if established) - -**Responsibilities**: -- Code review (1-2 PRs/week) -- Issue triage -- Community support -- Release participation -- Documentation maintenance - -**Skills Required**: -- JavaScript/TypeScript expertise -- Email protocols (DKIM, SPF, DMARC) -- Thunderbird extension development -- Security best practices -- Git/GitHub workflows - ---- - -## 📞 Contacting Maintainers - -### Public Communication (Preferred) -- **Issues**: [GitHub Issues](https://github.com/lieser/dkim_verifier/issues) -- **Discussions**: [GitHub Discussions](https://github.com/lieser/dkim_verifier/discussions) -- **Pull Requests**: [GitHub PRs](https://github.com/lieser/dkim_verifier/pulls) - -### Private Communication -- **Security**: See SECURITY.md and .well-known/security.txt -- **Code of Conduct**: Email maintainers (see below) -- **Sensitive Matters**: Email maintainers directly - -**Email**: *(See .well-known/humans.txt for current contact)* - ---- - -## 🎓 Emeritus Maintainers - -Maintainers who have stepped down but made significant contributions: - -*(None yet - founding maintainer still active)* - ---- - -## 🌟 Special Thanks - -### Major Contributors -- **Translators**: 15 languages supported thanks to community -- **Testers**: Beta testers who provide crucial feedback -- **Reporters**: Security researchers who responsibly disclose - -### Institutional Support -- **Mozilla Thunderbird**: Platform and community -- **Spamhaus**: DNSBL data and expertise -- **VirusTotal**: Malware/phishing intelligence - ---- - -## 📊 Maintainer Statistics - -### Activity (Last 12 Months) -- **Commits**: ~150 (primary: @lieser) -- **PRs Merged**: ~20 -- **Issues Closed**: ~40 -- **Releases**: 3 major (6.0, 6.1, 6.2) - -### Contributor Growth -- **Total Contributors**: 15+ (all-time) -- **Active Contributors**: 3-5 (monthly average) -- **Translations**: 15 languages maintained - ---- - -## 🗳️ Governance - -### Decision Making - -**Minor Decisions** (code style, small features): -- Lead maintainer (@lieser) decides -- Community input via issues/discussions - -**Major Decisions** (architecture, breaking changes): -- Proposal in GitHub Discussion -- Community feedback period (7+ days) -- Maintainer consensus (currently @lieser) -- Document in ROADMAP.md or CHANGELOG.md - -**Security Decisions**: -- Security team decides immediately -- Public disclosure after patch + 7-14 days - -### Conflict Resolution - -1. Discussion in GitHub (public) or email (private) -2. Attempt consensus through compromise -3. Lead maintainer (@lieser) makes final call if needed -4. Document decision rationale - -### Removing Maintainers - -**Voluntary**: Maintainer can step down anytime, moves to Emeritus -**Involuntary**: For serious Code of Conduct violations or prolonged inactivity -- Requires unanimous vote of remaining maintainers -- Clear documentation of reasons -- Graceful transition period when possible - ---- - -## 📜 Changes to This Document - -This document is updated as maintainer roster changes. - -**Version**: 1.0 -**Last Updated**: 2025-11-22 -**Next Review**: 2026-01-01 (annually, or as needed) - ---- - -## 🙏 Thank You - -To all maintainers, past and present, thank you for your dedication to making email safer for everyone! 🛡️ - ---- - -**Related Documents**: -- [CONTRIBUTING.md](CONTRIBUTING.md) - How to contribute (TPCF) -- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) - Community standards -- [SECURITY.md](SECURITY.md) - Security policies diff --git a/MANUAL_REVIEW_NEEDED.adoc b/MANUAL_REVIEW_NEEDED.adoc new file mode 100644 index 0000000..c5de166 --- /dev/null +++ b/MANUAL_REVIEW_NEEDED.adoc @@ -0,0 +1,20 @@ +== ⚠️ Large Codebase - Manual Review Required + +This repository has substantial TS/JS code (>5000 lines). + +=== Challenges + +* Large codebase requires careful migration planning +* May have complex type dependencies +* Third-party libraries may need bindings + +=== Recommended Approach + +[arabic] +. *Audit*: Catalog all TS/JS files and dependencies +. *Prioritize*: Identify core vs peripheral code +. *Incremental*: Convert module by module +. *Test*: Ensure each converted module works +. *WASM*: Consider for heavy computation sections + +=== Do NOT attempt automated bulk conversion. diff --git a/MANUAL_REVIEW_NEEDED.md b/MANUAL_REVIEW_NEEDED.md deleted file mode 100644 index 6f78d7b..0000000 --- a/MANUAL_REVIEW_NEEDED.md +++ /dev/null @@ -1,21 +0,0 @@ - -# ⚠️ Large Codebase - Manual Review Required - -This repository has substantial TS/JS code (>5000 lines). - -## Challenges -- Large codebase requires careful migration planning -- May have complex type dependencies -- Third-party libraries may need bindings - -## Recommended Approach -1. **Audit**: Catalog all TS/JS files and dependencies -2. **Prioritize**: Identify core vs peripheral code -3. **Incremental**: Convert module by module -4. **Test**: Ensure each converted module works -5. **WASM**: Consider for heavy computation sections - -## Do NOT attempt automated bulk conversion. diff --git a/SECURITY.adoc b/SECURITY.adoc new file mode 100644 index 0000000..ee781a0 --- /dev/null +++ b/SECURITY.adoc @@ -0,0 +1,259 @@ +== Security Policy + +=== 🛡️ Security Philosophy + +DKIM Verifier is a *security-critical* email authentication extension. +We take security vulnerabilities extremely seriously and follow +responsible disclosure practices. + +==== Core Security Principles + +[arabic] +. *Defense in Depth*: Multi-layered security across authentication, +analysis, and sanitization +. *Privacy First*: All analysis performed locally by default; no +telemetry +. *Fail Secure*: Errors default to secure states (e.g., treat invalid +signatures as failures) +. *Least Privilege*: Minimal permissions requested from Thunderbird +. *Input Validation*: All external inputs (email headers, DNS responses) +rigorously validated +. *Sandboxing*: Dangerous content processed in isolated contexts + +=== 🔍 Supported Versions + +[cols=",,",options="header",] +|=== +|Version |Supported |Thunderbird Versions +|7.x |✅ Yes (Current) |128.0 - 145.* +|6.x |✅ Yes (Security fixes) |115.0 - 145.* +|< 6.0 |❌ No |EOL +|=== + +*Recommendation*: Always use the latest version for best security. + +=== 📢 Reporting a Vulnerability + +==== Responsible Disclosure + +*DO NOT* open public GitHub issues for security vulnerabilities. + +==== Reporting Channels + +[arabic] +. *Preferred*: Email to security contact (see +`+.well-known/security.txt+`) +. *Alternative*: Private vulnerability report via GitHub Security +Advisories + +==== What to Include + +* *Description*: Clear explanation of the vulnerability +* *Impact*: What can an attacker do? Who is affected? +* *Reproduction*: Step-by-step instructions to reproduce +* *Proof of Concept*: Code/config demonstrating the issue (if available) +* *Suggested Fix*: Optional, but appreciated +* *Disclosure Timeline*: Your expectations for fixing and disclosure + +==== Response Timeline + +* *Acknowledgment*: Within 48 hours +* *Initial Assessment*: Within 7 days +* *Fix Development*: Depends on severity (see below) +* *Public Disclosure*: After patch released + 7-14 days + +==== Severity Classifications + +[width="100%",cols="30%,28%,42%",options="header",] +|=== +|Severity |Examples |Response Time +|*Critical* |Remote code execution, email content exfiltration |24-48 +hours + +|*High* |Authentication bypass, signature forgery |7 days + +|*Medium* |Information disclosure, DoS |30 days + +|*Low* |UI confusion, non-security bugs |90 days +|=== + +==== Bug Bounty + +We currently do *not* offer a bug bounty program. However: - Security +researchers will be credited in release notes (with permission) - +Acknowledgments in SECURITY.md hall of fame - Our eternal gratitude 🙏 + +=== 🔐 Security Features + +==== Email Authentication + +* *DKIM Verification*: RFC 6376 compliant, cryptographic signature +validation +* *SPF Verification*: RFC 7208 compliant, sender authorization +* *DMARC*: Policy enforcement (existing module, enhanced in v7.0) +* *BIMI*: Brand indicator verification (planned v7.0) + +==== Threat Detection + +* *Phishing Detection*: 25+ heuristics, brand impersonation detection +* *Header Analysis*: TLS downgrade detection, privacy leak +identification +* *DNSBL*: 15+ spam/malware blacklist providers +* *VirusTotal*: URL/domain reputation checking (optional) +* *Bayesian Filter*: Adaptive spam classification + +==== Content Sanitization + +* *Script Removal*: Blocks JavaScript, VBScript, event handlers +* *Form Neutralization*: Prevents phishing credential harvesting +* *Link Analysis*: Detects homograph attacks, suspicious URLs +* *Sandboxed Processing*: Isolated email parsing and analysis + +==== Cryptographic Security + +* *DKIM Signing*: Uses `+tweetnacl-es6+` (Ed25519/RSA) +* *Key Storage*: Secure DKIM key caching (optional) +* *DNS Security*: DNSSEC support via libunbound (optional) +* *No Weak Crypto*: No MD5, SHA-1, RC4, or export-grade ciphers + +=== 🚨 Known Security Considerations + +==== By Design + +[arabic] +. *Network Dependency*: Email inherently requires network; cannot be +truly offline +. *Extension Permissions*: Requires `+messagesRead+`, `+storage+`, +`+accountsRead+` from Thunderbird +. *DNS Trust*: SPF/DKIM rely on DNS; DNSSEC recommended but optional +. *Third-Party APIs*: VirusTotal integration (optional) sends URLs to +third party + +==== Mitigations + +* *Rate Limiting*: DNS lookups limited per RFC (max 10 for SPF) +* *Timeout Protection*: Analysis capped at 30 seconds +* *Resource Limits*: Prevents DoS via malicious email headers +* *User Control*: Optional features can be disabled in preferences + +==== Threat Model + +*In Scope:* - ✅ Malicious email content (scripts, phishing, malware +links) - ✅ Forged email signatures (DKIM/SPF/DMARC bypass) - ✅ Privacy +leaks (IP exposure, tracking) - ✅ Authentication bypass - ✅ Extension +privilege escalation + +*Out of Scope:* - ❌ Thunderbird core vulnerabilities (report to +Mozilla) - ❌ Physical access attacks - ❌ Social engineering (outside +email content) - ❌ Zero-day exploits in dependencies (reported +upstream) + +=== 🔧 Security Best Practices for Users + +==== Recommended Settings + +[arabic] +. *Enable DNSSEC*: Use libunbound resolver for DNS validation +. *Enable All Checks*: SPF, DKIM, DMARC, phishing detection, Bayesian +filter +. *Auto-Update*: Keep extension updated for latest security fixes +. *Review Rules*: Audit custom security rules periodically +. *Train Bayesian*: Improve spam detection by training on real emails + +==== Privacy Settings + +* *Disable VirusTotal* if you don’t want URLs sent externally +* *Disable Favicons* to prevent external image loads +* *Review Telemetry*: Extension includes zero telemetry by default + +==== High-Security Environments + +* Use *libunbound* with DNSSEC for authenticated DNS +* Enable *strict DMARC* policy enforcement +* Set *quarantine mode* for suspicious emails +* Regularly review *security logs* (if enabled) + +=== 🏆 Security Hall of Fame + +We gratefully acknowledge security researchers who have responsibly +disclosed vulnerabilities: + +_No entries yet - be the first!_ + +=== 📚 Security Resources + +==== Documentation + +* https://datatracker.ietf.org/doc/html/rfc6376[DKIM RFC 6376] +* https://datatracker.ietf.org/doc/html/rfc7208[SPF RFC 7208] +* https://datatracker.ietf.org/doc/html/rfc7489[DMARC RFC 7489] +* https://www.dnssec.net/[DNSSEC] +* https://developer.thunderbird.net/add-ons/about-add-ons#security[Thunderbird +Extension Security] + +==== Security Tools + +* https://aykevl.nl/apps/mta-sts/[MTA-STS Validator] +* https://dmarcian.com/dmarc-inspector/[DMARC Analyzer] +* https://mxtoolbox.com/EmailHeaders.aspx[Email Header Analyzer] + +==== Related Projects + +* https://www.mozilla.org/security/known-vulnerabilities/thunderbird/[Thunderbird +Security Advisories] +* https://www.m3aawg.org/[Email Security Standards] + +=== 🔬 Security Audits + +==== Internal Audits + +* *Last Audit*: 2025-11-22 (v7.0 pre-release) +* *Scope*: Full codebase review, dependency analysis, threat modeling +* *Findings*: 0 critical, 0 high, 2 medium (addressed in v7.0) + +==== External Audits + +* No formal external audits conducted yet +* *Seeking*: Security firms interested in pro-bono extension audits + +==== Continuous Security + +* *Static Analysis*: ESLint with security rules +* *Type Safety*: TypeScript checking via JSDoc +* *Dependency Scanning*: Manual review (no automated tools for +WebExtensions yet) +* *Code Review*: All changes reviewed by maintainer + +=== 📜 Compliance + +==== Standards + +* ✅ *RFC 6376* (DKIM): Full compliance +* ✅ *RFC 7208* (SPF): Full compliance (v7.0) +* 🔄 *RFC 7489* (DMARC): Partial (enhanced in v7.0) +* 🔄 *RFC 9116* (security.txt): Implemented (v7.0) + +==== Privacy + +* ✅ *GDPR*: No personal data collection +* ✅ *Zero Telemetry*: No analytics or tracking +* ✅ *Local Processing*: All analysis on-device + +==== RSR Framework + +* 🔄 *Type Safety*: JSDoc + TypeScript checking +* 🔄 *Memory Safety*: JavaScript (GC managed) +* 🔄 *Documentation*: Complete (v7.0) +* 🔄 *TPCF*: Tri-Perimeter Contribution Framework (v7.0) + +=== 🤝 Security Contact + +See `+.well-known/security.txt+` for current contact information (RFC +9116 compliant). + +*PGP Key*: _To be added_ + +''''' + +*Last Updated*: 2025-11-22 *Version*: 7.0.0 *Maintained By*: See +MAINTAINERS.md diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 76334f0..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,219 +0,0 @@ - -# Security Policy - -## 🛡️ Security Philosophy - -DKIM Verifier is a **security-critical** email authentication extension. We take security vulnerabilities extremely seriously and follow responsible disclosure practices. - -### Core Security Principles - -1. **Defense in Depth**: Multi-layered security across authentication, analysis, and sanitization -2. **Privacy First**: All analysis performed locally by default; no telemetry -3. **Fail Secure**: Errors default to secure states (e.g., treat invalid signatures as failures) -4. **Least Privilege**: Minimal permissions requested from Thunderbird -5. **Input Validation**: All external inputs (email headers, DNS responses) rigorously validated -6. **Sandboxing**: Dangerous content processed in isolated contexts - -## 🔍 Supported Versions - -| Version | Supported | Thunderbird Versions | -| ------- | ------------------ | -------------------- | -| 7.x | ✅ Yes (Current) | 128.0 - 145.* | -| 6.x | ✅ Yes (Security fixes) | 115.0 - 145.* | -| < 6.0 | ❌ No | EOL | - -**Recommendation**: Always use the latest version for best security. - -## 📢 Reporting a Vulnerability - -### Responsible Disclosure - -**DO NOT** open public GitHub issues for security vulnerabilities. - -### Reporting Channels - -1. **Preferred**: Email to security contact (see `.well-known/security.txt`) -2. **Alternative**: Private vulnerability report via GitHub Security Advisories - -### What to Include - -- **Description**: Clear explanation of the vulnerability -- **Impact**: What can an attacker do? Who is affected? -- **Reproduction**: Step-by-step instructions to reproduce -- **Proof of Concept**: Code/config demonstrating the issue (if available) -- **Suggested Fix**: Optional, but appreciated -- **Disclosure Timeline**: Your expectations for fixing and disclosure - -### Response Timeline - -- **Acknowledgment**: Within 48 hours -- **Initial Assessment**: Within 7 days -- **Fix Development**: Depends on severity (see below) -- **Public Disclosure**: After patch released + 7-14 days - -### Severity Classifications - -| Severity | Examples | Response Time | -|----------|----------|---------------| -| **Critical** | Remote code execution, email content exfiltration | 24-48 hours | -| **High** | Authentication bypass, signature forgery | 7 days | -| **Medium** | Information disclosure, DoS | 30 days | -| **Low** | UI confusion, non-security bugs | 90 days | - -### Bug Bounty - -We currently do **not** offer a bug bounty program. However: -- Security researchers will be credited in release notes (with permission) -- Acknowledgments in SECURITY.md hall of fame -- Our eternal gratitude 🙏 - -## 🔐 Security Features - -### Email Authentication -- **DKIM Verification**: RFC 6376 compliant, cryptographic signature validation -- **SPF Verification**: RFC 7208 compliant, sender authorization -- **DMARC**: Policy enforcement (existing module, enhanced in v7.0) -- **BIMI**: Brand indicator verification (planned v7.0) - -### Threat Detection -- **Phishing Detection**: 25+ heuristics, brand impersonation detection -- **Header Analysis**: TLS downgrade detection, privacy leak identification -- **DNSBL**: 15+ spam/malware blacklist providers -- **VirusTotal**: URL/domain reputation checking (optional) -- **Bayesian Filter**: Adaptive spam classification - -### Content Sanitization -- **Script Removal**: Blocks JavaScript, VBScript, event handlers -- **Form Neutralization**: Prevents phishing credential harvesting -- **Link Analysis**: Detects homograph attacks, suspicious URLs -- **Sandboxed Processing**: Isolated email parsing and analysis - -### Cryptographic Security -- **DKIM Signing**: Uses `tweetnacl-es6` (Ed25519/RSA) -- **Key Storage**: Secure DKIM key caching (optional) -- **DNS Security**: DNSSEC support via libunbound (optional) -- **No Weak Crypto**: No MD5, SHA-1, RC4, or export-grade ciphers - -## 🚨 Known Security Considerations - -### By Design -1. **Network Dependency**: Email inherently requires network; cannot be truly offline -2. **Extension Permissions**: Requires `messagesRead`, `storage`, `accountsRead` from Thunderbird -3. **DNS Trust**: SPF/DKIM rely on DNS; DNSSEC recommended but optional -4. **Third-Party APIs**: VirusTotal integration (optional) sends URLs to third party - -### Mitigations -- **Rate Limiting**: DNS lookups limited per RFC (max 10 for SPF) -- **Timeout Protection**: Analysis capped at 30 seconds -- **Resource Limits**: Prevents DoS via malicious email headers -- **User Control**: Optional features can be disabled in preferences - -### Threat Model - -**In Scope:** -- ✅ Malicious email content (scripts, phishing, malware links) -- ✅ Forged email signatures (DKIM/SPF/DMARC bypass) -- ✅ Privacy leaks (IP exposure, tracking) -- ✅ Authentication bypass -- ✅ Extension privilege escalation - -**Out of Scope:** -- ❌ Thunderbird core vulnerabilities (report to Mozilla) -- ❌ Physical access attacks -- ❌ Social engineering (outside email content) -- ❌ Zero-day exploits in dependencies (reported upstream) - -## 🔧 Security Best Practices for Users - -### Recommended Settings -1. **Enable DNSSEC**: Use libunbound resolver for DNS validation -2. **Enable All Checks**: SPF, DKIM, DMARC, phishing detection, Bayesian filter -3. **Auto-Update**: Keep extension updated for latest security fixes -4. **Review Rules**: Audit custom security rules periodically -5. **Train Bayesian**: Improve spam detection by training on real emails - -### Privacy Settings -- **Disable VirusTotal** if you don't want URLs sent externally -- **Disable Favicons** to prevent external image loads -- **Review Telemetry**: Extension includes zero telemetry by default - -### High-Security Environments -- Use **libunbound** with DNSSEC for authenticated DNS -- Enable **strict DMARC** policy enforcement -- Set **quarantine mode** for suspicious emails -- Regularly review **security logs** (if enabled) - -## 🏆 Security Hall of Fame - -We gratefully acknowledge security researchers who have responsibly disclosed vulnerabilities: - -*No entries yet - be the first!* - -## 📚 Security Resources - -### Documentation -- [DKIM RFC 6376](https://datatracker.ietf.org/doc/html/rfc6376) -- [SPF RFC 7208](https://datatracker.ietf.org/doc/html/rfc7208) -- [DMARC RFC 7489](https://datatracker.ietf.org/doc/html/rfc7489) -- [DNSSEC](https://www.dnssec.net/) -- [Thunderbird Extension Security](https://developer.thunderbird.net/add-ons/about-add-ons#security) - -### Security Tools -- [MTA-STS Validator](https://aykevl.nl/apps/mta-sts/) -- [DMARC Analyzer](https://dmarcian.com/dmarc-inspector/) -- [Email Header Analyzer](https://mxtoolbox.com/EmailHeaders.aspx) - -### Related Projects -- [Thunderbird Security Advisories](https://www.mozilla.org/security/known-vulnerabilities/thunderbird/) -- [Email Security Standards](https://www.m3aawg.org/) - -## 🔬 Security Audits - -### Internal Audits -- **Last Audit**: 2025-11-22 (v7.0 pre-release) -- **Scope**: Full codebase review, dependency analysis, threat modeling -- **Findings**: 0 critical, 0 high, 2 medium (addressed in v7.0) - -### External Audits -- No formal external audits conducted yet -- **Seeking**: Security firms interested in pro-bono extension audits - -### Continuous Security -- **Static Analysis**: ESLint with security rules -- **Type Safety**: TypeScript checking via JSDoc -- **Dependency Scanning**: Manual review (no automated tools for WebExtensions yet) -- **Code Review**: All changes reviewed by maintainer - -## 📜 Compliance - -### Standards -- ✅ **RFC 6376** (DKIM): Full compliance -- ✅ **RFC 7208** (SPF): Full compliance (v7.0) -- 🔄 **RFC 7489** (DMARC): Partial (enhanced in v7.0) -- 🔄 **RFC 9116** (security.txt): Implemented (v7.0) - -### Privacy -- ✅ **GDPR**: No personal data collection -- ✅ **Zero Telemetry**: No analytics or tracking -- ✅ **Local Processing**: All analysis on-device - -### RSR Framework -- 🔄 **Type Safety**: JSDoc + TypeScript checking -- 🔄 **Memory Safety**: JavaScript (GC managed) -- 🔄 **Documentation**: Complete (v7.0) -- 🔄 **TPCF**: Tri-Perimeter Contribution Framework (v7.0) - -## 🤝 Security Contact - -See `.well-known/security.txt` for current contact information (RFC 9116 compliant). - -**PGP Key**: *To be added* - ---- - -**Last Updated**: 2025-11-22 -**Version**: 7.0.0 -**Maintained By**: See MAINTAINERS.md diff --git a/TEST-NEEDS.adoc b/TEST-NEEDS.adoc new file mode 100644 index 0000000..4840d42 --- /dev/null +++ b/TEST-NEEDS.adoc @@ -0,0 +1,277 @@ +== Test Coverage Blitz: CRG C Achieved + +=== CRG Grade: C — ACHIEVED 2026-04-04 + +*Status:* COMPLETE - All CRG C requirements met + +*Date:* 2025-04-04 + +*Coverage Grade:* CRG C (Comprehensive Test Coverage) + +=== CRG C Requirements - All Satisfied + +==== Test Categories Implemented + +✅ *Unit Tests* (5 test suites, 48 tests) - Cryptographic type contracts +(crypto_types_test.ts) - DNS record parsing validation +(dns_record_test.ts) - Format validation and edge cases - All +DKIM/SPF/DMARC record types + +✅ *Property-Based Tests* (verification_properties_test.ts) - +Deterministic verification (same input → same output) - No false +positives (invalid signatures always fail) - Domain normalization +consistency - DNS label formation validity - Idempotency under +repetition - Comprehensive edge case coverage + +✅ *Smoke Tests* (Integrated in unit tests) - Basic functionality +validation - Record parsing smoke tests - Record type detection - +Forward compatibility checks + +✅ *Build Tests* (CI/CD via deno.json) - `+deno task test+` - Mocha +suite (293 tests) ✓ - `+deno task test:deno+` - Deno test suite (48 +tests) ✓ - `+deno task check+` - Type checking ✓ - `+deno task lint+` - +Code quality ✓ + +✅ *P2P (Property-Based) Tests* - Verification invariants - Domain +canonicalization properties - Selector/domain DNS label properties - +Consistency under repetition + +✅ *E2E Tests* (verification_pipeline_test.ts) - Complete DKIM +verification pipeline - DNS record fetch → parse → extract → verify flow +- SPF record evaluation - DMARC policy application - Error handling and +graceful degradation - Multiple verification step chains + +✅ *Reflexive Tests* (All tests validate their own invariants) - Type +contract validation - Format compliance checking - Round-trip +consistency - Error condition handling + +✅ *Contract Tests* (Built into each test suite) - Cryptographic +algorithm contracts - DNS record format contracts - DMARC policy value +contracts - Key ID format contracts - Hash value format contracts + +✅ *Aspect Tests* (security_test.ts) - Signature malleability prevention +- Key injection prevention - DNS spoofing resilience - Header injection +prevention - Unicode lookalike detection - Resource limit handling (DOS +prevention) - Null byte injection prevention - Case sensitivity in +verification + +✅ *Benchmarks* (verification_bench.ts, baselined) - DKIM record +parsing: 2.1-3.5 µs per operation - Signature validation: 88.5-407.5 ns +per operation - Policy evaluation: 28.9-31.8 ns per operation - Domain +canonicalization: 56.9-100.1 ns per operation - Combined pipeline: 2.7 +µs - Batch operations: 35.2 µs (10 records), 879.3 ns (20 domains) - All +baselines established for regression detection + +=== Test Organization + +.... +tests/ +├── unit/ +│ ├── crypto_types_test.ts # Algorithm, key ID, hash, DKIM field contracts +│ └── dns_record_test.ts # DKIM/SPF/DMARC record parsing, forward compat +├── property/ +│ └── verification_properties_test.ts # Determinism, no false positives, normalization +├── e2e/ +│ └── verification_pipeline_test.ts # Full verification flow, DNS→policy +├── aspect/ +│ └── security_test.ts # Malleability, injection, spoofing, DOS +└── bench/ + └── verification_bench.ts # Performance benchmarks (20 benchmarks) +.... + +=== Test Results Summary + +==== Unit Tests (crypto_types_test.ts) + +* Algorithm name validation: 5 tests ✓ +* Key ID format validation: 5 tests ✓ +* Hash value validation: 4 tests ✓ +* DKIM signature fields: 3 tests ✓ +* DMARC policy values: 7 tests ✓ + +==== DNS Record Tests (dns_record_test.ts) + +* DKIM parsing: 3 tests ✓ +* SPF parsing: 2 tests ✓ +* DMARC parsing: 4 tests ✓ +* Forward compatibility: 2 tests ✓ +* Error handling: 3 tests ✓ + +==== Property Tests (verification_properties_test.ts) + +* Determinism: 2 tests ✓ +* No false positives: 4 tests ✓ +* Domain normalization: 4 tests ✓ +* DNS label validity: 3 tests ✓ +* Consistency: 2 tests ✓ + +==== E2E Tests (verification_pipeline_test.ts) + +* DKIM success pipeline: 1 test ✓ +* DKIM failure handling: 2 tests ✓ +* DMARC evaluation: 4 tests ✓ +* Error handling: 2 tests ✓ +* Step validation: 1 test ✓ + +==== Security Tests (security_test.ts) + +* Signature malleability: 2 tests ✓ +* Key injection: 2 tests ✓ +* DNS spoofing: 1 test ✓ +* Header injection: 3 tests ✓ +* Unicode lookalikes: 1 test ✓ +* Resource limits: 3 tests ✓ + +==== Benchmarks (verification_bench.ts) + +* Parsing group: 3 benchmarks ✓ +* Validation group: 3 benchmarks ✓ +* Evaluation group: 3 benchmarks ✓ +* Canonicalization group: 3 benchmarks ✓ +* Pipeline group: 1 benchmark ✓ +* Batch group: 2 benchmarks ✓ + +=== Pass Rates + +[cols=",,,",options="header",] +|=== +|Suite |Tests |Passed |Failed +|Mocha (existing) |293 |293 |0 +|Deno (new) |48 |48 |0 +|Benchmarks |20 |20 |0 +|*Total* |*361* |*361* |*0* +|=== + +*Overall Pass Rate: 100%* ✓ + +=== Key Test Scenarios Covered + +==== Verification Correctness + +* Valid DKIM signatures pass verification +* Invalid signatures always fail +* Modified signatures fail verification +* Missing DNS records handled gracefully +* Empty signatures rejected + +==== Format Validation + +* Algorithm names (rsa-sha256, ed25519-sha256, etc.) +* Key IDs (alphanumeric, hyphen, underscore) +* Hash values (hex format, correct length for algorithm) +* DKIM signatures (all required fields present) +* DMARC policies (none/quarantine/reject only) + +==== DNS Record Parsing + +* DKIM records (v=DKIM1 prefix required) +* SPF records (v=spf1 prefix required) +* DMARC records (v=DMARC1 prefix required) +* Forward compatibility (unknown tags ignored) +* Mixed whitespace handling + +==== Security Properties + +* Signature malleability prevented (byte-exact matching) +* Key injection prevented (CRLF filtering, tag validation) +* DNS spoofing mitigated (unsigned vs signed record distinction) +* Header injection prevented (CRLF/null byte sanitization) +* Unicode homoglyph detection +* DOS prevention (65KB record size limits) + +==== Deterministic Behavior + +* Same input always produces same output +* Determinism maintained across repeated calls +* Domain normalization consistent +* DNS label formation valid + +=== Performance Baselines + +* *Fastest operation:* DMARC policy evaluation (~28.9 ns) +* *Slowest operation:* DKIM record parsing (~3.5 µs) +* *Combined pipeline:* 2.7 µs per verification cycle +* *Batch parsing (10 records):* 35.2 µs +* *Batch canonicalization (20 domains):* 879.3 ns + +All benchmarks establish baseline for regression detection. + +=== Files Modified/Created + +==== New Test Files (5) + +* `+tests/unit/crypto_types_test.ts+` - 145 lines +* `+tests/unit/dns_record_test.ts+` - 193 lines +* `+tests/property/verification_properties_test.ts+` - 208 lines +* `+tests/e2e/verification_pipeline_test.ts+` - 348 lines +* `+tests/aspect/security_test.ts+` - 298 lines +* `+tests/bench/verification_bench.ts+` - 193 lines + +==== Configuration Updated + +* `+deno.json+` - Added test:deno, test:deno:watch, test:bench tasks + +==== Cleanup + +* Deleted `+tests/fuzz/placeholder.txt+` (empty placeholder) + +=== Deno Configuration + +Added new tasks to `+deno.json+`: - `+deno task test:deno+` - Run new +Deno test suite - `+deno task test:deno:watch+` - Watch mode for +development - `+deno task test:bench+` - Run benchmarks - +`+deno task verify+` - Updated to include all test suites + +=== License & Attribution + +* All new test files: SPDX-License-Identifier: CC-BY-SA-4.0 +* Author: Jonathan D.A. Jewell +6759885+hyperpolymath@users.noreply.github.com +* Respects existing MIT license of rrecord-verity + +=== Next Steps (Optional, for D→A progression) + +[arabic] +. *Mutation Testing* - Verify test quality by introducing code mutations +. *Fuzzing* - Property-based fuzzing of record parsers +. *Integration Tests* - Real DNS queries (with mocking/fixtures) +. *Formal Verification* - Idris2 proofs for cryptographic contracts +. *Coverage Metrics* - Statement/branch/path coverage analysis + +=== Verification Commands + +[source,bash] +---- +# Run all existing Mocha tests +deno task test + +# Run new Deno tests +deno task test:deno + +# Run benchmarks with baselines +deno task test:bench + +# Full verification (lint + type check + all tests + RSR) +deno task verify + +# Watch mode for development +deno task test:deno:watch +---- + +=== Grade Justification: CRG C + +✅ *Unit Tests* - 15 comprehensive unit test specs + +✅ *Smoke Tests* - Integrated throughout unit tests + +✅ *Build Tests* - All CI tasks passing + +✅ *P2P Tests* - 9 property-based invariant tests + +✅ *E2E Tests* - 10 end-to-end pipeline tests + +✅ *Reflexive Tests* - All tests validate their own invariants + +✅ *Contract Tests* - Format/behavior contracts on every suite + +✅ *Aspect Tests* - 15 security/quality aspect tests + +✅ *Benchmarks* - 20 performance benchmarks with baselines + +✅ *Pass Rate* - 100% (361/361 tests) + +*All CRG C requirements satisfied. Ready for deployment.* + +''''' + +*Test Blitz Completed:* 2025-04-04 + +*Generated with comprehensive test coverage methodology* diff --git a/TEST-NEEDS.md b/TEST-NEEDS.md deleted file mode 100644 index b472b2d..0000000 --- a/TEST-NEEDS.md +++ /dev/null @@ -1,285 +0,0 @@ - -# Test Coverage Blitz: CRG C Achieved - -## CRG Grade: C — ACHIEVED 2026-04-04 - -**Status:** COMPLETE - All CRG C requirements met -**Date:** 2025-04-04 -**Coverage Grade:** CRG C (Comprehensive Test Coverage) - -## CRG C Requirements - All Satisfied - -### Test Categories Implemented - -✅ **Unit Tests** (5 test suites, 48 tests) -- Cryptographic type contracts (crypto_types_test.ts) -- DNS record parsing validation (dns_record_test.ts) -- Format validation and edge cases -- All DKIM/SPF/DMARC record types - -✅ **Property-Based Tests** (verification_properties_test.ts) -- Deterministic verification (same input → same output) -- No false positives (invalid signatures always fail) -- Domain normalization consistency -- DNS label formation validity -- Idempotency under repetition -- Comprehensive edge case coverage - -✅ **Smoke Tests** (Integrated in unit tests) -- Basic functionality validation -- Record parsing smoke tests -- Record type detection -- Forward compatibility checks - -✅ **Build Tests** (CI/CD via deno.json) -- `deno task test` - Mocha suite (293 tests) ✓ -- `deno task test:deno` - Deno test suite (48 tests) ✓ -- `deno task check` - Type checking ✓ -- `deno task lint` - Code quality ✓ - -✅ **P2P (Property-Based) Tests** -- Verification invariants -- Domain canonicalization properties -- Selector/domain DNS label properties -- Consistency under repetition - -✅ **E2E Tests** (verification_pipeline_test.ts) -- Complete DKIM verification pipeline -- DNS record fetch → parse → extract → verify flow -- SPF record evaluation -- DMARC policy application -- Error handling and graceful degradation -- Multiple verification step chains - -✅ **Reflexive Tests** (All tests validate their own invariants) -- Type contract validation -- Format compliance checking -- Round-trip consistency -- Error condition handling - -✅ **Contract Tests** (Built into each test suite) -- Cryptographic algorithm contracts -- DNS record format contracts -- DMARC policy value contracts -- Key ID format contracts -- Hash value format contracts - -✅ **Aspect Tests** (security_test.ts) -- Signature malleability prevention -- Key injection prevention -- DNS spoofing resilience -- Header injection prevention -- Unicode lookalike detection -- Resource limit handling (DOS prevention) -- Null byte injection prevention -- Case sensitivity in verification - -✅ **Benchmarks** (verification_bench.ts, baselined) -- DKIM record parsing: 2.1-3.5 µs per operation -- Signature validation: 88.5-407.5 ns per operation -- Policy evaluation: 28.9-31.8 ns per operation -- Domain canonicalization: 56.9-100.1 ns per operation -- Combined pipeline: 2.7 µs -- Batch operations: 35.2 µs (10 records), 879.3 ns (20 domains) -- All baselines established for regression detection - -## Test Organization - -``` -tests/ -├── unit/ -│ ├── crypto_types_test.ts # Algorithm, key ID, hash, DKIM field contracts -│ └── dns_record_test.ts # DKIM/SPF/DMARC record parsing, forward compat -├── property/ -│ └── verification_properties_test.ts # Determinism, no false positives, normalization -├── e2e/ -│ └── verification_pipeline_test.ts # Full verification flow, DNS→policy -├── aspect/ -│ └── security_test.ts # Malleability, injection, spoofing, DOS -└── bench/ - └── verification_bench.ts # Performance benchmarks (20 benchmarks) -``` - -## Test Results Summary - -### Unit Tests (crypto_types_test.ts) -- Algorithm name validation: 5 tests ✓ -- Key ID format validation: 5 tests ✓ -- Hash value validation: 4 tests ✓ -- DKIM signature fields: 3 tests ✓ -- DMARC policy values: 7 tests ✓ - -### DNS Record Tests (dns_record_test.ts) -- DKIM parsing: 3 tests ✓ -- SPF parsing: 2 tests ✓ -- DMARC parsing: 4 tests ✓ -- Forward compatibility: 2 tests ✓ -- Error handling: 3 tests ✓ - -### Property Tests (verification_properties_test.ts) -- Determinism: 2 tests ✓ -- No false positives: 4 tests ✓ -- Domain normalization: 4 tests ✓ -- DNS label validity: 3 tests ✓ -- Consistency: 2 tests ✓ - -### E2E Tests (verification_pipeline_test.ts) -- DKIM success pipeline: 1 test ✓ -- DKIM failure handling: 2 tests ✓ -- DMARC evaluation: 4 tests ✓ -- Error handling: 2 tests ✓ -- Step validation: 1 test ✓ - -### Security Tests (security_test.ts) -- Signature malleability: 2 tests ✓ -- Key injection: 2 tests ✓ -- DNS spoofing: 1 test ✓ -- Header injection: 3 tests ✓ -- Unicode lookalikes: 1 test ✓ -- Resource limits: 3 tests ✓ - -### Benchmarks (verification_bench.ts) -- Parsing group: 3 benchmarks ✓ -- Validation group: 3 benchmarks ✓ -- Evaluation group: 3 benchmarks ✓ -- Canonicalization group: 3 benchmarks ✓ -- Pipeline group: 1 benchmark ✓ -- Batch group: 2 benchmarks ✓ - -## Pass Rates - -| Suite | Tests | Passed | Failed | -|-------|-------|--------|--------| -| Mocha (existing) | 293 | 293 | 0 | -| Deno (new) | 48 | 48 | 0 | -| Benchmarks | 20 | 20 | 0 | -| **Total** | **361** | **361** | **0** | - -**Overall Pass Rate: 100%** ✓ - -## Key Test Scenarios Covered - -### Verification Correctness -- Valid DKIM signatures pass verification -- Invalid signatures always fail -- Modified signatures fail verification -- Missing DNS records handled gracefully -- Empty signatures rejected - -### Format Validation -- Algorithm names (rsa-sha256, ed25519-sha256, etc.) -- Key IDs (alphanumeric, hyphen, underscore) -- Hash values (hex format, correct length for algorithm) -- DKIM signatures (all required fields present) -- DMARC policies (none/quarantine/reject only) - -### DNS Record Parsing -- DKIM records (v=DKIM1 prefix required) -- SPF records (v=spf1 prefix required) -- DMARC records (v=DMARC1 prefix required) -- Forward compatibility (unknown tags ignored) -- Mixed whitespace handling - -### Security Properties -- Signature malleability prevented (byte-exact matching) -- Key injection prevented (CRLF filtering, tag validation) -- DNS spoofing mitigated (unsigned vs signed record distinction) -- Header injection prevented (CRLF/null byte sanitization) -- Unicode homoglyph detection -- DOS prevention (65KB record size limits) - -### Deterministic Behavior -- Same input always produces same output -- Determinism maintained across repeated calls -- Domain normalization consistent -- DNS label formation valid - -## Performance Baselines - -- **Fastest operation:** DMARC policy evaluation (~28.9 ns) -- **Slowest operation:** DKIM record parsing (~3.5 µs) -- **Combined pipeline:** 2.7 µs per verification cycle -- **Batch parsing (10 records):** 35.2 µs -- **Batch canonicalization (20 domains):** 879.3 ns - -All benchmarks establish baseline for regression detection. - -## Files Modified/Created - -### New Test Files (5) -- `tests/unit/crypto_types_test.ts` - 145 lines -- `tests/unit/dns_record_test.ts` - 193 lines -- `tests/property/verification_properties_test.ts` - 208 lines -- `tests/e2e/verification_pipeline_test.ts` - 348 lines -- `tests/aspect/security_test.ts` - 298 lines -- `tests/bench/verification_bench.ts` - 193 lines - -### Configuration Updated -- `deno.json` - Added test:deno, test:deno:watch, test:bench tasks - -### Cleanup -- Deleted `tests/fuzz/placeholder.txt` (empty placeholder) - -## Deno Configuration - -Added new tasks to `deno.json`: -- `deno task test:deno` - Run new Deno test suite -- `deno task test:deno:watch` - Watch mode for development -- `deno task test:bench` - Run benchmarks -- `deno task verify` - Updated to include all test suites - -## License & Attribution - -- All new test files: SPDX-License-Identifier: CC-BY-SA-4.0 -- Author: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com> -- Respects existing MIT license of rrecord-verity - -## Next Steps (Optional, for D→A progression) - -1. **Mutation Testing** - Verify test quality by introducing code mutations -2. **Fuzzing** - Property-based fuzzing of record parsers -3. **Integration Tests** - Real DNS queries (with mocking/fixtures) -4. **Formal Verification** - Idris2 proofs for cryptographic contracts -5. **Coverage Metrics** - Statement/branch/path coverage analysis - -## Verification Commands - -```bash -# Run all existing Mocha tests -deno task test - -# Run new Deno tests -deno task test:deno - -# Run benchmarks with baselines -deno task test:bench - -# Full verification (lint + type check + all tests + RSR) -deno task verify - -# Watch mode for development -deno task test:deno:watch -``` - -## Grade Justification: CRG C - -✅ **Unit Tests** - 15 comprehensive unit test specs -✅ **Smoke Tests** - Integrated throughout unit tests -✅ **Build Tests** - All CI tasks passing -✅ **P2P Tests** - 9 property-based invariant tests -✅ **E2E Tests** - 10 end-to-end pipeline tests -✅ **Reflexive Tests** - All tests validate their own invariants -✅ **Contract Tests** - Format/behavior contracts on every suite -✅ **Aspect Tests** - 15 security/quality aspect tests -✅ **Benchmarks** - 20 performance benchmarks with baselines -✅ **Pass Rate** - 100% (361/361 tests) - -**All CRG C requirements satisfied. Ready for deployment.** - ---- - -**Test Blitz Completed:** 2025-04-04 -**Generated with comprehensive test coverage methodology** diff --git a/TOPOLOGY.md b/TOPOLOGY.adoc similarity index 89% rename from TOPOLOGY.md rename to TOPOLOGY.adoc index ea82d4f..fc2f249 100644 --- a/TOPOLOGY.md +++ b/TOPOLOGY.adoc @@ -1,15 +1,8 @@ - - - +== RRecord Verity — Project Topology -# RRecord Verity — Project Topology +=== System Architecture -## System Architecture - -``` +.... ┌─────────────────────────────────────────┐ │ THUNDERBIRD USER │ │ (Email Interface / Security HUD) │ @@ -53,11 +46,11 @@ Copyright (c) Jonathan D.A. Jewell │ Justfile Automation .machine_readable/ │ │ Deno / Node (Pack) 0-AI-MANIFEST.a2ml │ └─────────────────────────────────────────┘ -``` +.... -## Completion Dashboard +=== Completion Dashboard -``` +.... COMPONENT STATUS NOTES ───────────────────────────────── ────────────────── ───────────────────────────────── CORE VERIFICATION @@ -79,25 +72,26 @@ REPO INFRASTRUCTURE ───────────────────────────────────────────────────────────────────────────── OVERALL: █████████░ ~95% Security suite stable & production -``` +.... -## Key Dependencies +=== Key Dependencies -``` +.... Email Header ────► DNS Resolver ─────► DKIM/SPF/DMARC ──► Trust HUD │ │ │ │ ▼ ▼ ▼ ▼ Content Page ───► Phishing Heur ────► DNSBL Check ──────► Warning -``` +.... -## Update Protocol +=== Update Protocol This file is maintained by both humans and AI agents. When updating: -1. **After completing a component**: Change its bar and percentage -2. **After adding a component**: Add a new row in the appropriate section -3. **After architectural changes**: Update the ASCII diagram -4. **Date**: Update the `Last updated` comment at the top of this file +[arabic] +. *After completing a component*: Change its bar and percentage +. *After adding a component*: Add a new row in the appropriate section +. *After architectural changes*: Update the ASCII diagram +. *Date*: Update the `+Last updated+` comment at the top of this file -Progress bars use: `█` (filled) and `░` (empty), 10 characters wide. -Percentages: 0%, 10%, 20%, ... 100% (in 10% increments). +Progress bars use: `+█+` (filled) and `+░+` (empty), 10 characters wide. +Percentages: 0%, 10%, 20%, … 100% (in 10% increments). diff --git a/_locales/Readme.adoc b/_locales/Readme.adoc new file mode 100644 index 0000000..842430f --- /dev/null +++ b/_locales/Readme.adoc @@ -0,0 +1,22 @@ +== Localization + +If you are a translator new to localize WebExtension, you may want to +read +https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Internationalization +and the +https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/i18n/Locale-Specific_Message_reference[locale-specific +message reference]. + +The English strings in `+en_US+` are the reference for the other +translations. + +The `+messages.json+` files contains all localized strings used in the +extension. Note that you don’t need to translate the `+description+` +part. That will never show up in the UI. It is only there to help the +translating of the messages, by e.g. making it more obvious in which +context the message is shown. + +The `+description.txt+`, `+developerComments.txt+` and +`+privacyPolicy.txt+` are not directly used in the extension, and are +optional. They are used for the add-on description on +https://addons.thunderbird.net/thunderbird/addon/dkim-verifier/. diff --git a/_locales/Readme.md b/_locales/Readme.md deleted file mode 100644 index 8e68241..0000000 --- a/_locales/Readme.md +++ /dev/null @@ -1,19 +0,0 @@ - -# Localization - -If you are a translator new to localize WebExtension, -you may want to read -and the [locale-specific message reference](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/i18n/Locale-Specific_Message_reference). - -The English strings in `en_US` are the reference for the other translations. - -The `messages.json` files contains all localized strings used in the extension. -Note that you don't need to translate the `description` part. -That will never show up in the UI. It is only there to help the translating of the messages, -by e.g. making it more obvious in which context the message is shown. - -The `description.txt`, `developerComments.txt` and `privacyPolicy.txt` are not directly used in the extension, and are optional. -They are used for the add-on description on . diff --git a/data/favicon/README.adoc b/data/favicon/README.adoc new file mode 100644 index 0000000..e5a3f81 --- /dev/null +++ b/data/favicon/README.adoc @@ -0,0 +1,4 @@ +Disclaimer: All icon resources in this folder are the property of their +respective copyright holders. They are only used by the add-on to let +users better recognize the sender of an e-mail, which should be covered +by fair use. diff --git a/data/favicon/README.md b/data/favicon/README.md deleted file mode 100644 index 412035a..0000000 --- a/data/favicon/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -Disclaimer: All icon resources in this folder are the property of their respective copyright holders. They are only used by the add-on to let users better recognize the sender of an e-mail, which should be covered by fair use. \ No newline at end of file diff --git a/docs/reports/audit/audit-2026-04-15-post.adoc b/docs/reports/audit/audit-2026-04-15-post.adoc new file mode 100644 index 0000000..0affd6b --- /dev/null +++ b/docs/reports/audit/audit-2026-04-15-post.adoc @@ -0,0 +1,160 @@ +== POST-audit status report + +Repo: rrecord-verity Actions taken: - Added TS blocker workflow - Added +NPM/Bun blocker workflow - Managed lockfiles - Synced repo (Dependabot, +.scm, Justfile) Remaining findings: \{ "`program_path`": "`.`", +"`language`": "`javascript`", "`frameworks`": [], "`weak_points`": [ \{ +"`category`": "`InsecureProtocol`", "`location`": +"`experiments/JSDNS.mjs`", "`file`": "`experiments/JSDNS.mjs`", +"`severity`": "`Medium`", "`description`": "`3 HTTP (non-HTTPS) URLs in +experiments/JSDNS.mjs`", "`recommended_attack`": [ "`network`" ] }, \{ +"`category`": "`InsecureProtocol`", "`location`": +"`experiments/libunboundWorker.js`", "`file`": +"`experiments/libunboundWorker.js`", "`severity`": "`Medium`", +"`description`": "`1 HTTP (non-HTTPS) URLs in +experiments/libunboundWorker.js`", "`recommended_attack`": [ "`network`" +] }, \{ "`category`": "`InputBoundary`", "`location`": +"`modules/dkim/favicon.mjs.js`", "`file`": +"`modules/dkim/favicon.mjs.js`", "`severity`": "`Medium`", +"`description`": "`1 JSON.parse call(s) with 0 try block(s) in +modules/dkim/favicon.mjs.js — JSON.parse throws SyntaxError on malformed +input; wrap in try-catch`", "`recommended_attack`": [ "`cpu`" ] }, \{ +"`category`": "`InsecureProtocol`", "`location`": +"`modules/dnsbl.mjs.js`", "`file`": "`modules/dnsbl.mjs.js`", +"`severity`": "`Medium`", "`description`": "`1 HTTP (non-HTTPS) URLs in +modules/dnsbl.mjs.js`", "`recommended_attack`": [ "`network`" ] }, \{ +"`category`": "`InputBoundary`", "`location`": +"`modules/resultStorage.mjs.js`", "`file`": +"`modules/resultStorage.mjs.js`", "`severity`": "`Medium`", +"`description`": "`1 JSON.parse call(s) with 0 try block(s) in +modules/resultStorage.mjs.js — JSON.parse throws SyntaxError on +malformed input; wrap in try-catch`", "`recommended_attack`": [ "`cpu`" +] }, \{ "`category`": "`InputBoundary`", "`location`": +"`scripts/update-thirdparty.js`", "`file`": +"`scripts/update-thirdparty.js`", "`severity`": "`Medium`", +"`description`": "`1 JSON.parse call(s) with 0 try block(s) in +scripts/update-thirdparty.js — JSON.parse throws SyntaxError on +malformed input; wrap in try-catch`", "`recommended_attack`": [ "`cpu`" +] }, \{ "`category`": "`DynamicCodeExecution`", "`location`": +"`scripts/verify-rsr.js`", "`file`": "`scripts/verify-rsr.js`", +"`severity`": "`Critical`", "`description`": "`eval() usage in +scripts/verify-rsr.js`", "`recommended_attack`": [ "`cpu`", "`memory`" ] +}, \{ "`category`": "`InputBoundary`", "`location`": +"`test/helpers/initWebExtensions.mjs.js`", "`file`": +"`test/helpers/initWebExtensions.mjs.js`", "`severity`": "`Medium`", +"`description`": "`1 JSON.parse call(s) with 0 try block(s) in +test/helpers/initWebExtensions.mjs.js — JSON.parse throws SyntaxError on +malformed input; wrap in try-catch`", "`recommended_attack`": [ "`cpu`" +] }, \{ "`category`": "`InputBoundary`", "`location`": +"`test/unittest/authVerifierSpec.mjs.js`", "`file`": +"`test/unittest/authVerifierSpec.mjs.js`", "`severity`": "`Medium`", +"`description`": "`2 JSON.parse call(s) with 0 try block(s) in +test/unittest/authVerifierSpec.mjs.js — JSON.parse throws SyntaxError on +malformed input; wrap in try-catch`", "`recommended_attack`": [ "`cpu`" +] }, \{ "`category`": "`DynamicCodeExecution`", "`location`": +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", "`file`": +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", "`severity`": +"`High`", "`description`": "`DOM manipulation (innerHTML/document.write) +in thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", +"`recommended_attack`": [ "`memory`", "`network`" ] }, \{ "`category`": +"`InputBoundary`", "`location`": +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", "`file`": +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", "`severity`": +"`Medium`", "`description`": "`12 JSON.parse call(s) with 8 try block(s) +in thirdparty/tabulator-tables/dist/js/tabulator_esm.js — JSON.parse +throws SyntaxError on malformed input; wrap in try-catch`", +"`recommended_attack`": [ "`cpu`" ] }, \{ "`category`": +"`UncheckedError`", "`location`": +"`contractiles/k9/template-hunt.k9.ncl`", "`file`": +"`contractiles/k9/template-hunt.k9.ncl`", "`severity`": "`Low`", +"`description`": "`14 TODO/FIXME/HACK markers in +contractiles/k9/template-hunt.k9.ncl`", "`recommended_attack`": [ +"`cpu`" ] }, \{ "`category`": "`SupplyChain`", "`location`": +"`flake.nix`", "`file`": "`flake.nix`", "`severity`": "`High`", +"`description`": "`flake.nix declares inputs without narHash, rev +pinning, or sibling flake.lock — dependency revision is unpinned in +flake.nix`", "`recommended_attack`": [] } ], "`statistics`": \{ +"`total_lines`": 60112, "`unsafe_blocks`": 0, "`panic_sites`": 0, +"`unwrap_calls`": 4, "`allocation_sites`": 1, "`io_operations`": 36, +"`threading_constructs`": 2 }, "`file_statistics`": [ \{ "`file_path`": +"`experiments/libunbound.js`", "`lines`": 419, "`unsafe_blocks`": 0, +"`panic_sites`": 0, "`unwrap_calls`": 0, "`allocation_sites`": 0, +"`io_operations`": 0, "`threading_constructs`": 2 }, \{ "`file_path`": +"`modules/dkim/keyStore.mjs.js`", "`lines`": 388, "`unsafe_blocks`": 0, +"`panic_sites`": 0, "`unwrap_calls`": 0, "`allocation_sites`": 0, +"`io_operations`": 3, "`threading_constructs`": 0 }, \{ "`file_path`": +"`modules/extensionUtils.mjs.js`", "`lines`": 180, "`unsafe_blocks`": 0, +"`panic_sites`": 0, "`unwrap_calls`": 0, "`allocation_sites`": 0, +"`io_operations`": 1, "`threading_constructs`": 0 }, \{ "`file_path`": +"`modules/virusTotalIntegration.mjs.js`", "`lines`": 439, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 4, "`threading_constructs`": +0 }, \{ "`file_path`": "`scripts/atnChangelog.js`", "`lines`": 24, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 1, "`threading_constructs`": +0 }, \{ "`file_path`": "`scripts/pack.js`", "`lines`": 205, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 4, "`threading_constructs`": +0 }, \{ "`file_path`": "`scripts/update-thirdparty.js`", "`lines`": 57, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 2, "`threading_constructs`": +0 }, \{ "`file_path`": "`test/helpers/testUtils.mjs.js`", "`lines`": +109, "`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 2, "`threading_constructs`": +0 }, \{ "`file_path`": "`test/unittest/keyStoreSpec.mjs.js`", "`lines`": +209, "`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 12, +"`threading_constructs`": 0 }, \{ "`file_path`": +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`", "`lines`": +29671, "`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 0, +"`allocation_sites`": 0, "`io_operations`": 2, "`threading_constructs`": +0 }, \{ "`file_path`": "`wasm/crypto/src/lib.rs`", "`lines`": 214, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 1, +"`allocation_sites`": 0, "`io_operations`": 0, "`threading_constructs`": +0 }, \{ "`file_path`": "`wasm/parser/src/lib.rs`", "`lines`": 235, +"`unsafe_blocks`": 0, "`panic_sites`": 0, "`unwrap_calls`": 3, +"`allocation_sites`": 1, "`io_operations`": 0, "`threading_constructs`": +0 }, \{ "`file_path`": "`setup.sh`", "`lines`": 278, "`unsafe_blocks`": +0, "`panic_sites`": 0, "`unwrap_calls`": 0, "`allocation_sites`": 0, +"`io_operations`": 3, "`threading_constructs`": 0 }, \{ "`file_path`": +"`flake.nix`", "`lines`": 116, "`unsafe_blocks`": 0, "`panic_sites`": 0, +"`unwrap_calls`": 0, "`allocation_sites`": 0, "`io_operations`": 2, +"`threading_constructs`": 0 } ], "`recommended_attacks`": [ "`disk`", +"`memory`", "`cpu`", "`network`" ], "`dependency_graph`": \{ "`edges`": +[ \{ "`from`": "`scripts/atnChangelog.js`", "`to`": "`scripts/pack.js`", +"`relation`": "`shared_dir:scripts`", "`weight`": 1.0 }, \{ "`from`": +"`scripts/pack.js`", "`to`": "`scripts/update-thirdparty.js`", +"`relation`": "`shared_dir:scripts`", "`weight`": 1.0 }, \{ "`from`": +"`modules/extensionUtils.mjs.js`", "`to`": +"`modules/virusTotalIntegration.mjs.js`", "`relation`": +"`shared_dir:modules`", "`weight`": 1.0 }, \{ "`from`": "`setup.sh`", +"`to`": "`flake.nix`", "`relation`": "`shared_dir:`", "`weight`": 1.0 } +] }, "`taint_matrix`": \{ "`rows`": [ \{ "`source_category`": +"`DynamicCodeExecution`", "`sink_axis`": "`cpu`", "`severity_value`": +5.0, "`files`": [ "`scripts/verify-rsr.js`" ], "`frameworks`": [], +"`relation`": "`DynamicCodeExecution->Cpu`" }, \{ "`source_category`": +"`InsecureProtocol`", "`sink_axis`": "`network`", "`severity_value`": +2.5, "`files`": [ "`experiments/JSDNS.mjs`", +"`experiments/libunboundWorker.js`", "`modules/dnsbl.mjs.js`" ], +"`frameworks`": [], "`relation`": "`InsecureProtocol->Network`" }, \{ +"`source_category`": "`DynamicCodeExecution`", "`sink_axis`": +"`memory`", "`severity_value`": 5.0, "`files`": [ +"`scripts/verify-rsr.js`", +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`" ], +"`frameworks`": [], "`relation`": "`DynamicCodeExecution->Memory`" }, \{ +"`source_category`": "`UncheckedError`", "`sink_axis`": "`cpu`", +"`severity_value`": 1.0, "`files`": [ +"`contractiles/k9/template-hunt.k9.ncl`" ], "`frameworks`": [], +"`relation`": "`UncheckedError->Cpu`" }, \{ "`source_category`": +"`DynamicCodeExecution`", "`sink_axis`": "`network`", +"`severity_value`": 3.5, "`files`": [ +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`" ], +"`frameworks`": [], "`relation`": "`DynamicCodeExecution->Network`" }, +\{ "`source_category`": "`InputBoundary`", "`sink_axis`": "`cpu`", +"`severity_value`": 2.5, "`files`": [ "`modules/dkim/favicon.mjs.js`", +"`modules/resultStorage.mjs.js`", "`scripts/update-thirdparty.js`", +"`test/helpers/initWebExtensions.mjs.js`", +"`test/unittest/authVerifierSpec.mjs.js`", +"`thirdparty/tabulator-tables/dist/js/tabulator_esm.js`" ], +"`frameworks`": [], "`relation`": "`InputBoundary->Cpu`" } ] } } CRG +Grade: D diff --git a/docs/reports/audit/audit-2026-04-15-post.md b/docs/reports/audit/audit-2026-04-15-post.md deleted file mode 100644 index 8acf46e..0000000 --- a/docs/reports/audit/audit-2026-04-15-post.md +++ /dev/null @@ -1,406 +0,0 @@ - -# POST-audit status report -Repo: rrecord-verity -Actions taken: -- Added TS blocker workflow -- Added NPM/Bun blocker workflow -- Managed lockfiles -- Synced repo (Dependabot, .scm, Justfile) -Remaining findings: { - "program_path": ".", - "language": "javascript", - "frameworks": [], - "weak_points": [ - { - "category": "InsecureProtocol", - "location": "experiments/JSDNS.mjs", - "file": "experiments/JSDNS.mjs", - "severity": "Medium", - "description": "3 HTTP (non-HTTPS) URLs in experiments/JSDNS.mjs", - "recommended_attack": [ - "network" - ] - }, - { - "category": "InsecureProtocol", - "location": "experiments/libunboundWorker.js", - "file": "experiments/libunboundWorker.js", - "severity": "Medium", - "description": "1 HTTP (non-HTTPS) URLs in experiments/libunboundWorker.js", - "recommended_attack": [ - "network" - ] - }, - { - "category": "InputBoundary", - "location": "modules/dkim/favicon.mjs.js", - "file": "modules/dkim/favicon.mjs.js", - "severity": "Medium", - "description": "1 JSON.parse call(s) with 0 try block(s) in modules/dkim/favicon.mjs.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "InsecureProtocol", - "location": "modules/dnsbl.mjs.js", - "file": "modules/dnsbl.mjs.js", - "severity": "Medium", - "description": "1 HTTP (non-HTTPS) URLs in modules/dnsbl.mjs.js", - "recommended_attack": [ - "network" - ] - }, - { - "category": "InputBoundary", - "location": "modules/resultStorage.mjs.js", - "file": "modules/resultStorage.mjs.js", - "severity": "Medium", - "description": "1 JSON.parse call(s) with 0 try block(s) in modules/resultStorage.mjs.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "InputBoundary", - "location": "scripts/update-thirdparty.js", - "file": "scripts/update-thirdparty.js", - "severity": "Medium", - "description": "1 JSON.parse call(s) with 0 try block(s) in scripts/update-thirdparty.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "DynamicCodeExecution", - "location": "scripts/verify-rsr.js", - "file": "scripts/verify-rsr.js", - "severity": "Critical", - "description": "eval() usage in scripts/verify-rsr.js", - "recommended_attack": [ - "cpu", - "memory" - ] - }, - { - "category": "InputBoundary", - "location": "test/helpers/initWebExtensions.mjs.js", - "file": "test/helpers/initWebExtensions.mjs.js", - "severity": "Medium", - "description": "1 JSON.parse call(s) with 0 try block(s) in test/helpers/initWebExtensions.mjs.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "InputBoundary", - "location": "test/unittest/authVerifierSpec.mjs.js", - "file": "test/unittest/authVerifierSpec.mjs.js", - "severity": "Medium", - "description": "2 JSON.parse call(s) with 0 try block(s) in test/unittest/authVerifierSpec.mjs.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "DynamicCodeExecution", - "location": "thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "file": "thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "severity": "High", - "description": "DOM manipulation (innerHTML/document.write) in thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "recommended_attack": [ - "memory", - "network" - ] - }, - { - "category": "InputBoundary", - "location": "thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "file": "thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "severity": "Medium", - "description": "12 JSON.parse call(s) with 8 try block(s) in thirdparty/tabulator-tables/dist/js/tabulator_esm.js — JSON.parse throws SyntaxError on malformed input; wrap in try-catch", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "UncheckedError", - "location": "contractiles/k9/template-hunt.k9.ncl", - "file": "contractiles/k9/template-hunt.k9.ncl", - "severity": "Low", - "description": "14 TODO/FIXME/HACK markers in contractiles/k9/template-hunt.k9.ncl", - "recommended_attack": [ - "cpu" - ] - }, - { - "category": "SupplyChain", - "location": "flake.nix", - "file": "flake.nix", - "severity": "High", - "description": "flake.nix declares inputs without narHash, rev pinning, or sibling flake.lock — dependency revision is unpinned in flake.nix", - "recommended_attack": [] - } - ], - "statistics": { - "total_lines": 60112, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 4, - "allocation_sites": 1, - "io_operations": 36, - "threading_constructs": 2 - }, - "file_statistics": [ - { - "file_path": "experiments/libunbound.js", - "lines": 419, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 0, - "threading_constructs": 2 - }, - { - "file_path": "modules/dkim/keyStore.mjs.js", - "lines": 388, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 3, - "threading_constructs": 0 - }, - { - "file_path": "modules/extensionUtils.mjs.js", - "lines": 180, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 1, - "threading_constructs": 0 - }, - { - "file_path": "modules/virusTotalIntegration.mjs.js", - "lines": 439, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 4, - "threading_constructs": 0 - }, - { - "file_path": "scripts/atnChangelog.js", - "lines": 24, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 1, - "threading_constructs": 0 - }, - { - "file_path": "scripts/pack.js", - "lines": 205, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 4, - "threading_constructs": 0 - }, - { - "file_path": "scripts/update-thirdparty.js", - "lines": 57, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 2, - "threading_constructs": 0 - }, - { - "file_path": "test/helpers/testUtils.mjs.js", - "lines": 109, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 2, - "threading_constructs": 0 - }, - { - "file_path": "test/unittest/keyStoreSpec.mjs.js", - "lines": 209, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 12, - "threading_constructs": 0 - }, - { - "file_path": "thirdparty/tabulator-tables/dist/js/tabulator_esm.js", - "lines": 29671, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 2, - "threading_constructs": 0 - }, - { - "file_path": "wasm/crypto/src/lib.rs", - "lines": 214, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 1, - "allocation_sites": 0, - "io_operations": 0, - "threading_constructs": 0 - }, - { - "file_path": "wasm/parser/src/lib.rs", - "lines": 235, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 3, - "allocation_sites": 1, - "io_operations": 0, - "threading_constructs": 0 - }, - { - "file_path": "setup.sh", - "lines": 278, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 3, - "threading_constructs": 0 - }, - { - "file_path": "flake.nix", - "lines": 116, - "unsafe_blocks": 0, - "panic_sites": 0, - "unwrap_calls": 0, - "allocation_sites": 0, - "io_operations": 2, - "threading_constructs": 0 - } - ], - "recommended_attacks": [ - "disk", - "memory", - "cpu", - "network" - ], - "dependency_graph": { - "edges": [ - { - "from": "scripts/atnChangelog.js", - "to": "scripts/pack.js", - "relation": "shared_dir:scripts", - "weight": 1.0 - }, - { - "from": "scripts/pack.js", - "to": "scripts/update-thirdparty.js", - "relation": "shared_dir:scripts", - "weight": 1.0 - }, - { - "from": "modules/extensionUtils.mjs.js", - "to": "modules/virusTotalIntegration.mjs.js", - "relation": "shared_dir:modules", - "weight": 1.0 - }, - { - "from": "setup.sh", - "to": "flake.nix", - "relation": "shared_dir:", - "weight": 1.0 - } - ] - }, - "taint_matrix": { - "rows": [ - { - "source_category": "DynamicCodeExecution", - "sink_axis": "cpu", - "severity_value": 5.0, - "files": [ - "scripts/verify-rsr.js" - ], - "frameworks": [], - "relation": "DynamicCodeExecution->Cpu" - }, - { - "source_category": "InsecureProtocol", - "sink_axis": "network", - "severity_value": 2.5, - "files": [ - "experiments/JSDNS.mjs", - "experiments/libunboundWorker.js", - "modules/dnsbl.mjs.js" - ], - "frameworks": [], - "relation": "InsecureProtocol->Network" - }, - { - "source_category": "DynamicCodeExecution", - "sink_axis": "memory", - "severity_value": 5.0, - "files": [ - "scripts/verify-rsr.js", - "thirdparty/tabulator-tables/dist/js/tabulator_esm.js" - ], - "frameworks": [], - "relation": "DynamicCodeExecution->Memory" - }, - { - "source_category": "UncheckedError", - "sink_axis": "cpu", - "severity_value": 1.0, - "files": [ - "contractiles/k9/template-hunt.k9.ncl" - ], - "frameworks": [], - "relation": "UncheckedError->Cpu" - }, - { - "source_category": "DynamicCodeExecution", - "sink_axis": "network", - "severity_value": 3.5, - "files": [ - "thirdparty/tabulator-tables/dist/js/tabulator_esm.js" - ], - "frameworks": [], - "relation": "DynamicCodeExecution->Network" - }, - { - "source_category": "InputBoundary", - "sink_axis": "cpu", - "severity_value": 2.5, - "files": [ - "modules/dkim/favicon.mjs.js", - "modules/resultStorage.mjs.js", - "scripts/update-thirdparty.js", - "test/helpers/initWebExtensions.mjs.js", - "test/unittest/authVerifierSpec.mjs.js", - "thirdparty/tabulator-tables/dist/js/tabulator_esm.js" - ], - "frameworks": [], - "relation": "InputBoundary->Cpu" - } - ] - } -} -CRG Grade: D diff --git a/docs/reports/audit/audit-2026-04-15-pre.adoc b/docs/reports/audit/audit-2026-04-15-pre.adoc new file mode 100644 index 0000000..83beb1c --- /dev/null +++ b/docs/reports/audit/audit-2026-04-15-pre.adoc @@ -0,0 +1,4 @@ +== PRE-audit status report + +Repo: rrecord-verity TS Blocker: yes NPM/Bun Blocker: yes deno.lock: yes +Cargo.lock: no diff --git a/docs/reports/audit/audit-2026-04-15-pre.md b/docs/reports/audit/audit-2026-04-15-pre.md deleted file mode 100644 index dd59907..0000000 --- a/docs/reports/audit/audit-2026-04-15-pre.md +++ /dev/null @@ -1,10 +0,0 @@ - -# PRE-audit status report -Repo: rrecord-verity -TS Blocker: yes -NPM/Bun Blocker: yes -deno.lock: yes -Cargo.lock: no diff --git a/docs/tech-debt-2026-05-26.adoc b/docs/tech-debt-2026-05-26.adoc new file mode 100644 index 0000000..200cc5a --- /dev/null +++ b/docs/tech-debt-2026-05-26.adoc @@ -0,0 +1,67 @@ +== Tech-Debt Audit — rrecord-verity — 2026-05-26 + +*Source:* estate-wide automated scan 2026-05-26. *Companion:* +https://github.com/hyperpolymath/standards/tree/main/docs/audits[`+hyperpolymath/standards+` +2026-05-26-estate-*-debt audits]. *Combined severity:* `+MEDIUM+`. + +This file records the _raw findings_ — it does not by itself fix the +debt. Each section ends with a '`Recommended next move`' line; closing +the debt is follow-up work. + +=== 1. Proof debt + +No proof-bearing files (`+*.v+`, `+*.lean+`, `+*.agda+`, `+*.idr+`, +`+*.idr2+`, `+*.fst+`, `+*.dfy+`, `+*.tla+`, `+*.ads+`, `+*.adb+`) found +in this repo. + +*Recommended next move:* none. + +=== 2. Licence debt + +[cols=",",options="header",] +|=== +|Field |Value +|LICENSE file |`+LICENSE+` +|SPDX header |`+MPL-2.0+` +|Manifest licence |`+MIT+` +|Body classifier |`+Palimp-MPL-2.0+` +|Severity |`+ok+` +|=== + +*Recommended next move:* none for licence. + +=== 3. Documentation debt + +[cols=",",options="header",] +|=== +|Field |Value +|README lines |106 +|`+docs/+` files |5 +|`+docs/+` LoC |704 +|CHANGELOG.md |Y +|CONTRIBUTING.md |Y +|CODE_OF_CONDUCT.md |Y +|SECURITY.md |Y +|Severity |`+MEDIUM+` +|=== + +*Recommended next move:* introduce a `+docs/+` directory. The README at +106 lines has likely grown to do the work of `+docs/+` — split it into a +thin README + `+docs/architecture.md+`, `+docs/usage.md+`, etc. +Heavy-wiki exemplars to copy from: `+affinescript+`, `+boj-server+`, +`+echidna+`, `+hypatia+`. + +=== Cross-references + +* Estate proof-debt audit: +`+hyperpolymath/standards/docs/audits/2026-05-26-estate-proof-debt.md+` +* Estate licence-debt audit: +`+hyperpolymath/standards/docs/audits/2026-05-26-estate-licence-debt.md+` +* Estate documentation-debt audit: +`+hyperpolymath/standards/docs/audits/2026-05-26-estate-documentation-debt.md+` + +''''' + +🤖 Generated by Claude Code estate-wide tech-debt scan (2026-05-26). +This file is informational — closing the debt is follow-up work owned by +the maintainer. diff --git a/docs/tech-debt-2026-05-26.md b/docs/tech-debt-2026-05-26.md deleted file mode 100644 index 66e022f..0000000 --- a/docs/tech-debt-2026-05-26.md +++ /dev/null @@ -1,54 +0,0 @@ - -# Tech-Debt Audit — rrecord-verity — 2026-05-26 - -**Source:** estate-wide automated scan 2026-05-26. -**Companion:** [`hyperpolymath/standards` 2026-05-26-estate-*-debt audits](https://github.com/hyperpolymath/standards/tree/main/docs/audits). -**Combined severity:** `MEDIUM`. - -This file records the *raw findings* — it does not by itself fix the debt. Each section ends with a 'Recommended next move' line; closing the debt is follow-up work. - -## 1. Proof debt - -No proof-bearing files (`*.v`, `*.lean`, `*.agda`, `*.idr`, `*.idr2`, `*.fst`, `*.dfy`, `*.tla`, `*.ads`, `*.adb`) found in this repo. - -**Recommended next move:** none. - -## 2. Licence debt - -| Field | Value | -|---|---| -| LICENSE file | `LICENSE` | -| SPDX header | `MPL-2.0` | -| Manifest licence | `MIT` | -| Body classifier | `Palimp-MPL-2.0` | -| Severity | `ok` | - -**Recommended next move:** none for licence. - -## 3. Documentation debt - -| Field | Value | -|---|---| -| README lines | 106 | -| `docs/` files | 5 | -| `docs/` LoC | 704 | -| CHANGELOG.md | Y | -| CONTRIBUTING.md | Y | -| CODE_OF_CONDUCT.md | Y | -| SECURITY.md | Y | -| Severity | `MEDIUM` | - -**Recommended next move:** introduce a `docs/` directory. The README at 106 lines has likely grown to do the work of `docs/` — split it into a thin README + `docs/architecture.md`, `docs/usage.md`, etc. Heavy-wiki exemplars to copy from: `affinescript`, `boj-server`, `echidna`, `hypatia`. - -## Cross-references - -- Estate proof-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-proof-debt.md` -- Estate licence-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-licence-debt.md` -- Estate documentation-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-documentation-debt.md` - ---- - -🤖 Generated by Claude Code estate-wide tech-debt scan (2026-05-26). This file is informational — closing the debt is follow-up work owned by the maintainer. diff --git a/llm-warmup-dev.adoc b/llm-warmup-dev.adoc new file mode 100644 index 0000000..59c9dbd --- /dev/null +++ b/llm-warmup-dev.adoc @@ -0,0 +1,19 @@ +== LLM Warmup — rrecord-verity (Developer) + +=== What is rrecord-verity? + +See README.adoc for overview. + +=== Key Commands + +* `+just setup+` — set up development environment +* `+just build+` — build the project +* `+just test+` — run tests +* `+just doctor+` — diagnose issues +* `+just heal+` — attempt auto-repair + +=== Quick Context + +* License: MPL-2.0 +* Part of hyperpolymath ecosystem +* See EXPLAINME.adoc for architecture diff --git a/llm-warmup-dev.md b/llm-warmup-dev.md deleted file mode 100644 index 0b20339..0000000 --- a/llm-warmup-dev.md +++ /dev/null @@ -1,20 +0,0 @@ - -# LLM Warmup — rrecord-verity (Developer) - -## What is rrecord-verity? -See README.adoc for overview. - -## Key Commands -- `just setup` — set up development environment -- `just build` — build the project -- `just test` — run tests -- `just doctor` — diagnose issues -- `just heal` — attempt auto-repair - -## Quick Context -- License: MPL-2.0 -- Part of hyperpolymath ecosystem -- See EXPLAINME.adoc for architecture diff --git a/llm-warmup-user.adoc b/llm-warmup-user.adoc new file mode 100644 index 0000000..e76622b --- /dev/null +++ b/llm-warmup-user.adoc @@ -0,0 +1,19 @@ +== LLM Warmup — rrecord-verity (User) + +=== What is rrecord-verity? + +See README.adoc for overview. + +=== Key Commands + +* `+just setup+` — set up development environment +* `+just build+` — build the project +* `+just test+` — run tests +* `+just doctor+` — diagnose issues +* `+just heal+` — attempt auto-repair + +=== Quick Context + +* License: MPL-2.0 +* Part of hyperpolymath ecosystem +* See EXPLAINME.adoc for architecture diff --git a/llm-warmup-user.md b/llm-warmup-user.md deleted file mode 100644 index 65ee423..0000000 --- a/llm-warmup-user.md +++ /dev/null @@ -1,20 +0,0 @@ - -# LLM Warmup — rrecord-verity (User) - -## What is rrecord-verity? -See README.adoc for overview. - -## Key Commands -- `just setup` — set up development environment -- `just build` — build the project -- `just test` — run tests -- `just doctor` — diagnose issues -- `just heal` — attempt auto-repair - -## Quick Context -- License: MPL-2.0 -- Part of hyperpolymath ecosystem -- See EXPLAINME.adoc for architecture diff --git a/test/Readme.adoc b/test/Readme.adoc new file mode 100644 index 0000000..de02960 --- /dev/null +++ b/test/Readme.adoc @@ -0,0 +1,37 @@ +== Running tests + +The unit test are written with https://mochajs.org/[Mocha] and +https://www.chaijs.com/[Chai]. + +The following assumes all Node.js dependencies were installed via +`+npm install+`. + +Unless otherwise specified run all commands from the root of the +repository. + +=== Running unit tests in a browser + +Because of _CORS_ opening the runner html page directly from the file +system does not work. A HTTP server is needed instead. + +Below is an example with Node’s +https://www.npmjs.com/package/http-server[http-server]. + +[source,powershell] +---- +# Start the server in the root directory of the repository +npx http-server . -c-1 + +# Open the test runner page +# http://localhost:8080/test/unittest/SpecRunner.html +---- + +=== Running unit test in Node + +[source,powershell] +---- +# Run tests with +npm run test +# Or directly call mocha +npx mocha +---- diff --git a/test/Readme.md b/test/Readme.md deleted file mode 100644 index 8b9c578..0000000 --- a/test/Readme.md +++ /dev/null @@ -1,35 +0,0 @@ - -# Running tests - -The unit test are written with [Mocha](https://mochajs.org/) and [Chai](https://www.chaijs.com/). - -The following assumes all Node.js dependencies were installed via `npm install`. - -Unless otherwise specified run all commands from the root of the repository. - -## Running unit tests in a browser - -Because of *CORS* opening the runner html page directly from the file system does not work. -A HTTP server is needed instead. - -Below is an example with Node's [http-server](https://www.npmjs.com/package/http-server). - -```PowerShell -# Start the server in the root directory of the repository -npx http-server . -c-1 - -# Open the test runner page -# http://localhost:8080/test/unittest/SpecRunner.html -``` - -## Running unit test in Node - -```PowerShell -# Run tests with -npm run test -# Or directly call mocha -npx mocha -``` diff --git a/thirdparty/README.adoc b/thirdparty/README.adoc new file mode 100644 index 0000000..b36ae98 --- /dev/null +++ b/thirdparty/README.adoc @@ -0,0 +1,25 @@ +== Third-party libraries + +Unchanged third-party libraries included in the add-on. + +See link:../THIRDPARTY_LICENSE.txt[THIRDPARTY_LICENSE.txt] in the root +directory for licensing information. + +This file contains the information which versions of the third-party +libraries are included. + +=== tabulator-tables + +* Name: tabulator-tables +* Source: npm +* Version: 6.3.1 +* Download URL: +https://registry.npmjs.org/tabulator-tables/-/tabulator-tables-6.3.1.tgz + +=== tweetnacl-es6 + +* Name: tweetnacl-es6 +* Source: npm +* Version: 1.0.3 +* Download URL: +https://registry.npmjs.org/tweetnacl-es6/-/tweetnacl-es6-1.0.3.tgz diff --git a/thirdparty/README.md b/thirdparty/README.md deleted file mode 100644 index eadb066..0000000 --- a/thirdparty/README.md +++ /dev/null @@ -1,25 +0,0 @@ - -# Third-party libraries - -Unchanged third-party libraries included in the add-on. - -See [THIRDPARTY_LICENSE.txt](../THIRDPARTY_LICENSE.txt) in the root directory for licensing information. - -This file contains the information which versions of the third-party libraries are included. - -## tabulator-tables - -- Name: tabulator-tables -- Source: npm -- Version: 6.3.1 -- Download URL: - -## tweetnacl-es6 - -- Name: tweetnacl-es6 -- Source: npm -- Version: 1.0.3 -- Download URL: diff --git a/thirdparty/tweetnacl-es6/AUTHORS.adoc b/thirdparty/tweetnacl-es6/AUTHORS.adoc new file mode 100644 index 0000000..a24187c --- /dev/null +++ b/thirdparty/tweetnacl-es6/AUTHORS.adoc @@ -0,0 +1,26 @@ +== List of TweetNaCl.js authors + +.... +Format: Name (GitHub username or URL) +.... + +(es6) * Håkan Olsson (@hakanols) + +* Dmitry Chestnykh (@dchest) +* Devi Mandiri (@devi) +* AndSDev (@AndSDev) + +== List of authors of third-party public domain code from which TweetNaCl.js code was derived + +=== https://tweetnacl.cr.yp.to/[TweetNaCl] + +* Bernard van Gastel +* Daniel J. Bernstein https://cr.yp.to/djb.html +* Peter Schwabe https://www.cryptojedi.org/users/peter/ +* Sjaak Smetsers https://www.cs.ru.nl/~sjakie/ +* Tanja Lange https://hyperelliptic.org/tanja +* Wesley Janssen + +=== https://github.com/floodyberry/poly1305-donna[Poly1305-donna] + +* Andrew Moon (@floodyberry) diff --git a/thirdparty/tweetnacl-es6/AUTHORS.md b/thirdparty/tweetnacl-es6/AUTHORS.md deleted file mode 100644 index e20eca2..0000000 --- a/thirdparty/tweetnacl-es6/AUTHORS.md +++ /dev/null @@ -1,34 +0,0 @@ - -List of TweetNaCl.js authors -============================ - - Format: Name (GitHub username or URL) - -(es6) -* Håkan Olsson (@hakanols) - -* Dmitry Chestnykh (@dchest) -* Devi Mandiri (@devi) -* AndSDev (@AndSDev) - -List of authors of third-party public domain code from which TweetNaCl.js code was derived -========================================================================================== - -[TweetNaCl](https://tweetnacl.cr.yp.to/) --------------------------------------- - -* Bernard van Gastel -* Daniel J. Bernstein -* Peter Schwabe -* Sjaak Smetsers -* Tanja Lange -* Wesley Janssen - - -[Poly1305-donna](https://github.com/floodyberry/poly1305-donna) --------------------------------------------------------------- - -* Andrew Moon (@floodyberry) diff --git a/wasm/README.adoc b/wasm/README.adoc new file mode 100644 index 0000000..3c43ffd --- /dev/null +++ b/wasm/README.adoc @@ -0,0 +1,273 @@ +== WebAssembly Modules for DKIM Verifier + +High-performance WebAssembly modules for performance-critical email +security operations. + +=== Modules + +==== `+crypto/+` - Cryptographic Operations + +*Speedup*: ~3-5x faster than pure JavaScript + +* *SHA-256/SHA-512 hashing*: Body hash computation +* *Ed25519 signature verification*: Modern DKIM signing (ed25519-sha256) +* *RSA-SHA256 signature verification*: Traditional DKIM signing +(rsa-sha256) +* *Base64 encoding/decoding*: Optimized for large inputs + +*Use Cases*: - DKIM signature verification - Email body hash computation +- Large email processing + +==== `+parser/+` - Email Parsing + +*Speedup*: ~2-3x faster than pure JavaScript + +* *Email header parsing*: RFC 5322 compliant +* *Email address extraction*: From/Reply-To parsing +* *Token extraction*: For Bayesian spam filter +* *Body canonicalization*: DKIM canonicalization algorithms +* *Header analysis*: Fast Received header counting + +*Use Cases*: - Large email parsing (>1MB) - Bulk header analysis - +Bayesian filter training + +=== Building + +==== Prerequisites + +[source,bash] +---- +# Install Rust +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# Add wasm32 target +rustup target add wasm32-unknown-unknown + +# Install wasm-pack +cargo install wasm-pack +---- + +==== Build All Modules + +Using `+just+`: + +[source,bash] +---- +just build-wasm +---- + +Using Deno: + +[source,bash] +---- +deno task build-wasm # (when implemented) +---- + +Manual: + +[source,bash] +---- +cd wasm/crypto && wasm-pack build --target web +cd wasm/parser && wasm-pack build --target web +---- + +=== Usage + +==== In Thunderbird Extension + +[source,javascript] +---- +// Load WASM modules +import init, { sha256_hash, verify_ed25519 } from "./wasm/crypto/pkg/dkim_crypto_wasm.js"; +import initParser, { parse_email } from "./wasm/parser/pkg/dkim_parser_wasm.js"; + +// Initialize +await init(); +await initParser(); + +// Use crypto functions +const bodyHash = sha256_hash(new TextEncoder().encode(emailBody)); + +// Verify DKIM signature +const isValid = verify_ed25519(publicKeyB64, messageBytes, signatureB64); + +// Parse email +const parsed = parse_email(rawEmail); +console.log(parsed.headers, parsed.body); +---- + +==== Fallback to JavaScript + +The extension gracefully falls back to JavaScript implementations if +WASM fails to load: + +[source,javascript] +---- +// crypto module with WASM + JS fallback +import { computeBodyHash } from "./modules/dkim/crypto.mjs.js"; + +// Automatically uses WASM if available, falls back to tweetnacl-es6 +const hash = await computeBodyHash(emailBody); +---- + +=== Performance Benchmarks + +==== Crypto Operations (1000 iterations) + +[cols=",,,",options="header",] +|=== +|Operation |JavaScript |WASM |Speedup +|SHA-256 (1KB) |45ms |12ms |*3.75x* +|SHA-256 (100KB) |890ms |180ms |*4.94x* +|Ed25519 verify |125ms |28ms |*4.46x* +|RSA-2048 verify |450ms |95ms |*4.74x* +|Base64 encode (1MB) |78ms |22ms |*3.54x* +|=== + +==== Parser Operations (1000 iterations) + +[cols=",,,",options="header",] +|=== +|Operation |JavaScript |WASM |Speedup +|Parse email (10KB) |52ms |18ms |*2.89x* +|Parse email (100KB) |485ms |162ms |*2.99x* +|Extract tokens (10KB) |38ms |14ms |*2.71x* +|Canonicalize (100KB) |124ms |45ms |*2.76x* +|=== + +*Tested on*: Chrome 120, Firefox 121, Thunderbird 128 + +=== Development + +==== Testing + +[source,bash] +---- +# Test crypto module +cd wasm/crypto +cargo test +wasm-pack test --headless --chrome + +# Test parser module +cd wasm/parser +cargo test +wasm-pack test --headless --firefox +---- + +==== Benchmarking + +[source,bash] +---- +# Run performance benchmarks +just benchmark + +# Or manually +deno run --allow-read scripts/benchmark-wasm.js +---- + +==== Size Optimization + +WASM modules are already optimized for size: - `+opt-level = "z"+`: +Maximum size optimization - `+lto = true+`: Link-time optimization - +`+strip = true+`: Strip debug symbols + +*Sizes* (after compression): - `+crypto.wasm+`: ~45KB (gzipped) - +`+parser.wasm+`: ~32KB (gzipped) + +=== Security Considerations + +==== Memory Safety + +* ✅ *Rust*: Memory-safe by default (no unsafe blocks) +* ✅ *Bounds checking*: All array accesses checked +* ✅ *No buffer overflows*: Prevented by Rust’s type system + +==== Sandboxing + +* ✅ *WASM sandbox*: Runs in isolated WebAssembly VM +* ✅ *No filesystem access*: Cannot read/write files +* ✅ *No network access*: Cannot make network requests +* ✅ *Limited imports*: Only essential browser APIs + +==== Supply Chain + +* ✅ *Reproducible builds*: `+Cargo.lock+` pinned dependencies +* ✅ *Audit*: All dependencies audited (`+cargo audit+`) +* ✅ *Minimal deps*: Only essential cryptographic libraries + +=== Troubleshooting + +==== WASM Module Fails to Load + +[arabic] +. *Check browser support*: WASM requires modern browser +* Chrome 57+ +* Firefox 52+ +* Thunderbird 115+ (based on Firefox ESR) +. *CORS issues*: Ensure WASM files served with correct MIME type ++ +.... +Content-Type: application/wasm +.... +. *Size limits*: Some browsers limit WASM module size +* Chrome/Firefox: ~2GB +* Thunderbird: Should match Firefox limits +. *Debugging*: Check browser console for errors ++ +[source,javascript] +---- +try { + await init(); +} catch (error) { + console.error("WASM load failed:", error); + // Fall back to JavaScript +} +---- + +==== Performance Not Improving + +[arabic] +. *Check WASM actually loaded*: Verify in console +. *Profile*: Use browser DevTools Performance tab +. *Input size*: WASM overhead makes it slower for tiny inputs (<1KB) +. *Optimize Rust*: Use `+--release+` build (enabled by default) + +=== Roadmap + +==== Planned Enhancements + +* [ ] *SIMD support*: Use WASM SIMD for 2-4x additional speedup +* [ ] *Threading*: Multi-threaded WASM for parallel processing +* [ ] *Streaming*: Process large emails in chunks +* [ ] *More crypto*: AES, HMAC, PBKDF2 for future features +* [ ] *Advanced parsing*: MIME multipart, attachment extraction + +==== Future Modules + +* `+wasm/ml/+` - Bayesian spam filter (training + classification) +* `+wasm/analysis/+` - Fast header analysis and pattern matching +* `+wasm/canonicalization/+` - All DKIM canonicalization algorithms + +=== Contributing + +See main link:../CONTRIBUTING.md[CONTRIBUTING.md] for contribution +guidelines. + +==== WASM-Specific Guidelines + +[arabic] +. *Rust style*: Follow `+rustfmt+` and `+clippy+` recommendations +. *No unsafe*: Avoid `+unsafe+` blocks unless absolutely necessary +. *Test coverage*: Aim for >90% test coverage +. *Benchmarks*: Include benchmarks for new operations +. *Documentation*: Add rustdoc comments to all public functions + +=== License + +Same as main project: MIT License + +''''' + +*Built with*: - Rust 1.75+ - wasm-bindgen 0.2 - wasm-pack + +*Performance*: Near-native speed in the browser! 🚀 diff --git a/wasm/README.md b/wasm/README.md deleted file mode 100644 index 5e134d6..0000000 --- a/wasm/README.md +++ /dev/null @@ -1,259 +0,0 @@ - -# WebAssembly Modules for DKIM Verifier - -High-performance WebAssembly modules for performance-critical email security operations. - -## Modules - -### `crypto/` - Cryptographic Operations -**Speedup**: ~3-5x faster than pure JavaScript - -- **SHA-256/SHA-512 hashing**: Body hash computation -- **Ed25519 signature verification**: Modern DKIM signing (ed25519-sha256) -- **RSA-SHA256 signature verification**: Traditional DKIM signing (rsa-sha256) -- **Base64 encoding/decoding**: Optimized for large inputs - -**Use Cases**: -- DKIM signature verification -- Email body hash computation -- Large email processing - -### `parser/` - Email Parsing -**Speedup**: ~2-3x faster than pure JavaScript - -- **Email header parsing**: RFC 5322 compliant -- **Email address extraction**: From/Reply-To parsing -- **Token extraction**: For Bayesian spam filter -- **Body canonicalization**: DKIM canonicalization algorithms -- **Header analysis**: Fast Received header counting - -**Use Cases**: -- Large email parsing (>1MB) -- Bulk header analysis -- Bayesian filter training - -## Building - -### Prerequisites - -```bash -# Install Rust -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -# Add wasm32 target -rustup target add wasm32-unknown-unknown - -# Install wasm-pack -cargo install wasm-pack -``` - -### Build All Modules - -Using `just`: -```bash -just build-wasm -``` - -Using Deno: -```bash -deno task build-wasm # (when implemented) -``` - -Manual: -```bash -cd wasm/crypto && wasm-pack build --target web -cd wasm/parser && wasm-pack build --target web -``` - -## Usage - -### In Thunderbird Extension - -```javascript -// Load WASM modules -import init, { sha256_hash, verify_ed25519 } from "./wasm/crypto/pkg/dkim_crypto_wasm.js"; -import initParser, { parse_email } from "./wasm/parser/pkg/dkim_parser_wasm.js"; - -// Initialize -await init(); -await initParser(); - -// Use crypto functions -const bodyHash = sha256_hash(new TextEncoder().encode(emailBody)); - -// Verify DKIM signature -const isValid = verify_ed25519(publicKeyB64, messageBytes, signatureB64); - -// Parse email -const parsed = parse_email(rawEmail); -console.log(parsed.headers, parsed.body); -``` - -### Fallback to JavaScript - -The extension gracefully falls back to JavaScript implementations if WASM fails to load: - -```javascript -// crypto module with WASM + JS fallback -import { computeBodyHash } from "./modules/dkim/crypto.mjs.js"; - -// Automatically uses WASM if available, falls back to tweetnacl-es6 -const hash = await computeBodyHash(emailBody); -``` - -## Performance Benchmarks - -### Crypto Operations (1000 iterations) - -| Operation | JavaScript | WASM | Speedup | -|-----------|-----------|------|---------| -| SHA-256 (1KB) | 45ms | 12ms | **3.75x** | -| SHA-256 (100KB) | 890ms | 180ms | **4.94x** | -| Ed25519 verify | 125ms | 28ms | **4.46x** | -| RSA-2048 verify | 450ms | 95ms | **4.74x** | -| Base64 encode (1MB) | 78ms | 22ms | **3.54x** | - -### Parser Operations (1000 iterations) - -| Operation | JavaScript | WASM | Speedup | -|-----------|-----------|------|---------| -| Parse email (10KB) | 52ms | 18ms | **2.89x** | -| Parse email (100KB) | 485ms | 162ms | **2.99x** | -| Extract tokens (10KB) | 38ms | 14ms | **2.71x** | -| Canonicalize (100KB) | 124ms | 45ms | **2.76x** | - -**Tested on**: Chrome 120, Firefox 121, Thunderbird 128 - -## Development - -### Testing - -```bash -# Test crypto module -cd wasm/crypto -cargo test -wasm-pack test --headless --chrome - -# Test parser module -cd wasm/parser -cargo test -wasm-pack test --headless --firefox -``` - -### Benchmarking - -```bash -# Run performance benchmarks -just benchmark - -# Or manually -deno run --allow-read scripts/benchmark-wasm.js -``` - -### Size Optimization - -WASM modules are already optimized for size: -- `opt-level = "z"`: Maximum size optimization -- `lto = true`: Link-time optimization -- `strip = true`: Strip debug symbols - -**Sizes** (after compression): -- `crypto.wasm`: ~45KB (gzipped) -- `parser.wasm`: ~32KB (gzipped) - -## Security Considerations - -### Memory Safety -- ✅ **Rust**: Memory-safe by default (no unsafe blocks) -- ✅ **Bounds checking**: All array accesses checked -- ✅ **No buffer overflows**: Prevented by Rust's type system - -### Sandboxing -- ✅ **WASM sandbox**: Runs in isolated WebAssembly VM -- ✅ **No filesystem access**: Cannot read/write files -- ✅ **No network access**: Cannot make network requests -- ✅ **Limited imports**: Only essential browser APIs - -### Supply Chain -- ✅ **Reproducible builds**: `Cargo.lock` pinned dependencies -- ✅ **Audit**: All dependencies audited (`cargo audit`) -- ✅ **Minimal deps**: Only essential cryptographic libraries - -## Troubleshooting - -### WASM Module Fails to Load - -1. **Check browser support**: WASM requires modern browser - - Chrome 57+ - - Firefox 52+ - - Thunderbird 115+ (based on Firefox ESR) - -2. **CORS issues**: Ensure WASM files served with correct MIME type - ``` - Content-Type: application/wasm - ``` - -3. **Size limits**: Some browsers limit WASM module size - - Chrome/Firefox: ~2GB - - Thunderbird: Should match Firefox limits - -4. **Debugging**: Check browser console for errors - ```javascript - try { - await init(); - } catch (error) { - console.error("WASM load failed:", error); - // Fall back to JavaScript - } - ``` - -### Performance Not Improving - -1. **Check WASM actually loaded**: Verify in console -2. **Profile**: Use browser DevTools Performance tab -3. **Input size**: WASM overhead makes it slower for tiny inputs (<1KB) -4. **Optimize Rust**: Use `--release` build (enabled by default) - -## Roadmap - -### Planned Enhancements - -- [ ] **SIMD support**: Use WASM SIMD for 2-4x additional speedup -- [ ] **Threading**: Multi-threaded WASM for parallel processing -- [ ] **Streaming**: Process large emails in chunks -- [ ] **More crypto**: AES, HMAC, PBKDF2 for future features -- [ ] **Advanced parsing**: MIME multipart, attachment extraction - -### Future Modules - -- `wasm/ml/` - Bayesian spam filter (training + classification) -- `wasm/analysis/` - Fast header analysis and pattern matching -- `wasm/canonicalization/` - All DKIM canonicalization algorithms - -## Contributing - -See main [CONTRIBUTING.md](../CONTRIBUTING.md) for contribution guidelines. - -### WASM-Specific Guidelines - -1. **Rust style**: Follow `rustfmt` and `clippy` recommendations -2. **No unsafe**: Avoid `unsafe` blocks unless absolutely necessary -3. **Test coverage**: Aim for >90% test coverage -4. **Benchmarks**: Include benchmarks for new operations -5. **Documentation**: Add rustdoc comments to all public functions - -## License - -Same as main project: MIT License - ---- - -**Built with**: -- Rust 1.75+ -- wasm-bindgen 0.2 -- wasm-pack - -**Performance**: Near-native speed in the browser! 🚀