mailauth
Version:
Email authentication library for Node.js
67 lines (41 loc) • 3.61 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
mailauth is a Node.js library and CLI tool for email authentication. It implements SPF, DKIM, DMARC, ARC, BIMI, and MTA-STS protocols. Pure JavaScript, no native dependencies. Requires Node.js >= 20.18.1.
## Commands
- **Run all tests (lint + mocha):** `npm test`
- **Run a single test file:** `npx mocha test/dkim/body/relaxed-test.js --reporter spec`
- **Run tests matching a pattern:** `npx mocha --recursive "./test/**/*.js" --reporter spec --grep "pattern"`
- **Lint only:** `npx eslint "lib/**/*.js" "test/**/*.js"`
- **Format code:** `npm run format` (uses Prettier)
## Code Style
- CommonJS (`require`/`module.exports`), not ES modules
- `'use strict'` at top of every file
- Mocha + Chai (expect style) for tests
- Prettier: 160 print width, 4-space indent, single quotes, no trailing commas, LF line endings
- ESLint: unused vars prefixed with `_`, `no-console` allowed
## Architecture
### Entry Point
`lib/mailauth.js` — exports `authenticate()` (the main all-in-one function) and individual protocol functions. The `authenticate` pipeline runs in order: DKIM verify → SPF → ARC → DMARC → BIMI, each step feeding results to the next.
### Protocol Modules
Each protocol lives in its own directory under `lib/`:
- **`lib/dkim/`** — DKIM signing (`sign.js`, `dkim-signer.js`, `DkimSignStream`) and verification (`verify.js`, `dkim-verifier.js`). Body canonicalization in `body/` (relaxed/simple), header canonicalization in `header/` (relaxed/simple). `message-parser.js` is the streaming RFC822 parser used by both signing and verification.
- **`lib/spf/`** — SPF verification (`spf-verify.js`), macro expansion (`macro.js`). Entry point `index.js` wraps the verifier.
- **`lib/dmarc/`** — DMARC verification (`verify.js`) and DNS record fetching (`get-dmarc-record.js`). Takes DKIM and SPF results as input.
- **`lib/arc/`** — ARC chain validation and seal creation. `trustlist.js` contains known ARC trust anchors.
- **`lib/bimi/`** — BIMI record resolution and SVG validation (`validate-svg.js`). Depends on DMARC passing.
- **`lib/mta-sts.js`** — MTA-STS policy fetching and MX validation (standalone, not part of authenticate pipeline).
### Shared Utilities
- **`lib/tools.js`** — DNS helpers, key parsing, header formatting, stream utilities, domain alignment checks
- **`lib/parse-dkim-headers.js`** — Parses structured DKIM/ARC header fields
- **`lib/parse-received.js`** — Parses Received headers
### CLI
`bin/mailauth.js` — yargs-based CLI with subcommands: `report`, `sign`, `seal`, `spf`, `vmc`, `bodyhash`. Command implementations in `lib/commands/`.
### Tests
Tests mirror the `lib/` structure under `test/`. Test fixtures in `test/fixtures/` include sample emails, DNS response caches, keys, and RFC test suite YAML files. Many tests use mock DNS resolvers that return fixture data instead of making real DNS queries.
### Type Definitions
`index.d.ts` and per-module `.d.ts` files provide TypeScript type definitions for consumers.
### Key Design Pattern
All protocol functions accept an optional `resolver` parameter (async function matching `dns.promises.resolve` signature) for DNS lookups. This enables testing with mock DNS and allows consumers to implement caching or custom resolution.
## Releases
Version numbers, changelogs, and releases are managed automatically by release-please via GitHub Actions. Do not manually edit `package.json` version, `CHANGELOG.md`, or release-related files.