50 lines
1.4 KiB
JavaScript
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;
|
|
}
|
|
}
|