From 9d89258c0c827ddffa617c01deb5e3388ae73b76 Mon Sep 17 00:00:00 2001 From: divocat Date: Thu, 9 Oct 2025 17:31:10 +0300 Subject: [PATCH] fix: correct vless/trojan validation on some browsers --- .../src/validators/validateTrojanUrl.ts | 31 +++++++------- .../src/validators/validateVlessUrl.ts | 15 +++---- .../luci-static/resources/view/podkop/main.js | 42 ++++++++++--------- 3 files changed, 46 insertions(+), 42 deletions(-) diff --git a/fe-app-podkop/src/validators/validateTrojanUrl.ts b/fe-app-podkop/src/validators/validateTrojanUrl.ts index 8e9e627..811d76c 100644 --- a/fe-app-podkop/src/validators/validateTrojanUrl.ts +++ b/fe-app-podkop/src/validators/validateTrojanUrl.ts @@ -2,22 +2,23 @@ import { ValidationResult } from './types'; // TODO refactor current validation and add tests export function validateTrojanUrl(url: string): ValidationResult { - if (!url.startsWith('trojan://')) { - return { - valid: false, - message: _('Invalid Trojan URL: must start with trojan://'), - }; - } - - if (!url || /\s/.test(url)) { - return { - valid: false, - message: _('Invalid Trojan URL: must not contain spaces'), - }; - } - try { - const parsedUrl = new URL(url); + if (!url.startsWith('trojan://')) { + return { + valid: false, + message: _('Invalid Trojan URL: must start with trojan://'), + }; + } + + if (!url || /\s/.test(url)) { + return { + valid: false, + message: _('Invalid Trojan URL: must not contain spaces'), + }; + } + + const refinedURL = url.replace('trojan://', 'https://'); + const parsedUrl = new URL(refinedURL); if (!parsedUrl.username || !parsedUrl.hostname || !parsedUrl.port) { return { diff --git a/fe-app-podkop/src/validators/validateVlessUrl.ts b/fe-app-podkop/src/validators/validateVlessUrl.ts index 73746e4..3956306 100644 --- a/fe-app-podkop/src/validators/validateVlessUrl.ts +++ b/fe-app-podkop/src/validators/validateVlessUrl.ts @@ -2,7 +2,12 @@ import { ValidationResult } from './types'; export function validateVlessUrl(url: string): ValidationResult { try { - const parsedUrl = new URL(url); + if (!url.startsWith('vless://')) { + return { + valid: false, + message: _('Invalid VLESS URL: must start with vless://'), + }; + } if (!url || /\s/.test(url)) { return { @@ -11,12 +16,8 @@ export function validateVlessUrl(url: string): ValidationResult { }; } - if (parsedUrl.protocol !== 'vless:') { - return { - valid: false, - message: _('Invalid VLESS URL: must start with vless://'), - }; - } + const refinedURL = url.replace('vless://', 'https://'); + const parsedUrl = new URL(refinedURL); if (!parsedUrl.username) { return { valid: false, message: _('Invalid VLESS URL: missing UUID') }; diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/main.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/main.js index 31db43d..3018ad4 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/main.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/main.js @@ -213,19 +213,20 @@ function validateShadowsocksUrl(url) { // src/validators/validateVlessUrl.ts function validateVlessUrl(url) { try { - const parsedUrl = new URL(url); + if (!url.startsWith("vless://")) { + return { + valid: false, + message: _("Invalid VLESS URL: must start with vless://") + }; + } if (!url || /\s/.test(url)) { return { valid: false, message: _("Invalid VLESS URL: must not contain spaces") }; } - if (parsedUrl.protocol !== "vless:") { - return { - valid: false, - message: _("Invalid VLESS URL: must start with vless://") - }; - } + const refinedURL = url.replace("vless://", "https://"); + const parsedUrl = new URL(refinedURL); if (!parsedUrl.username) { return { valid: false, message: _("Invalid VLESS URL: missing UUID") }; } @@ -324,20 +325,21 @@ function validateOutboundJson(value) { // src/validators/validateTrojanUrl.ts function validateTrojanUrl(url) { - if (!url.startsWith("trojan://")) { - return { - valid: false, - message: _("Invalid Trojan URL: must start with trojan://") - }; - } - if (!url || /\s/.test(url)) { - return { - valid: false, - message: _("Invalid Trojan URL: must not contain spaces") - }; - } try { - const parsedUrl = new URL(url); + if (!url.startsWith("trojan://")) { + return { + valid: false, + message: _("Invalid Trojan URL: must start with trojan://") + }; + } + if (!url || /\s/.test(url)) { + return { + valid: false, + message: _("Invalid Trojan URL: must not contain spaces") + }; + } + const refinedURL = url.replace("trojan://", "https://"); + const parsedUrl = new URL(refinedURL); if (!parsedUrl.username || !parsedUrl.hostname || !parsedUrl.port) { return { valid: false,