email-dns-tools/assets/scripts/tools/DmarcTool.js
2026-01-14 10:39:19 +01:00

50 lines
1.4 KiB
JavaScript

import { ConstantField } from "../fields/ConstantField.js";
import { EnumField } from "../fields/EnumField.js";
import { IntField } from "../fields/IntField.js";
import { Field } from "../fields/Field.js";
import { DmarcUriListField } from "../fields/DmarcUriListField.js";
import { DnsTool } from "./DnsTool.js";
import { ValidationError } from "../ValidationError.js";
export class DmarcTool extends DnsTool {
fields = [
new ConstantField("v", "DMARC1").required().atIndex(0),
new EnumField("p", ["none", "quarantine", "reject"]).required().atIndex(1).after("v"),
new EnumField("sp", ["none", "quarantine", "reject"]),
new IntField("pct", 0, 100).default(100),
new EnumField("adkim", ["r", "s"]).default("r"),
new EnumField("aspf", ["r", "s"]).default("r"),
new EnumField("fo", ["0", "1", "d", "s"]).default("0"),
new Field("rf").default("afrf"),
new IntField("ri", 0, 2 ** 32).default(86400),
new DmarcUriListField("rua"),
new DmarcUriListField("ruf"),
];
constructor(text) {
super(text);
}
tokenize() {
return this.text.split(/;\s*/);
}
getKeyValues() {
const result = [];
for (const token of this.tokenize()) {
if (token === "") continue;
const [key, value] = token.split("=");
if (!value) {
throw new ValidationError(`Field "${key}" is missing a value`);
}
result.push({ key, value });
}
return result;
}
}