diff --git a/assets/scripts/records/SpfRecord.js b/assets/scripts/records/SpfRecord.js index e964685..d64eac6 100644 --- a/assets/scripts/records/SpfRecord.js +++ b/assets/scripts/records/SpfRecord.js @@ -108,11 +108,19 @@ export class SpfRecord { const term = this.constructor.fields.find(f => f.key === name); if (!term) { - throw new ValidationError(`Unknown term: ${name}`); + throw new ValidationError(name ? `Unknown term: ${name}` : "Syntax error"); } const [directive, value] = token.split(term.separator); - const [, qualifier, key] = directive.match(/^([-+?~]?)(\w*)/); + const [, qualifier, key] = directive.match(/^([-+?~]?)(.*)/); + + if (key !== name) { + throw new ValidationError(`Invalid separator for term: ${name}`); + } + + if (token.includes(term.separator) && !value) { + throw new ValidationError(`No value specified for term: ${name}`); + } result.push({ qualifier, key, value }); } @@ -135,7 +143,7 @@ export class SpfRecord { const term = this.constructor.fields.find(d => d.key === input.key); if (!term) { - throw new ValidationError(`Unknown term: ${input.key}`); + throw new ValidationError(input.key ? `Unknown term: ${input.key}` : "Syntax error"); } if (term.position < lastPos) { @@ -144,8 +152,8 @@ export class SpfRecord { throw new ValidationError(`Term "${lastDirective.key}" must come after "${term.key}"`); } - if (term instanceof Modifier && input.qualifier) { - throw new ValidationError(`Modifier "${term.key}" must not have a qualifier`) + if (!term.qualifierAllowed && input.qualifier) { + throw new ValidationError(`Term "${term.key}" must not have a qualifier`) } if (!input.value && term.valueRequirement === ValueRequirement.REQUIRED) { diff --git a/assets/scripts/spf/Mechanism.js b/assets/scripts/spf/Mechanism.js index 715707e..d839d3f 100644 --- a/assets/scripts/spf/Mechanism.js +++ b/assets/scripts/spf/Mechanism.js @@ -4,6 +4,7 @@ import { ValueRequirement } from "./ValueRequirement.js"; export class Mechanism extends Term { separator = ":"; placeholder = null; + qualifierAllowed = true; constructor(key) { super(key); diff --git a/assets/scripts/spf/Modifier.js b/assets/scripts/spf/Modifier.js index ef83aa9..3aeddb8 100644 --- a/assets/scripts/spf/Modifier.js +++ b/assets/scripts/spf/Modifier.js @@ -4,6 +4,7 @@ import { validateSpfDomain } from "./utils.js"; export class Modifier extends Term { separator = "="; + qualifierAllowed = false; constructor(key) { super(key); diff --git a/assets/scripts/spf/VersionTerm.js b/assets/scripts/spf/VersionTerm.js index 3f4a6ea..750d978 100644 --- a/assets/scripts/spf/VersionTerm.js +++ b/assets/scripts/spf/VersionTerm.js @@ -3,6 +3,7 @@ import { ValidationError } from "../ValidationError.js"; export class VersionTerm extends Term { separator = "="; + qualifierAllowed = false; constructor(key, version) { super(key);