diff --git a/server/model/domain_expiry.js b/server/model/domain_expiry.js
index fafcffa2..3e11599a 100644
--- a/server/model/domain_expiry.js
+++ b/server/model/domain_expiry.js
@@ -220,17 +220,11 @@ class DomainExpiry extends BeanModel {
const tld = parseTld(target);
- // Avoid logging for incomplete/invalid input while editing monitors.
- if (tld.isIp) {
- 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.
- if (tld.publicSuffix.length < 2) {
- throw new TranslatableError("domain_expiry_public_suffix_too_short", { publicSuffix: tld.publicSuffix });
- }
+ // It must be checked first, filter out non-ICANN domains.
if (!tld.isIcann) {
throw new TranslatableError("domain_expiry_unsupported_is_icann", {
- domain: tld.domain,
+ // If domain is null, use hostname as fallback for better error message.
+ domain: tld.domain ?? tld.hostname ?? "EMPTY DOMAIN",
publicSuffix: tld.publicSuffix,
});
}
diff --git a/server/server.js b/server/server.js
index 49d995e9..6d2aff97 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1003,7 +1003,8 @@ let needSetup = false;
}
});
- socket.on("checkMointor", async (partial, callback) => {
+ // partial { type, url, hostname, grpcUrl }
+ socket.on("checkDomain", async (partial, callback) => {
try {
checkLogin(socket);
const DomainExpiry = require("./model/domain_expiry");
diff --git a/src/lang/en.json b/src/lang/en.json
index 481299fb..3e6b2638 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -1407,9 +1407,7 @@
"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_missing_target": "No valid domain or hostname is configured for this monitor",
- "domain_expiry_public_suffix_too_short": "\".{publicSuffix}\" is too short for a top level domain",
- "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_icann": "The domain \"{domain}\" is not a candidate for domain expiry monitoring, because its public suffix \".{publicSuffix}\" is not managed by ICANN",
"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.",
"lowIntervalWarning": "Are you sure want to set the interval value below 20 seconds? Performance may be degraded, particularly if there are a large number of monitors.",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 359d75cf..e7387bd4 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -1548,15 +1548,17 @@
v-model="monitor.domainExpiryNotification"
class="form-check-input"
type="checkbox"
- :disabled="!hasDomain"
/>
-