mailauth
Version:
Email authentication library for Node.js
240 lines (191 loc) • 5.84 kB
Markdown
# MTA-STS Result Reference
This document describes the result objects returned by MTA-STS (Mail Transfer Agent Strict Transport Security) functions.
## Overview
MTA-STS allows domain owners to declare that their mail servers support TLS and specify policies for message delivery. mailauth provides functions to fetch, parse, and validate MTA-STS policies.
```javascript
const { getPolicy, validateMx } = require('mailauth/lib/mta-sts');
```
## getPolicy Result
The `getPolicy` function fetches and returns the MTA-STS policy for a domain.
```javascript
const { policy, status } = await getPolicy('example.com', knownPolicy);
```
### Result Object Fields
| Field | Type | Description |
|-------|------|-------------|
| `policy` | `object` | The MTA-STS policy object (see below) |
| `status` | `string` | Policy retrieval status (see below) |
### Status Values
| Status | Description |
|--------|-------------|
| `found` | New or updated policy was fetched successfully |
| `not_found` | No MTA-STS policy exists for the domain |
| `renewed` | Existing policy is still valid (ID unchanged, not expired) |
| `errored` | Policy discovery failed due to an error |
### Policy Object Fields
| Field | Type | Presence | Description |
|-------|------|----------|-------------|
| `id` | `string\|false` | Always | Policy ID from DNS TXT record, or `false` if not found |
| `version` | `string` | Policy found | Always `"STSv1"` for valid policies |
| `mode` | `string` | Always | Policy mode (see below) |
| `mx` | `string[]` | Mode not "none" | Array of allowed MX hostnames (may include wildcards) |
| `maxAge` | `number` | Policy found | Policy validity period in seconds |
| `expires` | `string` | Policy found | ISO 8601 expiration timestamp |
| `error` | `Error` | On error | Error object if discovery failed |
### Mode Values
| Mode | Description |
|------|-------------|
| `testing` | Policy is in test mode; report violations but don't enforce |
| `enforce` | Strictly enforce TLS and MX restrictions |
| `none` | No policy in effect |
## validateMx Result
The `validateMx` function checks if an MX hostname is valid according to the MTA-STS policy.
```javascript
const result = validateMx('alt1.mx.example.com', policy);
```
### Result Object Fields
| Field | Type | Presence | Description |
|-------|------|----------|-------------|
| `valid` | `boolean` | Always | Whether the MX hostname is allowed |
| `mode` | `string` | Always | Policy mode (`"testing"`, `"enforce"`, or `"none"`) |
| `match` | `string` | Valid match | The pattern that matched (exact hostname or wildcard) |
| `testing` | `boolean` | Always | Whether policy is in testing mode |
## Example Output
### Policy Found
```json
{
"policy": {
"id": "20240115T120000",
"version": "STSv1",
"mode": "enforce",
"mx": [
"mx1.example.com",
"mx2.example.com",
"*.mail.example.com"
],
"maxAge": 86400,
"expires": "2024-01-16T12:00:00.000Z"
},
"status": "found"
}
```
### Policy Not Found
```json
{
"policy": {
"id": false,
"mode": "none"
},
"status": "not_found"
}
```
### Policy Renewed (Cached)
```json
{
"policy": {
"id": "20240115T120000",
"version": "STSv1",
"mode": "enforce",
"mx": [
"mx1.example.com",
"mx2.example.com"
],
"maxAge": 86400,
"expires": "2024-01-16T12:00:00.000Z"
},
"status": "renewed"
}
```
### Policy Error
```json
{
"policy": {
"id": "20240115T120000",
"mode": "none",
"expires": "2024-01-15T13:00:00.000Z",
"error": {
"message": "Request timeout for https://mta-sts.example.com/.well-known/mta-sts.txt",
"code": "HTTP_SOCKET_TIMEOUT"
}
},
"status": "errored"
}
```
### MX Validation - Valid Match
```json
{
"valid": true,
"mode": "enforce",
"match": "mx1.example.com",
"testing": false
}
```
### MX Validation - Wildcard Match
```json
{
"valid": true,
"mode": "enforce",
"match": ".mail.example.com",
"testing": false
}
```
### MX Validation - Invalid
```json
{
"valid": false,
"mode": "enforce",
"testing": false
}
```
### MX Validation - Testing Mode
```json
{
"valid": true,
"mode": "testing",
"match": "mx1.example.com",
"testing": true
}
```
### MX Validation - No Policy
```json
{
"valid": true,
"mode": "none",
"testing": false
}
```
## Error Codes
Errors that may appear in `policy.error`:
| Code | Description |
|------|-------------|
| `multi_sts_records` | Multiple TXT records found for `_mta-sts.{domain}` |
| `invalid_sts_version` | Policy file has invalid or missing version field |
| `invalid_sts_mode` | Policy file has invalid mode value |
| `invalid_sts_max_age` | Policy file has invalid max_age value |
| `invalid_sts_mx` | Policy file missing mx field in enforce/testing mode |
| `HTTP_SOCKET_TIMEOUT` | HTTP request timed out |
| `http_status_{code}` | HTTP request returned non-2xx status |
| `ENOTFOUND` | DNS lookup failed (domain not found) |
| `ENODATA` | DNS lookup returned no data |
## Usage Example
```javascript
const { getPolicy, validateMx } = require('mailauth/lib/mta-sts');
// Fetch policy
const { policy, status } = await getPolicy('gmail.com');
console.log(`Policy status: ${status}`);
console.log(`Policy mode: ${policy.mode}`);
if (policy.mode !== 'none') {
// Validate MX hostname
const mx = 'alt1.gmail-smtp-in.l.google.com';
const validation = validateMx(mx, policy);
if (!validation.valid && !validation.testing) {
console.error(`MX ${mx} is not allowed by MTA-STS policy`);
// Reject delivery attempt
} else if (!validation.valid && validation.testing) {
console.warn(`MX ${mx} violates MTA-STS policy (testing mode)`);
// Report violation but continue
} else {
console.log(`MX ${mx} is allowed`);
}
}
```