diff --git a/fe-app-podkop/src/validators/index.ts b/fe-app-podkop/src/validators/index.ts index bedc361..8c6c5e1 100644 --- a/fe-app-podkop/src/validators/index.ts +++ b/fe-app-podkop/src/validators/index.ts @@ -7,3 +7,4 @@ export * from './validateSubnet'; export * from './bulkValidate'; export * from './validateShadowsocksUrl'; export * from './validateVlessUrl'; +export * from './validateOutboundJson'; diff --git a/fe-app-podkop/src/validators/validateDns.ts b/fe-app-podkop/src/validators/validateDns.ts index ea1fec7..f779d22 100644 --- a/fe-app-podkop/src/validators/validateDns.ts +++ b/fe-app-podkop/src/validators/validateDns.ts @@ -1,6 +1,6 @@ import { validateDomain } from './validateDomain'; import { validateIPV4 } from './validateIp'; -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; export function validateDNS(value: string): ValidationResult { if (!value) { diff --git a/fe-app-podkop/src/validators/validateDomain.ts b/fe-app-podkop/src/validators/validateDomain.ts index ae90296..343fd86 100644 --- a/fe-app-podkop/src/validators/validateDomain.ts +++ b/fe-app-podkop/src/validators/validateDomain.ts @@ -1,4 +1,4 @@ -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; export function validateDomain(domain: string): ValidationResult { const domainRegex = diff --git a/fe-app-podkop/src/validators/validateIp.ts b/fe-app-podkop/src/validators/validateIp.ts index 4d1967b..88ab1f0 100644 --- a/fe-app-podkop/src/validators/validateIp.ts +++ b/fe-app-podkop/src/validators/validateIp.ts @@ -1,4 +1,4 @@ -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; export function validateIPV4(ip: string): ValidationResult { const ipRegex = diff --git a/fe-app-podkop/src/validators/validateOutboundJson.ts b/fe-app-podkop/src/validators/validateOutboundJson.ts new file mode 100644 index 0000000..c768543 --- /dev/null +++ b/fe-app-podkop/src/validators/validateOutboundJson.ts @@ -0,0 +1,20 @@ +import { ValidationResult } from './types'; + +// TODO refactor current validation and add tests +export function validateOutboundJson(value: string): ValidationResult { + try { + const parsed = JSON.parse(value); + + if (!parsed.type || !parsed.server || !parsed.server_port) { + return { + valid: false, + message: + 'Outbound JSON must contain at least "type", "server" and "server_port" fields', + }; + } + + return { valid: true, message: 'Valid' }; + } catch { + return { valid: false, message: 'Invalid JSON format' }; + } +} diff --git a/fe-app-podkop/src/validators/validateShadowsocksUrl.ts b/fe-app-podkop/src/validators/validateShadowsocksUrl.ts index 8c2adb1..b52a624 100644 --- a/fe-app-podkop/src/validators/validateShadowsocksUrl.ts +++ b/fe-app-podkop/src/validators/validateShadowsocksUrl.ts @@ -1,4 +1,4 @@ -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; // TODO refactor current validation and add tests export function validateShadowsocksUrl(url: string): ValidationResult { diff --git a/fe-app-podkop/src/validators/validateSubnet.ts b/fe-app-podkop/src/validators/validateSubnet.ts index f0022c0..6f3e2b9 100644 --- a/fe-app-podkop/src/validators/validateSubnet.ts +++ b/fe-app-podkop/src/validators/validateSubnet.ts @@ -1,4 +1,4 @@ -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; import { validateIPV4 } from './validateIp'; export function validateSubnet(value: string): ValidationResult { diff --git a/fe-app-podkop/src/validators/validateUrl.ts b/fe-app-podkop/src/validators/validateUrl.ts index 865af9d..57e883a 100644 --- a/fe-app-podkop/src/validators/validateUrl.ts +++ b/fe-app-podkop/src/validators/validateUrl.ts @@ -1,4 +1,4 @@ -import { ValidationResult } from './types.js'; +import { ValidationResult } from './types'; export function validateUrl( url: string, diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/configSection.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/configSection.js index 7a88eed..4c8a2ae 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/configSection.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/configSection.js @@ -124,16 +124,18 @@ function createConfigSection(section, map, network) { o.rows = 10; o.ucisection = s.section; o.validate = function (section_id, value) { - if (!value || value.length === 0) return true; - try { - const parsed = JSON.parse(value); - if (!parsed.type || !parsed.server || !parsed.server_port) { - return _('JSON must contain at least type, server and server_port fields'); - } - return true; - } catch (e) { - return _('Invalid JSON format'); + // Optional + if (!value || value.length === 0) { + return true } + + const validation = main.validateOutboundJson(value); + + if (validation.valid) { + return true; + } + + return _(validation.message) }; o = s.taboption('basic', form.DynamicList, 'urltest_proxy_links', _('URLTest Proxy Links')); 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 1752146..f97049d 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 @@ -261,6 +261,22 @@ function validateVlessUrl(url) { return { valid: true, message: "Valid" }; } +// src/validators/validateOutboundJson.ts +function validateOutboundJson(value) { + try { + const parsed = JSON.parse(value); + if (!parsed.type || !parsed.server || !parsed.server_port) { + return { + valid: false, + message: 'Outbound JSON must contain at least "type", "server" and "server_port" fields' + }; + } + return { valid: true, message: "Valid" }; + } catch { + return { valid: false, message: "Invalid JSON format" }; + } +} + // src/helpers/getBaseUrl.ts function getBaseUrl() { const { protocol, hostname } = window.location; @@ -405,6 +421,7 @@ return baseclass.extend({ validateDNS, validateDomain, validateIPV4, + validateOutboundJson, validatePath, validateShadowsocksUrl, validateSubnet,