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; } }