From 5b7a1cf5c30fac19cecd15195a0e194740a950ef Mon Sep 17 00:00:00 2001 From: ReturnFI <151555003+ReturnFI@users.noreply.github.com> Date: Thu, 16 Oct 2025 20:34:22 +0000 Subject: [PATCH] feat(web): Implement full node configuration in settings UI --- core/scripts/webpanel/assets/js/settings.js | 67 ++++++++++++++++++- core/scripts/webpanel/templates/settings.html | 52 ++++++++++---- 2 files changed, 105 insertions(+), 14 deletions(-) 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 = `