Files
3x-ui/frontend/src/test/__snapshots__/inbound-form-blocks.test.tsx.snap
T
Rouzbeh† fea3c94b11 feat(xhttp): support sessionID* rename + sessionIDTable/Length (xray v26.6.22) (#5506)
* feat(xhttp): support sessionID* rename + sessionIDTable/Length (xray v26.6.22)

xray-core v26.6.22 (PR #6258) renamed the XHTTP session config keys
sessionPlacement/sessionKey to sessionIDPlacement/sessionIDKey (no fallback
kept in core) and added sessionIDTable (predefined charset name or literal
ASCII) and sessionIDLength (range, e.g. 16-32, lower bound > 0).

Panel changes:
- Schema (xhttp.ts): rename the two keys, add sessionIDTable/sessionIDLength,
  and a z.preprocess that lifts legacy keys off stored configs so an upgraded
  panel never silently drops a saved session setting.
- Wire normalize + share-link build/parse: rename keys, emit the two new
  fields, and accept legacy sessionPlacement/sessionKey from old share links.
- Inbound + outbound XHTTP forms: rename field paths, add a sessionIDTable
  autocomplete (9 predefined tables + free ASCII) and a sessionIDLength range
  input shown only when a table is set, with light client validation (ASCII
  table, length min > 0; xray enforces the room-size minimum server-side).
- Subscription (service.go) and Clash (clash_service.go) builders: emit the
  renamed + new keys, with a legacy fallback for not-yet-resaved inbounds.
- Locales: add sessionIDTable/sessionIDLength labels + hints in all 13 files.

Two sibling v26.6.22 XHTTP commits need no panel change and are covered by the
core bump alone: #6332 (XHTTP/3 closes QUIC/UDP) and #6320 (udpHop honors the
existing dialerProxy).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(xhttp): add Session ID Table to inbound form-blocks snapshot

The new sessionIDTable input renders by default in the inbound XHTTP form, so
its label joins the field-structure snapshot. sessionIDLength stays conditional
(only shown when a table is set), so it does not appear here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(xhttp): migrate legacy session keys in the running xray config

The Zod preprocess plus the subscription/Clash fallbacks only covered the
panel UI and share-link output. The config handed to the running xray-core
process is built from the raw stored streamSettings in GetXrayConfig, which
did not rewrite the renamed XHTTP session keys — so a pre-upgrade inbound (or
template outbound) stored with a non-default sessionPlacement was emitted
unchanged and dropped by xray-core v26.6.22, until the admin re-saved it.

Lift sessionPlacement/sessionKey onto sessionIDPlacement/sessionIDKey at
config-generation time, in the existing inbound stream-rewrite block (next to
the tls/reality/externalProxy handling) and across template outbounds. The
lift is idempotent and leaves unchanged configs byte-identical so the
hot-reload diff never sees a spurious change.

Also tighten validateSessionIDLength to reject an inverted range (e.g. 32-16)
in addition to the existing lower-bound > 0 check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(xray): avoid summed-capacity allocation in mergeSubscriptionOutbounds

CodeQL go/allocation-size-overflow flagged the pre-sized make() whose
capacity was a sum of three slice lengths. Grow the slice via append on
a nil slice instead; same result, no overflow-prone capacity expression.
2026-06-23 17:38:16 +02:00

127 lines
2.2 KiB
Plaintext

// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`inbound security forms > RealityForm field structure is stable 1`] = `
[
"Show",
"Xver",
"uTLS",
"Target",
"SNI",
"Max Time Diff (ms)",
"Min Client Ver",
"Max Client Ver",
"Short IDs",
"SpiderX",
"Public Key",
"Private Key",
"mldsa65 Seed",
"mldsa65 Verify",
"Master Key Log",
]
`;
exports[`inbound security forms > TlsForm field structure is stable 1`] = `
[
"SNI",
"Cipher Suites",
"Min/Max Version",
"uTLS",
"ALPN",
"Curve Preferences",
"Reject Unknown SNI",
"Disable System Root",
"Session Resumption",
"Digital Certificate",
"Master Key Log",
"ECH Sockopt",
"ECH key",
"ECH config",
"Pinned Peer Cert SHA-256",
"Verify Peer Cert By Name",
]
`;
exports[`inbound transport forms > GrpcForm field structure is stable 1`] = `
[
"Service Name",
"Authority",
"Multi Mode",
]
`;
exports[`inbound transport forms > HttpUpgradeForm field structure is stable 1`] = `
[
"Proxy Protocol",
"Host",
"Path",
"Headers",
]
`;
exports[`inbound transport forms > KcpForm field structure is stable 1`] = `
[
"MTU",
"TTI (ms)",
"Uplink (MB/s)",
"Downlink (MB/s)",
"CWND Multiplier",
"Max Sending Window",
]
`;
exports[`inbound transport forms > RawForm field structure is stable 1`] = `
[
"Proxy Protocol",
"HTTP Obfuscation",
]
`;
exports[`inbound transport forms > SockoptForm field structure is stable (server-side fields only) 1`] = `
[
"Sockopt",
"Real client IP",
"Route Mark",
"TCP Keep Alive Interval",
"TCP Keep Alive Idle",
"TCP Max Seg",
"TCP User Timeout",
"TCP Window Clamp",
"Proxy Protocol",
"TCP Fast Open",
"Penetrate",
"V6 Only",
"TCP Congestion",
"TProxy",
"Trusted X-Forwarded-For",
"Custom sockopt",
]
`;
exports[`inbound transport forms > WsForm field structure is stable 1`] = `
[
"Proxy Protocol",
"Host",
"Path",
"Heartbeat Period",
"Headers",
]
`;
exports[`inbound transport forms > XhttpForm field structure is stable 1`] = `
[
"Host",
"Path",
"Mode",
"Server Max Header Bytes",
"Padding Bytes",
"Headers",
"Uplink HTTP Method",
"Padding Obfs Mode",
"Session Placement",
"Session ID Table",
"Sequence Placement",
"No SSE Header",
"XMUX",
]
`;