diff --git a/server/model/domain_expiry.js b/server/model/domain_expiry.js index 3502a4b08..ec97c04ff 100644 --- a/server/model/domain_expiry.js +++ b/server/model/domain_expiry.js @@ -30,10 +30,23 @@ async function getRdapServer(tld) { return null; } - for (const service of rdapList["services"]) { - const [tlds, urls] = service; - if (tlds.includes(tld)) { - return urls[0]; + const candidates = []; + if (tld) { + candidates.push(tld); + if (tld.includes(".")) { + const root = tld.split(".").pop(); + if (root && root !== tld) { + candidates.push(root); + } + } + } + + for (const candidate of candidates) { + for (const service of rdapList["services"]) { + const [tlds, urls] = service; + if (tlds.includes(candidate)) { + return urls[0]; + } } } log.debug("rdap", `No RDAP server found for TLD ${tld}`); diff --git a/test/backend-test/test-domain.js b/test/backend-test/test-domain.js index c00d94e24..8b357db5f 100644 --- a/test/backend-test/test-domain.js +++ b/test/backend-test/test-domain.js @@ -157,6 +157,17 @@ describe("Domain Expiry", () => { assert.strictEqual(supportInfo.tld, "com"); }); + test("supports multi-level public suffix via RDAP fallback (e.g. com.br)", async () => { + const monitor = { + type: "http", + url: "https://record.com.br", + domainExpiryNotification: true, + }; + const supportInfo = await DomainExpiry.checkSupport(monitor); + assert.strictEqual(supportInfo.domain, "record.com.br"); + assert.strictEqual(supportInfo.tld, "com.br"); + }); + test("handles complex subdomain correctly", async () => { const monitor = { type: "http",