refactor: migrate Outbound Configuration validation to modular

This commit is contained in:
divocat
2025-10-03 03:26:02 +03:00
parent 65d3a9253f
commit 8f9bff9a64
10 changed files with 55 additions and 15 deletions

View File

@@ -7,3 +7,4 @@ export * from './validateSubnet';
export * from './bulkValidate';
export * from './validateShadowsocksUrl';
export * from './validateVlessUrl';
export * from './validateOutboundJson';

View File

@@ -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) {

View File

@@ -1,4 +1,4 @@
import { ValidationResult } from './types.js';
import { ValidationResult } from './types';
export function validateDomain(domain: string): ValidationResult {
const domainRegex =

View File

@@ -1,4 +1,4 @@
import { ValidationResult } from './types.js';
import { ValidationResult } from './types';
export function validateIPV4(ip: string): ValidationResult {
const ipRegex =

View File

@@ -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' };
}
}

View File

@@ -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 {

View File

@@ -1,4 +1,4 @@
import { ValidationResult } from './types.js';
import { ValidationResult } from './types';
import { validateIPV4 } from './validateIp';
export function validateSubnet(value: string): ValidationResult {

View File

@@ -1,4 +1,4 @@
import { ValidationResult } from './types.js';
import { ValidationResult } from './types';
export function validateUrl(
url: string,

View File

@@ -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');
// Optional
if (!value || value.length === 0) {
return true
}
const validation = main.validateOutboundJson(value);
if (validation.valid) {
return true;
} catch (e) {
return _('Invalid JSON format');
}
return _(validation.message)
};
o = s.taboption('basic', form.DynamicList, 'urltest_proxy_links', _('URLTest Proxy Links'));

View File

@@ -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,