Skip to content

Commit

Permalink
Added UDP Noise to Xray warp pro configs.
Browse files Browse the repository at this point in the history
  • Loading branch information
bia-pain-bache committed Jan 28, 2025
1 parent 2cbf47a commit 3e5b791
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 13 deletions.
41 changes: 32 additions & 9 deletions src/cores-configs/xray.js
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ function buildXrayTROutbound (tag, address, port, host, sni, proxyIP, isFragment
return outbound;
}

function buildXrayWarpOutbound (proxySettings, warpConfigs, endpoint, isChain, client) {
function buildXrayWarpOutbound (proxySettings, warpConfigs, endpoint, chain, client) {
const {
warpEnableIPv6,
nikaNGNoiseMode,
Expand All @@ -395,12 +395,13 @@ function buildXrayWarpOutbound (proxySettings, warpConfigs, endpoint, isChain, c
noiseDelayMax
} = proxySettings;

const isWoW = chain === 'proxy';
const {
warpIPv6,
reserved,
publicKey,
privateKey
} = extractWireguardParams(warpConfigs, isChain);
} = extractWireguardParams(warpConfigs, isWoW);

const outbound = {
protocol: "wireguard",
Expand All @@ -422,15 +423,15 @@ function buildXrayWarpOutbound (proxySettings, warpConfigs, endpoint, isChain, c
},
streamSettings: {
sockopt: {
dialerProxy: "proxy",
dialerProxy: chain,
domainStrategy: warpEnableIPv6 ? "UseIPv4v6" : "UseIPv4",
}
},
tag: isChain ? "chain" : "proxy"
tag: isWoW ? "chain" : "proxy"
};

!isChain && delete outbound.streamSettings;
client === 'nikang' && !isChain && Object.assign(outbound.settings, {
!chain && delete outbound.streamSettings;
client === 'nikang' && !isWoW && delete outbound.streamSettings && Object.assign(outbound.settings, {
wnoise: nikaNGNoiseMode,
wnoisecount: noiseCountMin === noiseCountMax ? noiseCountMin : `${noiseCountMin}-${noiseCountMax}`,
wpayloadsize: noiseSizeMin === noiseSizeMax ? noiseSizeMin : `${noiseSizeMin}-${noiseSizeMax}`,
Expand Down Expand Up @@ -613,7 +614,11 @@ function buildXrayConfig (proxySettings, remark, isFragment, isBalancer, isChain
lengthMax,
intervalMin,
intervalMax,
fragmentPackets
fragmentPackets,
udpXrayNoiseMode,
udpXrayNoisePacket,
udpXrayNoiseDelayMin,
udpXrayNoiseDelayMax
} = proxySettings;

const isFakeDNS = (VLTRFakeDNS && !isWarp) || (warpFakeDNS && isWarp);
Expand All @@ -630,6 +635,17 @@ function buildXrayConfig (proxySettings, remark, isFragment, isBalancer, isChain
fragment.interval = `${intervalMin}-${intervalMax}`;
fragment.packets = fragmentPackets;
config.outbounds[0].settings.domainStrategy = enableIPv6 ? "UseIPv4v6" : "UseIPv4";
} else if (udpXrayNoiseMode !== 'none') {
const freedomSettings = config.outbounds[0].settings;
delete freedomSettings.fragment;
config.outbounds[0].tag = 'udp-noise';
freedomSettings.noises = [
{
type: udpXrayNoiseMode,
packet: udpXrayNoisePacket,
delay: `${udpXrayNoiseDelayMin}-${udpXrayNoiseDelayMax}`
}
];
} else {
config.outbounds.shift();
}
Expand Down Expand Up @@ -811,16 +827,21 @@ export async function getXrayWarpConfigs (request, env, client) {
const { warpEndpoints } = proxySettings;
const outboundDomains = warpEndpoints.split(',').map(endpoint => endpoint.split(':')[0]).filter(address => isDomain(address));
const proIndicator = client === 'nikang' ? ' Pro ' : ' ';
const xrayWarpChain = client === 'xray-pro' ? 'udp-noise' : undefined;

for (const [index, endpoint] of warpEndpoints.split(',').entries()) {
const endpointHost = endpoint.split(':')[0];
const warpConfig = buildXrayConfig(proxySettings, `💦 ${index + 1} - Warp${proIndicator}🇮🇷`, false, false, false, false, true);
const WoWConfig = buildXrayConfig(proxySettings, `💦 ${index + 1} - WoW${proIndicator}🌍`, false, false, true, false, true);
if (client !== 'xray-pro') {
warpConfig.outbounds.shift();
WoWConfig.outbounds.shift();
}
warpConfig.dns = WoWConfig.dns = await buildXrayDNS(proxySettings, [endpointHost], undefined, false, true);
warpConfig.routing.rules = buildXrayRoutingRules(proxySettings, [endpointHost], false, false, false, true);
WoWConfig.routing.rules = buildXrayRoutingRules(proxySettings, [endpointHost], true, false, false, true);
const warpOutbound = buildXrayWarpOutbound(proxySettings, warpConfigs, endpoint, false, client);
const WoWOutbound = buildXrayWarpOutbound(proxySettings, warpConfigs, endpoint, true, client);
const warpOutbound = buildXrayWarpOutbound(proxySettings, warpConfigs, endpoint, xrayWarpChain, client);
const WoWOutbound = buildXrayWarpOutbound(proxySettings, warpConfigs, endpoint, 'proxy', client);
warpConfig.outbounds.unshift(warpOutbound);
WoWConfig.outbounds.unshift(WoWOutbound, warpOutbound);
xrayWarpConfigs.push(warpConfig);
Expand All @@ -836,10 +857,12 @@ export async function getXrayWarpConfigs (request, env, client) {

const dnsObject = await buildXrayDNS(proxySettings, outboundDomains, undefined, false, true);
const xrayWarpBestPing = buildXrayConfig(proxySettings, `💦 Warp${proIndicator}- Best Ping 🚀`, false, true, false, false, true);
client !== 'xray-pro' && xrayWarpBestPing.outbounds.shift();
xrayWarpBestPing.dns = dnsObject;
xrayWarpBestPing.routing.rules = buildXrayRoutingRules(proxySettings, outboundDomains, false, true, false, true);
xrayWarpBestPing.outbounds.unshift(...xrayWarpOutbounds);
const xrayWoWBestPing = buildXrayConfig(proxySettings, `💦 WoW${proIndicator}- Best Ping 🚀`, false, true, true, false, true);
client !== 'xray-pro' && xrayWoWBestPing.outbounds.shift();
xrayWoWBestPing.dns = dnsObject;
xrayWoWBestPing.routing.rules = buildXrayRoutingRules(proxySettings, outboundDomains, true, true, false, true);
xrayWoWBestPing.outbounds.unshift(...xrayWoWOutbounds, ...xrayWarpOutbounds);
Expand Down
11 changes: 9 additions & 2 deletions src/helpers/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,17 @@ export async function handlePanel(request, env) {

export async function fallback(request) {
const url = new URL(request.url);
if (url.pathname !== '/') return new Response('Invalid path', {status: 400});
url.hostname = globalThis.fallbackDomain;
url.protocol = 'https:';
request = new Request(url, request);
return await fetch(request);
const newRequest = new Request(url.toString(), {
method: request.method,
headers: request.headers,
body: request.body,
redirect: 'manual'
});

return await fetch(newRequest);
}

export async function getMyIP(request) {
Expand Down
2 changes: 1 addition & 1 deletion src/helpers/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export function initializeParams(request, env) {
const proxyIPs = env.PROXYIP?.split(',').map(proxyIP => proxyIP.trim());
const url = new URL(request.url);
const searchParams = new URLSearchParams(url.search);
globalThis.panelVersion = '3.0.4';
globalThis.panelVersion = '3.0.5';
globalThis.defaultHttpPorts = ['80', '8080', '2052', '2082', '2086', '2095', '8880'];
globalThis.defaultHttpsPorts = ['443', '8443', '2053', '2083', '2087', '2096'];
globalThis.userID = env.UUID;
Expand Down
5 changes: 4 additions & 1 deletion src/kv/handlers.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { fetchWarpConfigs } from '../protocols/warp';
import { isDomain, resolveDNS } from '../helpers/helpers';
import { Authenticate } from '../authentication/auth';

export async function getDataset(request, env) {
Expand Down Expand Up @@ -82,6 +81,10 @@ export async function updateDataset (request, env) {
warpEnableIPv6: validateField('warpEnableIPv6') ?? currentSettings?.warpEnableIPv6 ?? true,
warpPlusLicense: validateField('warpPlusLicense') ?? currentSettings?.warpPlusLicense ?? '',
bestWarpInterval: validateField('bestWarpInterval') ?? currentSettings?.bestWarpInterval ?? '30',
udpXrayNoiseMode: validateField('udpXrayNoiseMode') ?? currentSettings?.udpXrayNoiseMode ?? 'base64',
udpXrayNoisePacket: validateField('udpXrayNoisePacket') ?? currentSettings?.udpXrayNoisePacket ?? btoa(globalThis.userID),
udpXrayNoiseDelayMin: validateField('udpXrayNoiseDelayMin') ?? currentSettings?.udpXrayNoiseDelayMin ?? '1',
udpXrayNoiseDelayMax: validateField('udpXrayNoiseDelayMax') ?? currentSettings?.udpXrayNoiseDelayMax ?? '1',
hiddifyNoiseMode: validateField('hiddifyNoiseMode') ?? currentSettings?.hiddifyNoiseMode ?? 'm4',
nikaNGNoiseMode: validateField('nikaNGNoiseMode') ?? currentSettings?.nikaNGNoiseMode ?? 'quic',
noiseCountMin: validateField('noiseCountMin') ?? currentSettings?.noiseCountMin ?? '10',
Expand Down
70 changes: 70 additions & 0 deletions src/pages/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ export async function renderHomePage (proxySettings, isPassSet) {
warpEnableIPv6,
warpPlusLicense,
bestWarpInterval,
udpXrayNoiseMode,
udpXrayNoisePacket,
udpXrayNoiseDelayMin,
udpXrayNoiseDelayMax,
hiddifyNoiseMode,
nikaNGNoiseMode,
noiseCountMin,
Expand Down Expand Up @@ -572,6 +576,32 @@ export async function renderHomePage (proxySettings, isPassSet) {
</details>
<details>
<summary><h2>WARP PRO ⚙️</h2></summary>
<h3>V2RAYNG - V2RAYN 🔧</h3>
<div class="form-control">
<label for="udpXrayNoiseMode">😵‍💫 v2ray Mode</label>
<div class="input-with-select">
<select id="udpXrayNoiseMode" name="udpXrayNoiseMode">
<option value="base64" ${udpXrayNoiseMode === 'base64' ? 'selected' : ''}>Base64</option>
<option value="rand" ${udpXrayNoiseMode === 'rand' ? 'selected' : ''}>Random</option>
<option value="str" ${udpXrayNoiseMode === 'str' ? 'selected' : ''}>String</option>
</select>
</div>
</div>
<div class="form-control">
<label for="udpXrayNoisePacket">📥 Noise Packet</label>
<input type="text" id="udpXrayNoisePacket" name="udpXrayNoisePacket" value="${udpXrayNoisePacket}">
</div>
<div class="form-control">
<label for="udpXrayNoiseDelayMin">🕞 Noise Delay</label>
<div class="min-max">
<input type="number" id="udpXrayNoiseDelayMin" name="udpXrayNoiseDelayMin"
value="${udpXrayNoiseDelayMin}" min="1" required>
<span> - </span>
<input type="number" id="udpXrayNoiseDelayMax" name="udpXrayNoiseDelayMax"
value="${udpXrayNoiseDelayMax}" min="1" required>
</div>
</div>
<h3>MAHSANG - NIKANG - HIDDIFY 🔧</h3>
<div class="form-control">
<label for="hiddifyNoiseMode">😵‍💫 Hiddify Mode</label>
<input type="text" id="hiddifyNoiseMode" name="hiddifyNoiseMode"
Expand Down Expand Up @@ -801,6 +831,15 @@ export async function renderHomePage (proxySettings, isPassSet) {
<th>Application</th>
<th>Subscription</th>
</tr>
<tr>
<td>
${supportedApps(['v2rayNG', 'v2rayN'])}
</td>
<td>
${subQR('warpsub', 'xray-pro', `${atob('QlBC')}-Warp-Pro`, 'Warp Pro Subscription')}
${subURL('warpsub', 'xray-pro', `${atob('QlBC')}-Warp-Pro`)}
</td>
</tr>
<tr>
<td>
${supportedApps(['NikaNG', 'MahsaNG', 'v2rayN-PRO'])}
Expand Down Expand Up @@ -1180,6 +1219,10 @@ export async function renderHomePage (proxySettings, isPassSet) {
const customCdnSni = document.getElementById('customCdnSni').value;
const isCustomCdn = customCdnAddrs.length || customCdnHost !== '' || customCdnSni !== '';
const warpEndpoints = document.getElementById('warpEndpoints').value?.replaceAll(' ', '').split(',');
const xrayNoiseMode = document.getElementById('udpXrayNoiseMode').value;
const xrayNoisePacket = document.getElementById('udpXrayNoisePacket').value;
const xrayNoiseDelayMin = getValue('udpXrayNoiseDelayMin');
const xrayNoiseDelayMax = getValue('udpXrayNoiseDelayMax');
const noiseCountMin = getValue('noiseCountMin');
const noiseCountMax = getValue('noiseCountMax');
const noiseSizeMin = getValue('noiseSizeMin');
Expand Down Expand Up @@ -1209,6 +1252,7 @@ export async function renderHomePage (proxySettings, isPassSet) {
configForm.querySelectorAll('input[type="checkbox"]').forEach(checkbox => {
!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 invalidIPs = [...cleanIPs, ...proxyIPs, ...customCdnAddrs, ...customBypassRules, ...customBlockRules, customCdnHost, customCdnSni]?.filter(value => {
if (value) {
Expand Down Expand Up @@ -1253,6 +1297,32 @@ export async function renderHomePage (proxySettings, isPassSet) {
alert('⛔ All "Custom" fields should be filled or deleted together! 🫤');
return false;
}
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;
}
try {
document.body.style.cursor = 'wait';
Expand Down

0 comments on commit 3e5b791

Please sign in to comment.