3x-ui/internal/web/service
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
..
email fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
integration refactor(frontend): move form-item hints from extra to tooltip 2026-06-17 17:24:16 +02:00
outbound fix(outbounds): test subscriptions in Test All, skip direct/dns 2026-06-13 11:48:02 +02:00
panel refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
tgbot feat(backup): prefer browser request host for backup filename 2026-06-23 01:13:09 +02:00
api_scale_postgres_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
backup_filename_test.go feat(backup): name DB backup files after the server address 2026-06-22 21:55:58 +02:00
bulk_clients_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
bulk_traffic_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_apply_field_test.go fix(client): apply per-field client edits to every inbound of the email (#5039) 2026-06-12 01:22:15 +02:00
client_bulk.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
client_crud.go fix(client): clear group when removed in the single-client editor 2026-06-17 15:55:56 +02:00
client_email_validation_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_external_link.go feat(sub): per-client external links and remote subscriptions 2026-06-14 20:57:14 +02:00
client_flow_isolation_test.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
client_group_node_sync_test.go fix(client): clear group when removed in the single-client editor 2026-06-17 15:55:56 +02:00
client_groups.go feat(groups): show upload/download breakdown in group traffic 2026-06-12 15:30:41 +02:00
client_inbound_apply.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
client_link.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_locks.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_lookup.go feat(node-sync): push global client usage to nodes for display and local enforcement 2026-06-11 15:14:08 +02:00
client_paging.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_portable.go feat(clients): orphan cleanup + export/import via CodeMirror modals 2026-06-21 23:06:10 +02:00
client_sync_multiprotocol_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_traffic.go fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) 2026-06-22 00:22:28 +02:00
config.json feat: apply inbound/outbound/routing changes live via Xray gRPC API 2026-06-10 23:01:33 +02:00
fallback.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
global_traffic_test.go fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) 2026-06-22 00:22:28 +02:00
host.go feat(hosts): managed Hosts for per-host subscription link overrides (#5409) 2026-06-17 12:06:55 +02:00
host_test.go feat(hosts): managed Hosts for per-host subscription link overrides (#5409) 2026-06-17 12:06:55 +02:00
inbound.go fix(inbound): persist streamSettings for tunnel so sockopt saves 2026-06-21 02:34:57 +02:00
inbound_autorenew_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
inbound_client_ips.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
inbound_client_ips_merge_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
inbound_client_traffic_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
inbound_clients.go fix(ui): classify ended clients as depleted, not disabled, on inbounds page 2026-06-11 14:05:02 +02:00
inbound_disable.go fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) 2026-06-22 00:22:28 +02:00
inbound_import_shared_clients_test.go fix(inbound): avoid UNIQUE email constraint when importing inbounds that share clients 2026-06-12 13:00:04 +02:00
inbound_migration.go Test-quality audit: fix 2 prod bugs, strengthen weak tests, add mutation/fuzz/CI tooling (#5345) 2026-06-15 15:17:03 +02:00
inbound_migration_test.go Test-quality audit: fix 2 prod bugs, strengthen weak tests, add mutation/fuzz/CI tooling (#5345) 2026-06-15 15:17:03 +02:00
inbound_mtproto_test.go feat(mtproto): route Telegram egress through Xray routing rules 2026-06-12 17:58:45 +02:00
inbound_node.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
inbound_node_ips.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
inbound_node_ips_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
inbound_node_reconcile_test.go feat(node): per node outbound routing (#5275) 2026-06-14 23:10:52 +02:00
inbound_protocol.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
inbound_protocol_test.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
inbound_sub_sort_test.go feat(sub): per-inbound sort order for subscription links 2026-06-12 12:03:22 +02:00
inbound_sublink.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
inbound_traffic.go fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) 2026-06-22 00:22:28 +02:00
inbound_traffic_global.go feat(node-sync): push global client usage to nodes for display and local enforcement 2026-06-11 15:14:08 +02:00
inbound_update_tag_test.go feat: add inbound share address strategy (#5162) 2026-06-11 20:24:15 +02:00
inbound_util.go feat(sub): per-inbound sort order for subscription links 2026-06-12 12:03:22 +02:00
metric_history.go feat(metrics): extend history bucket options to include 12h, 24h, and 48h intervals (#5467) 2026-06-21 17:29:22 +02:00
node.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_bulk_dispatch_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
node_client_breakdown_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_client_expiry_sync_test.go fix(nodes): sync "start after first connect" expiry so un-activated nodes do not reset it (#5319) 2026-06-15 15:46:19 +02:00
node_client_traffic_sum_test.go fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) 2026-06-22 00:22:28 +02:00
node_delete_orphan_test.go fix(nodes): block node delete while inbounds are still attached (#5394) 2026-06-20 01:09:53 +02:00
node_dirty_test.go fix(node): mark node dirty on Update so sync reconciles before snapshot sweep (#5469) 2026-06-21 17:27:53 +02:00
node_mtls.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
node_mtls_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
node_netmetrics_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
node_origin_guid_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_shared_guid_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_tag_sync_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
node_test.go feat: allow selecting inbounds synchronized from nodes (#5178) 2026-06-11 20:48:26 +02:00
node_tree.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_tree_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
outbound_subscription.go fix(subscription): bound outbound response body (#5493) 2026-06-23 10:48:01 +02:00
outbound_subscription_test.go fix(subscription): bound outbound response body (#5493) 2026-06-23 10:48:01 +02:00
port_conflict.go fix(inbounds): flag conflicts with the reserved Xray API port (#5304) 2026-06-15 17:21:06 +02:00
port_conflict_test.go fix(inbounds): flag conflicts with the reserved Xray API port (#5304) 2026-06-15 17:21:06 +02:00
scale_helpers_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
server.go Use efficient APIs and simplify loops 2026-06-23 14:12:28 +02:00
server_vlessenc_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
server_xray_checksum_test.go fix(xray): verify the release archive checksum before installing (#5396) 2026-06-20 00:37:35 +02:00
setting.go perf(settings): save all settings in one transaction 2026-06-22 22:01:22 +02:00
setting_mtls.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
setting_mtls_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
setting_security_test.go feat(notifications): event bus architecture with Telegram and SMTP subscribers (#5326) 2026-06-15 21:03:41 +02:00
shadowsocks_client_key_test.go fix(inbound): regenerate SS-2022 client PSKs on method key-size change 2026-06-17 14:11:35 +02:00
sub_uri_base_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
sync_scale_postgres_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
traffic_writer.go fix(service): serialize client/inbound writes to prevent Postgres deadlock 2026-06-17 15:55:47 +02:00
traffic_writer_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
url_safety.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
xray.go feat(xhttp): support sessionID* rename + sessionIDTable/Length (xray v26.6.22) (#5506) 2026-06-23 17:38:16 +02:00
xray_config_inject_test.go feat(mtproto): route Telegram egress through Xray routing rules 2026-06-12 17:58:45 +02:00
xray_metrics.go feat(notifications): event bus architecture with Telegram and SMTP subscribers (#5326) 2026-06-15 21:03:41 +02:00
xray_setting.go refactor(frontend): move form-item hints from extra to tooltip 2026-06-17 17:24:16 +02:00
xray_setting_routing_sync.go fix(routing): sync xray rules when panel inbound tags change or are deleted (#5367) 2026-06-20 01:18:31 +02:00
xray_setting_routing_sync_test.go fix(routing): sync xray rules when panel inbound tags change or are deleted (#5367) 2026-06-20 01:18:31 +02:00
xray_setting_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
xray_strip_rules_test.go Add Enable/Disable Toggle for Xray Routing Rules (#5296) 2026-06-15 00:43:49 +02:00
xray_xhttp_session_test.go feat(xhttp): support sessionID* rename + sessionIDTable/Length (xray v26.6.22) (#5506) 2026-06-23 17:38:16 +02:00