mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-17 15:47:14 +00:00
fix(panel): probe UDP outbounds and hide the block outbound from the mtproto egress picker (#6525)
* fix(panel): match the probe and egress readers to what the core loads Two readers left over from the case-sensitivity sweep still disagreed with the core, both raised reviewing #6523. isUdpOutbound compared the protocol id and the transport name exactly. The core lowercases both before it resolves them (infra/conf/loader.go:46 for the id, TransportProtocol.Build at infra/conf/transport_internet.go:16-17 for the name), so an outbound spelled "WireGuard" or a stream named "KCP" still built a UDP handler but was probed with a dial-only TCP request, and Test All Outbounds reported a working outbound as down. The mtproto egress picker asked for outbound tags without excludeBlackhole, so the block outbound stayed selectable there. Choosing it looks like a working selection and discards that inbound's Telegram traffic. * fix(panel): recognise the mkcp transport alias and pin the picker's field id Review findings on #6525. TransportProtocol.Build resolves both "kcp" and "mkcp" to the same mKCP transport, so comparing the transport name against "kcp" alone left a template spelling "network": "mkcp" in the TCP lane and reported a working outbound as down — the same trigger this PR already fixed for the "KCP" capitalisation. The egress picker now carries an explicit id, the way the inbound form's protocol select does, so the test addresses that field rather than the first searchable select on the page and reuses the shared dropdown helper instead of duplicating it.
This commit is contained in:
@@ -26,20 +26,24 @@ function normalizeOutboundTestUrl(url: string) {
|
||||
return url || DEFAULT_TEST_URL;
|
||||
}
|
||||
|
||||
// The core lowercases a protocol id and a transport name before resolving
|
||||
// either, so "WireGuard"/"KCP" still build a UDP handler a TCP dial misreports.
|
||||
export function isUdpOutbound(outbound: unknown): boolean {
|
||||
const o = outbound as
|
||||
| { protocol?: string; streamSettings?: { network?: string } }
|
||||
| { protocol?: unknown; streamSettings?: { network?: unknown } }
|
||||
| null
|
||||
| undefined;
|
||||
const p = o?.protocol;
|
||||
const n = o?.streamSettings?.network;
|
||||
const rawNetwork = o?.streamSettings?.network;
|
||||
const network = typeof rawNetwork === 'string' ? rawNetwork.toLowerCase() : '';
|
||||
return (
|
||||
p === 'wireguard' ||
|
||||
p === 'hysteria' ||
|
||||
p === 'amneziawg' ||
|
||||
n === 'hysteria' ||
|
||||
n === 'kcp' ||
|
||||
n === 'quic'
|
||||
isOutboundProtocol(o, 'wireguard') ||
|
||||
isOutboundProtocol(o, 'hysteria') ||
|
||||
isOutboundProtocol(o, 'amneziawg') ||
|
||||
network === 'hysteria' ||
|
||||
network === 'kcp' ||
|
||||
// The core resolves "kcp" and "mkcp" to the same mKCP transport.
|
||||
network === 'mkcp' ||
|
||||
network === 'quic'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user