Skip to content

Commit

Permalink
Added UDP noise data validation.
Browse files Browse the repository at this point in the history
  • Loading branch information
bia-pain-bache committed Jan 30, 2025
1 parent 6b27933 commit c9dfb30
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 68 deletions.
74 changes: 32 additions & 42 deletions src/cores-configs/xray.js
Original file line number Diff line number Diff line change
Expand Up @@ -603,26 +603,22 @@ function buildXrayChainOutbound(chainProxyParams, enableIPv6) {
return proxyOutbound;
}

function buildFreedomOutbound (
domainStrategy,
tag,
fragmentPacket,
fragmentLength,
fragmentInterval,
udpNoises
) {
function buildFreedomOutbound (proxySettings, isFragment, isUdpNoises, tag) {
const {
xrayUdpNoises,
fragmentPackets,
lengthMin,
lengthMax,
intervalMin,
intervalMax,
enableIPv6,
warpEnableIPv6
} = proxySettings;

const outbound = {
tag: tag,
protocol: "freedom",
settings: {
fragment: {
packets: fragmentPacket,
length: fragmentLength,
interval: fragmentInterval,
},
noises: JSON.parse(udpNoises),
domainStrategy: domainStrategy
},
settings: {},
streamSettings: {
sockopt: {
tcpKeepAliveIdle: 30,
Expand All @@ -631,8 +627,19 @@ function buildFreedomOutbound (
},
};

!fragmentPacket && delete outbound.settings.fragment;
!udpNoises && delete outbound.settings.noises;
if (isFragment) {
outbound.settings.fragment = {
packets: fragmentPackets,
length: `${lengthMin}-${lengthMax}`,
interval: `${intervalMin}-${intervalMax}`,
};
outbound.settings.domainStrategy = enableIPv6 ? "UseIPv4v6" : "UseIPv4";
}

if (isUdpNoises) {
outbound.settings.noises = JSON.parse(xrayUdpNoises);
if (!isFragment) outbound.settings.domainStrategy = warpEnableIPv6 ? "UseIPv4v6" : "UseIPv4";
}
return outbound;
}

Expand Down Expand Up @@ -713,8 +720,9 @@ async function buildXrayBestFragmentConfig(proxySettings, hostName, chainProxy,
return config;
}

async function buildXrayWorkerLessConfig(proxySettings, fragmentOutbound) {
async function buildXrayWorkerLessConfig(proxySettings) {
const config = buildXrayConfig(proxySettings, `💦 ${atob('QlBC')} F - WorkerLess ⭐`, false, false, false, false);
const fragmentOutbound = buildFreedomOutbound(proxySettings, true, true, 'fragment');
config.outbounds.unshift(fragmentOutbound);
config.dns = await buildXrayDNS(proxySettings, [], undefined, true);
config.routing.rules = buildXrayRoutingRules(proxySettings, [], false, false, true, false);
Expand All @@ -731,11 +739,6 @@ export async function getXrayCustomConfigs(request, env, isFragment) {
let protocols = [];
let chainProxy;
const {
lengthMin,
lengthMax,
intervalMin,
intervalMax,
fragmentPackets,
proxyIP,
outProxy,
outProxyParams,
Expand Down Expand Up @@ -771,16 +774,7 @@ export async function getXrayCustomConfigs(request, env, isFragment) {
VLConfigs && protocols.push(atob('VkxFU1M='));
TRConfigs && protocols.push(atob('VHJvamFu'));
let proxyIndex = 1;
let freedomOutbound;
if (isFragment) {
freedomOutbound = buildFreedomOutbound(
enableIPv6 ? "UseIPv4v6" : "UseIPv4",
"fragment",
fragmentPackets,
`${lengthMin}-${lengthMax}`,
`${intervalMin}-${intervalMax}`
);
}
let freedomOutbound = isFragment ? buildFreedomOutbound(proxySettings, true, false, 'fragment') : null;

for (const protocol of protocols) {
let protocolIndex = 1;
Expand Down Expand Up @@ -823,7 +817,7 @@ export async function getXrayCustomConfigs(request, env, isFragment) {
const finalConfigs = [...configs, bestPing];
if (isFragment) {
const bestFragment = await buildXrayBestFragmentConfig(proxySettings, globalThis.hostName, chainProxy, outbounds);
const workerLessConfig = await buildXrayWorkerLessConfig(proxySettings, freedomOutbound);
const workerLessConfig = await buildXrayWorkerLessConfig(proxySettings);
finalConfigs.push(bestFragment, workerLessConfig);
}
return new Response(JSON.stringify(finalConfigs, null, 4), {
Expand All @@ -838,11 +832,7 @@ export async function getXrayCustomConfigs(request, env, isFragment) {

export async function getXrayWarpConfigs (request, env, client) {
const { proxySettings, warpConfigs } = await getDataset(request, env);
const {
warpEndpoints,
warpEnableIPv6,
xrayUdpNoises,
} = proxySettings;
const { warpEndpoints,warpEnableIPv6 } = proxySettings;
const xrayWarpConfigs = [];
const xrayWoWConfigs = [];
const xrayWarpOutbounds = [];
Expand All @@ -858,7 +848,7 @@ export async function getXrayWarpConfigs (request, env, client) {
const WoWConfig = buildXrayConfig(proxySettings, `💦 ${index + 1} - WoW${proIndicator}🌍`, false, true, false, true);
if (client === 'xray-pro') {
const domainStrategy = warpEnableIPv6 ? "UseIPv4v6" : "UseIPv4";
freedomOutbound = buildFreedomOutbound(domainStrategy, 'udp-noise', null, null, null, xrayUdpNoises);
freedomOutbound = buildFreedomOutbound(proxySettings, false, true, 'udp-noise');
warpConfig.outbounds.unshift(freedomOutbound);
WoWConfig.outbounds.unshift(freedomOutbound);
}
Expand Down
2 changes: 1 addition & 1 deletion src/kv/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export async function updateDataset (request, env) {
const udpNoiseDelaysMax = newSettings?.getAll('udpXrayNoiseDelayMax') || [];
udpNoises.push(...udpNoiseModes.map((mode, index) => ({
type: mode,
packet: udpNoisePackets[index], // Fallback to empty string if undefined
packet: udpNoisePackets[index],
delay: `${udpNoiseDelaysMin[index]}-${udpNoiseDelaysMax[index]}`
})));
} else {
Expand Down
64 changes: 39 additions & 25 deletions src/pages/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -1123,6 +1123,11 @@ export async function renderHomePage (proxySettings, isPassSet) {
}
const deleteUdpNoise = (button) => {
const container = document.getElementById("udp-noise-container");
if (container.children.length === 1) {
alert('⛔ You cannot delete all noises!');
return;
}
const confirmReset = confirm('⚠️ This will delete the noise.\\nAre you sure?');
if(!confirmReset) return;
button.closest(".udp-noise").remove();
Expand Down Expand Up @@ -1290,6 +1295,10 @@ export async function renderHomePage (proxySettings, isPassSet) {
!formData.has(checkbox.name) && formData.append(checkbox.name, 'false');
});
const base64Regex = /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/;
const udpNoiseModes = formData.getAll('udpXrayNoiseMode') || [];
const udpNoisePackets = formData.getAll('udpXrayNoisePacket') || [];
const udpNoiseDelaysMin = formData.getAll('udpXrayNoiseDelayMin') || [];
const udpNoiseDelaysMax = formData.getAll('udpXrayNoiseDelayMax') || [];
const invalidIPs = [...cleanIPs, ...proxyIPs, ...customCdnAddrs, ...customBypassRules, ...customBlockRules, customCdnHost, customCdnSni]?.filter(value => {
if (value) {
Expand Down Expand Up @@ -1334,32 +1343,37 @@ export async function renderHomePage (proxySettings, isPassSet) {
alert('⛔ All "Custom" fields should be filled or deleted together! 🫤');
return false;
}
let submisionError = false;
for (const [index, mode] of udpNoiseModes.entries()) {
if (udpNoiseDelaysMin[index] > udpNoiseDelaysMax[index]) {
alert('⛔ The minimum noise delay should be smaller or equal to maximum! 🫤');
submisionError = true;
break;
}
// if (xrayNoiseDelayMin > xrayNoiseDelayMax) {
// alert('⛔ The minimum delay should be smaller or equal to maximum! 🫤');
// return;
// }
// switch (xrayNoiseMode) {
// case 'base64':
// if (!base64Regex.test(xrayNoisePacket)) {
// alert('⛔ The Packet is not a valid base64 value! 🫤');
// return;
// }
// break;
// case 'rand':
// if (!(/^\\d+-\\d+$/.test(xrayNoisePacket))) {
// alert('⛔ The Packet should be a range like 0-10 or 10-30! 🫤');
// return;
// }
// const [min, max] = xrayNoisePacket.split("-").map(Number);
// if (min > max) {
// alert('⛔ The minimum value should be smaller or equal to maximum! 🫤');
// return;
// }
// break;
// }
switch (mode) {
case 'base64':
if (!base64Regex.test(udpNoisePackets[index])) {
alert('⛔ The Base64 noise packet is not a valid base64 value! 🫤');
submisionError = true;
}
break;
case 'rand':
if (!(/^\\d+-\\d+$/.test(udpNoisePackets[index]))) {
alert('⛔ The Random noise packet should be a range like 0-10 or 10-30! 🫤');
submisionError = true;
}
const [min, max] = udpNoisePackets[index].split("-").map(Number);
if (min > max) {
alert('⛔ The minimum Random noise packet should be smaller or equal to maximum! 🫤');
submisionError = true;
}
break;
}
}
if (submisionError) return false;
try {
document.body.style.cursor = 'wait';
Expand Down

0 comments on commit c9dfb30

Please sign in to comment.