diff --git a/core/scripts/webpanel/assets/js/settings.js b/core/scripts/webpanel/assets/js/settings.js
index 79567d6..d97c2a4 100644
--- a/core/scripts/webpanel/assets/js/settings.js
+++ b/core/scripts/webpanel/assets/js/settings.js
@@ -67,7 +67,11 @@ $(document).ready(function () {
function isValidDomain(domain) {
if (!domain) return false;
const lowerDomain = domain.toLowerCase();
- return !lowerDomain.startsWith("http://") && !lowerDomain.startsWith("https://");
+ if (lowerDomain.startsWith("http://") || lowerDomain.startsWith("https://")) return false;
+ const ipV4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
+ if(ipV4Regex.test(domain)) return false;
+ const domainRegex = /^(?!-)(?:[a-zA-Z\d-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+$)[a-zA-Z\d]{1,63}$/;
+ return domainRegex.test(lowerDomain);
}
function isValidPort(port) {
@@ -75,6 +79,12 @@ $(document).ready(function () {
return /^[0-9]+$/.test(port) && parseInt(port) > 0 && parseInt(port) <= 65535;
}
+ function isValidSha256Pin(pin) {
+ if (!pin) return false;
+ const pinRegex = /^([0-9A-F]{2}:){31}[0-9A-F]{2}$/i;
+ return pinRegex.test(pin.trim());
+ }
+
function isValidSubPath(subpath) {
if (!subpath) return false;
return /^[a-zA-Z0-9]+$/.test(subpath);
@@ -198,6 +208,14 @@ $(document).ready(function () {
}
} else if (id === 'decoy_path') {
fieldValid = isValidPath(input.val());
+ } else if (id === 'node_port') {
+ fieldValid = (input.val().trim() === '') ? true : isValidPort(input.val());
+ } else if (id === 'node_sni') {
+ fieldValid = (input.val().trim() === '') ? true : isValidDomain(input.val());
+ } else if (id === 'node_pin') {
+ fieldValid = (input.val().trim() === '') ? true : isValidSha256Pin(input.val());
+ } else if (id === 'node_obfs') {
+ fieldValid = true;
} else {
if (input.attr('placeholder') && input.attr('placeholder').includes('Enter') && !input.attr('id').startsWith('ipv')) {
fieldValid = input.val().trim() !== "";
@@ -265,6 +283,10 @@ $(document).ready(function () {
const row = `
| ${escapeHtml(node.name)} |
${escapeHtml(node.ip)} |
+ ${escapeHtml(node.port || 'N/A')} |
+ ${escapeHtml(node.sni || 'N/A')} |
+ ${escapeHtml(node.obfs || 'N/A')} |
+ ${escapeHtml(node.pinSHA256 || 'N/A')} |
|