fix: allow for private domains like example.local and others (#6711)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Frank Elsinga <frank@elsinga.de>
This commit is contained in:
parent
7306e7038a
commit
e022b5f976
@ -159,20 +159,19 @@ class DomainExpiry extends BeanModel {
|
|||||||
const tld = parseTld(target);
|
const tld = parseTld(target);
|
||||||
|
|
||||||
// Avoid logging for incomplete/invalid input while editing monitors.
|
// Avoid logging for incomplete/invalid input while editing monitors.
|
||||||
if (!tld.domain) {
|
|
||||||
throw new TranslatableError("domain_expiry_unsupported_invalid_domain", { hostname: tld.hostname });
|
|
||||||
}
|
|
||||||
if (!tld.publicSuffix) {
|
|
||||||
throw new TranslatableError("domain_expiry_unsupported_public_suffix", { publicSuffix: tld.publicSuffix });
|
|
||||||
}
|
|
||||||
if (tld.isIp) {
|
if (tld.isIp) {
|
||||||
throw new TranslatableError("domain_expiry_unsupported_is_ip", { hostname: tld.hostname });
|
throw new TranslatableError("domain_expiry_unsupported_is_ip", { hostname: tld.hostname });
|
||||||
}
|
}
|
||||||
|
|
||||||
// No one-letter public suffix exists; treat this as an incomplete/invalid input while typing.
|
// No one-letter public suffix exists; treat this as an incomplete/invalid input while typing.
|
||||||
if (tld.publicSuffix.length < 2) {
|
if (tld.publicSuffix.length < 2) {
|
||||||
throw new TranslatableError("domain_expiry_public_suffix_too_short", { publicSuffix: tld.publicSuffix });
|
throw new TranslatableError("domain_expiry_public_suffix_too_short", { publicSuffix: tld.publicSuffix });
|
||||||
}
|
}
|
||||||
|
if (!tld.isIcann) {
|
||||||
|
throw new TranslatableError("domain_expiry_unsupported_is_icann", {
|
||||||
|
domain: tld.domain,
|
||||||
|
publicSuffix: tld.publicSuffix,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const rdap = await getRdapServer(tld.publicSuffix);
|
const rdap = await getRdapServer(tld.publicSuffix);
|
||||||
if (!rdap) {
|
if (!rdap) {
|
||||||
|
|||||||
@ -1297,9 +1297,8 @@
|
|||||||
"domainExpiryDescription": "Trigger notification when domain names expires in:",
|
"domainExpiryDescription": "Trigger notification when domain names expires in:",
|
||||||
"domain_expiry_unsupported_monitor_type": "Domain expiry monitoring is not supported for this monitor type",
|
"domain_expiry_unsupported_monitor_type": "Domain expiry monitoring is not supported for this monitor type",
|
||||||
"domain_expiry_unsupported_missing_target": "No valid domain or hostname is configured for this monitor",
|
"domain_expiry_unsupported_missing_target": "No valid domain or hostname is configured for this monitor",
|
||||||
"domain_expiry_unsupported_invalid_domain": "The configured value \"{hostname}\" is not a valid domain name",
|
|
||||||
"domain_expiry_public_suffix_too_short": "\".{publicSuffix}\" is too short for a top level domain",
|
"domain_expiry_public_suffix_too_short": "\".{publicSuffix}\" is too short for a top level domain",
|
||||||
"domain_expiry_unsupported_public_suffix": "The domain \"{domain}\" does not have a valid public suffix",
|
"domain_expiry_unsupported_is_icann": "The domain \"{domain}\" is not a candidate for domain expiry monitoring, because its public suffix \".{publicSuffix}\" is not ICAN",
|
||||||
"domain_expiry_unsupported_is_ip": "\"{hostname}\" is an IP address. Domain expiry monitoring requires a domain name",
|
"domain_expiry_unsupported_is_ip": "\"{hostname}\" is an IP address. Domain expiry monitoring requires a domain name",
|
||||||
"domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint": "Domain expiry monitoring is not available for \".{publicSuffix}\" because no RDAP service is listed by IANA",
|
"domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint": "Domain expiry monitoring is not available for \".{publicSuffix}\" because no RDAP service is listed by IANA",
|
||||||
"minimumIntervalWarning": "Intervals below 20 seconds may result in poor performance.",
|
"minimumIntervalWarning": "Intervals below 20 seconds may result in poor performance.",
|
||||||
|
|||||||
@ -96,58 +96,26 @@ describe("Domain Expiry", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("Domain Parsing", () => {
|
describe("Domain Parsing", () => {
|
||||||
test("throws error for invalid domain (no domain part)", async () => {
|
test("throws error for IP address (isIp check)", async () => {
|
||||||
const monitor = {
|
const monitor = {
|
||||||
type: "http",
|
type: "http",
|
||||||
url: "https://",
|
url: "https://127.0.0.1",
|
||||||
domainExpiryNotification: true,
|
domainExpiryNotification: true,
|
||||||
};
|
};
|
||||||
await assert.rejects(
|
await assert.rejects(
|
||||||
async () => await DomainExpiry.checkSupport(monitor),
|
async () => await DomainExpiry.checkSupport(monitor),
|
||||||
(error) => {
|
(error) => {
|
||||||
assert.strictEqual(error.constructor.name, "TranslatableError");
|
assert.strictEqual(error.constructor.name, "TranslatableError");
|
||||||
assert.strictEqual(error.message, "domain_expiry_unsupported_invalid_domain");
|
assert.strictEqual(error.message, "domain_expiry_unsupported_is_ip");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("throws error for IPv4 address instead of domain", async () => {
|
test("throws error for too short suffix(example.a)", async () => {
|
||||||
const monitor = {
|
const monitor = {
|
||||||
type: "http",
|
type: "http",
|
||||||
url: "https://192.168.1.1",
|
url: "https://example.a",
|
||||||
domainExpiryNotification: true,
|
|
||||||
};
|
|
||||||
await assert.rejects(
|
|
||||||
async () => await DomainExpiry.checkSupport(monitor),
|
|
||||||
(error) => {
|
|
||||||
assert.strictEqual(error.constructor.name, "TranslatableError");
|
|
||||||
assert.strictEqual(error.message, "domain_expiry_unsupported_invalid_domain");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("throws error for IPv6 address", async () => {
|
|
||||||
const monitor = {
|
|
||||||
type: "http",
|
|
||||||
url: "https://[2001:db8::1]",
|
|
||||||
domainExpiryNotification: true,
|
|
||||||
};
|
|
||||||
await assert.rejects(
|
|
||||||
async () => await DomainExpiry.checkSupport(monitor),
|
|
||||||
(error) => {
|
|
||||||
assert.strictEqual(error.constructor.name, "TranslatableError");
|
|
||||||
assert.strictEqual(error.message, "domain_expiry_unsupported_invalid_domain");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("throws error for single-letter TLD", async () => {
|
|
||||||
const monitor = {
|
|
||||||
type: "http",
|
|
||||||
url: "https://example.x",
|
|
||||||
domainExpiryNotification: true,
|
domainExpiryNotification: true,
|
||||||
};
|
};
|
||||||
await assert.rejects(
|
await assert.rejects(
|
||||||
@ -159,6 +127,22 @@ describe("Domain Expiry", () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("throws error for non-ICANN TLD (e.g. .local)", async () => {
|
||||||
|
const monitor = {
|
||||||
|
type: "http",
|
||||||
|
url: "https://example.local",
|
||||||
|
domainExpiryNotification: true,
|
||||||
|
};
|
||||||
|
await assert.rejects(
|
||||||
|
async () => await DomainExpiry.checkSupport(monitor),
|
||||||
|
(error) => {
|
||||||
|
assert.strictEqual(error.constructor.name, "TranslatableError");
|
||||||
|
assert.strictEqual(error.message, "domain_expiry_unsupported_is_icann");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Edge Cases & RDAP Support", () => {
|
describe("Edge Cases & RDAP Support", () => {
|
||||||
@ -205,22 +189,6 @@ describe("Domain Expiry", () => {
|
|||||||
assert.strictEqual(supportInfo.domain, "example.com");
|
assert.strictEqual(supportInfo.domain, "example.com");
|
||||||
assert.strictEqual(supportInfo.tld, "com");
|
assert.strictEqual(supportInfo.tld, "com");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("throws error for unsupported TLD without RDAP endpoint", async () => {
|
|
||||||
const monitor = {
|
|
||||||
type: "http",
|
|
||||||
url: "https://example.localhost",
|
|
||||||
domainExpiryNotification: true,
|
|
||||||
};
|
|
||||||
await assert.rejects(
|
|
||||||
async () => await DomainExpiry.checkSupport(monitor),
|
|
||||||
(error) => {
|
|
||||||
assert.strictEqual(error.constructor.name, "TranslatableError");
|
|
||||||
assert.strictEqual(error.message, "domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user