txlyre

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • b07fad0e69 refactor(wireguard): drop removed workers field (xray v26.6.22) (#5509) * v3.4.0 * refactor(wireguard): drop removed `workers` field (xray v26.6.22) xray-core v26.6.22 (PR #6287) removed the WireGuard `workers` (num_workers) config field; the engine now relies on wireguard-go's internal worker fallback and no longer reads it. Remove it from the panel so it stops emitting a key xray ignores. Removed from the inbound/outbound/outbound-form WireGuard schemas, both WireGuard forms, the outbound form adapter (both directions) and defaults, the two affected tests, and the `workers` label in all 13 locales. Existing configs that still carry workers are simply dropped on parse — no migration needed since the field had no runtime effect. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> * Update version --------- Co-authored-by: MHSanaei <[email protected]> Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
  • fd092444a8 Bump frontend package & deps to new patch versions Update frontend package version from 0.3.1 to 0.4.0 and upgrade multiple dependencies. Notable bumps include @tanstack/react-query (+devtools) to 5.101.1, antd to 6.4.5, axios to 1.18.1, recharts to 3.9.0, swagger-ui-react to 5.32.8, vite/@vitejs/plugin-react to 8.1.0/6.0.3, the @typescript-eslint suite to 8.62.0, globals to 17.7.0, rolldown/related bindings to 1.1.2, and various wasm/wasm-runtime packages. package-lock.json was updated to reflect the resolved versions and integrity hashes for these dependency changes.
  • a0f4c13dc5 fix(sockopt): honor trustedXForwardedFor on gRPC inbounds (xray v26.6.22) (#5503) * fix(sockopt): honor trustedXForwardedFor on gRPC inbounds xray-core v26.6.22 (commit 711aea4) switched the gRPC server from reading the x-real-ip gRPC metadata to resolving the client IP from X-Forwarded-For via sockopt.trustedXForwardedFor, matching ws/httpupgrade/xhttp. The panel already exposed the trustedXForwardedFor field and wire output, but the per-transport gate (TRUSTED_HEADER_NETWORKS) still omitted grpc. On a gRPC inbound this raised a false "transport does not honor this header" warning and mis-flagged the Cloudflare real-client-IP preset. Add grpc to the gate. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> * docs(i18n): note gRPC in trustedXForwardedFor hint (all locales) Follow-up to the gRPC gate fix: the trustedXForwardedForHint tooltip across all 13 locales said the header is honored "only on WebSocket, HTTPUpgrade and XHTTP". xray-core v26.6.22 added gRPC, so list it too. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
  • 1c0b76c27a Use efficient APIs and simplify loops Minor refactors across the codebase to improve readability and use more efficient APIs: replace fmt.Sprintf+base64 encoding with fmt.Appendf when building Shadowsocks userInfo; compute elapsed using max(now-prev.at, window) to simplify logic; use strings.SplitSeq for splitting in two places; simplify test and goroutine loops to range-based iterations and use errgroup's Go helper; and align/clean up struct field formatting and test map literals. Mostly stylistic/efficiency changes with no intended behavior changes.
  • 852b53db79 feat(xray): add loopback sniffing and per-segment fragment masks - Loopback outbound: add sniffing support (xray-core #6320) - FinalMask fragment: support per-segment lengths/delays arrays with legacy length/delay migration (xray-core #6334) - Consolidate sniffing into a shared SniffingFields component and the canonical SniffingSchema across inbound, VLESS reverse, and loopback
  • Bu 10 işlemeler için karşılaştırmaları görüntüle »

7 saat önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • dabd3f5d2b feat(backup): prefer browser request host for backup filename Name downloaded DB backups after the host shown in the panel title (c.Request.Host) when available, falling back to the configured web domain and then the public IP. Telegram-sent backups have no request context and keep the domain/IP behavior.

15 saat önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • b11c51e736 ci(claude-bot): tune models, Copilot-style PR review, issue research mode - handle-issue: use Sonnet 4.6 and raise max-turns 150 to 250 - handle-pr: use Opus 4.8; rewrite review as inline comments stating the problem plus a suggestion block, posted as one COMMENT review - mention: use Opus 4.8; on issues do research only (never commit) with full comment/history context and feature-request feasibility analysis; PR commit-on-request behavior unchanged - reformat the mention append-system-prompt into a readable multi-line block (verified it still parses as a single CLI argument)
  • 0d764f1bb5 feat(iplimit): auto-install fail2ban on install and update IP limit enforcement is gated on fail2ban being present (ce8b1bed), but the bare-metal install.sh/update.sh never installed it, so the feature stayed disabled until the user ran the IP Limit menu by hand. Docker already auto-configures it; bare-metal hosts did not. Extract the fail2ban install + jail setup out of install_iplimit into a non-interactive setup_fail2ban_iplimit() (no exit/before_show_menu, returns a status) exposed via 'x-ui setup-fail2ban', and call it from install.sh and update.sh after the panel is up. update.sh is the primary update path (x-ui update and the panel self-updater both run it). Honors XUI_ENABLE_FAIL2BAN (proceed only when unset or true, matching the Go gate) and is non-fatal so a fail2ban failure never aborts the install/update.
  • 683653674c fix(api-docs): exclude /panel/outbound and /panel/routing from route guard 718b7e16 added these top-level SPA page routes in spa.go but didn't add them to the TestAPIRoutesDocumented skip-list, so the guard flagged them as undocumented and failed CI on main. Like the other /panel/* page routes they serve the SPA, not a JSON API, so they belong in the skip-list rather than endpoints.ts.
  • ce8b1bed77 feat(iplimit): gate IP limit on fail2ban and reset stale limits Per-client IP limit only enforces where fail2ban is installed, so the panel now reports enforceability and disables the field otherwise: - Add GET /panel/api/server/fail2banStatus (enabled/installed/usable/windows), cached 30s. - ClientFormModal and ClientBulkAddModal disable the IP Limit input when not usable and show a hover tooltip; Windows gets a platform-specific message instead of the bash-menu hint. - One-time migration ResetIpLimitNoFail2ban zeroes existing client limitIp (inbound settings JSON + clients table) on hosts without fail2ban, where the limit never applied. - Drop the recurring '[LimitIP] Fail2Ban is not installed' warning. - Add limitIpFail2banMissing/limitIpFail2banWindows/limitIpDisabled across all 13 locales.
  • 718b7e16e1 feat(sidebar): move Routing/Outbounds to top-level items with clean URLs - Move Routing out of the Xray Configs submenu; add Routing and Outbounds as top-level sidebar items below Hosts - Give them their own clean routes (/routing, /outbound) instead of /xray#routing and /xray#outbound, registered in the React router and the Go SPA shell so direct links and refresh work - XrayPage derives the active section from the pathname for those routes - Add menu.routing and menu.outbounds translation keys across all locales
  • Bu 9 işlemeler için karşılaştırmaları görüntüle »

1 gün önce

txlyre yansıdan txlyre/3x-ui konumundaki fix/cloned-node-duplicate-guid referansı eşitlendi ve silindi

1 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • f07d092af0 Replace '<3' with '❤️' in translations Replace ASCII heart "<3" with Unicode heart emoji "❤️" in logout strings across translation files to improve visual consistency and rendering. Updated files in internal/web/translation for: ar-EG, en-US, es-ES, fa-IR, id-ID, ja-JP, pt-BR, ru-RU, tr-TR, uk-UA, vi-VN, zh-CN, and zh-TW.
  • 2392f04e02 fix(cli): apply -webCert/-webCertKey on the setting subcommand (#5482) The setting subcommand registers the -webCert and -webCertKey flags but the "setting" case only calls updateSetting(), which ignores cert paths. The flags were silently accepted and discarded, so a fresh panel stayed HTTP-only (no webCertFile/webKeyFile written, "Panel is not secure with SSL", browser ERR_SSL_PROTOCOL_ERROR). updateCert() was reachable only through the separate "cert" case. Call updateCert(webCertFile, webKeyFile) inside the "setting" case when either flag is set, mirroring the "cert" subcommand. saveSetting() already upserts, so this works on a fresh DB. Co-authored-by: taov.rustam <[email protected]> Co-authored-by: Claude Opus 4.8 <[email protected]>
  • Bu 2 işlemeler için karşılaştırmaları görüntüle »

1 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • e0ac65a05f fix(node-sync): don't delete a node's central inbounds when its snapshot is empty The central-inbound sweep deletes any central inbound whose tag is absent from the node's snapshot, with no guard for an empty snapshot. A node mid-restart or with a transient DB error (e.g. Postgres 57P01) can return an empty inbound list with success=true, which wiped all of that node's central inbounds and their clients (and reset traffic history on re-create) — observed on the Germany node: 0 clients but still 44 online (online survives because it comes from the snapshot's online tree, not the central inbound). Skip the sweep entirely when the snapshot reports zero inbounds; a real per-inbound deletion still sweeps via a non-empty snapshot that omits one tag.
  • 7458ed4064 fix(nodes): remap a cloned node's own-panelGuid origin so the inbound page shows online These nodes report their OWN inbounds with their own panelGuid as OriginNodeGuid, so originGuidFor returned the shared GUID verbatim and never remapped it. origin_node_guid stayed the shared GUID while online was keyed under the node-unique key, so the inbound page (which reads the stored origin_node_guid) looked up an empty bucket and showed everyone offline — even though the Nodes page (which derives the key live) was correct. Treat an origin equal to the node's own panelGuid as the node's own inbound and resolve it through selfKey; keep only a genuinely different (descendant) origin across hops.
  • 846b8b338e fix(node-sync): log the client-IP-attribution 404 once per node, not every cycle Old-build nodes lack panel/api/clients/clientIpsByGuid and answer 404 on every IP-sync cycle (~10s), which floods the debug log now that the IP phase actually runs. Note the missing endpoint once per node (re-armed if the node later recovers or is upgraded) and keep logging genuine fetch errors.
  • 98c9ba1f91 fix(nodes): extend duplicate-GUID hardening to master collisions, IP attribution, and a heartbeat warning Builds on the node-vs-node fix: a node's GUID is now also treated as ambiguous when it equals the master's own panelGuid (a node cloned from the master), so the master's local clients and that node can't merge. Centralized as ambiguousNodeGuids(nodes, selfGuid) + effectiveNodeKey(node). Applied the same node-unique fallback to the GUID-keyed IP attribution that #4983 added but the prior commit left collapsing: MergeClientIpsByGuid remaps a cloned node's own subtree to its node-unique key, nodeGuidNameMap resolves names by that key, and node deletion purges both keys. Added a throttled heartbeat warning so the operator is told to regenerate a duplicate panelGuid. Tests cover master-collision, effectiveNodeKey, and the IP remap.
  • af941798c6 fix(nodes): keep cloned nodes (shared panelGuid) in separate attribution buckets #4983 keys online/inbound attribution by panelGuid, assuming it is globally unique. Cloned node servers ship an identical panelGuid in their copied settings, so the master collapsed several physical nodes into one bucket: GetMergedNodeTrees merged their online sets under one key and every inbound on those nodes (same origin_node_guid) read that merged set, so the inbound page showed online cross-attributed and counts inflated. Fall back to the node-unique synthNodeGuid(node.Id) whenever a node's panelGuid is shared by another of the master's direct nodes. Applied consistently at originGuidFor (origin_node_guid write), the online-tree key plus a self-key remap for nodes that report a GUID-keyed tree, effectiveNodeGuid, and recountByGuid's inbound bucketing. sharedNodeGuids computes the collision set. Online now works without node changes; making panelGuids unique restores real-GUID identity and also fixes GUID-keyed IP attribution.
  • Bu 10 işlemeler için karşılaştırmaları görüntüle »

1 gün önce

txlyre yansıdan yeni fix/cloned-node-duplicate-guid referansı txlyre/3x-ui konumuna eşitlendi

1 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 4854f9c1b8 fix(node-sync): give client-IP sync its own deadline; fix log spacing The IP-sync phase shared a single 4s context with the traffic-snapshot fetch that runs before it. On high-latency nodes the snapshot's round-trips drained that budget, so FetchAllClientIps/PushAllClientIps/FetchClientIpsByGuid failed with 'context deadline exceeded' every cycle, silently breaking cross-node client-IP sync. Give the phase its own fresh context (nodeClientIpSyncTimeout=6s), mirroring maybePushGlobals. Also convert node-name log lines to Warningf/Debugf: fmt.Sprint inserts no space between adjacent string args, so messages rendered as 'push client ips toUS1failed:'.
  • 7d23a2c15b perf: prevent cron job overlap, auto-set GOMEMLIMIT, fix tgbot userStates race cron: SkipIfStillRunning stops a slow 5s/10s job from overlapping itself and racing the shared xrayAPI (grpc conn leak) and the StatsLastValues map (fatal concurrent map write). memlimit: auto-detect a Go soft memory limit from XUI_MEMORY_LIMIT, the cgroup limit, or system RAM (about 90 percent); opt-in pprof via XUI_PPROF. tgbot: userStates now goes through a mutex-guarded store with TTL pruning (was raced by worker-pool and delayed-delete goroutines). check_client_ip: prefilter inbounds by settings LIKE limitIp instead of loading and JSON-parsing all of them every scan. minor: prune StatsLastValues, RateLimiter.lastSent, reportedRemoteTagConflict. docker-compose: document the memory knobs.
  • 679d2e1cca fix: resolve a batch of open bug-tagged issues (traffic accounting, share strategy, sub address, CPU) (#5477) * fix(node): never re-add a node's full counter on reset/restart (#5456, #5476, #5390) When a node's per-client counter dips below the master's stored baseline (node reboot, xray restart, or a reset propagated to the node), the delta accounting clamped delta to the node's whole current counter and re-added it to the master total — double-counting a client's lifetime usage in a single sync and often pushing them over quota. Treat a backward-moving counter as a reset: add 0 and rebaseline to the reported value, so only genuine post-reset usage accrues. Resets also now clear the per-node NodeClientTraffic baseline (ResetClient TrafficByEmail, resetClientTrafficLocked, BulkResetTraffic, resetAllClient TrafficsLocked), mirroring the delete paths. Without this the node's pre-reset cumulative — including traffic it had counted but not yet synced — leaks back onto the master after a reset, which is the 'reset reverts after a while' report. The next sync then takes the clean delta=0 + rebaseline path regardless of node state. Updates TestNodeCounterReset (was _Clamped, now _NoReAdd) to assert rebaseline instead of re-add, and adds TestCentralResetClearsNodeBaseline_NoLeak. * fix(inbound): keep persisted node share strategy on edit (#5375) Opening the edit modal silently reverted shareAddrStrategy from 'node' to 'listen'. The downgrade effect fires before the form settles: availableNodes is an empty placeholder until /nodes/list resolves, and Form.useWatch('protocol') is briefly empty on the first edit render — both transiently make the node option look unavailable, so the effect clobbered the saved value. Gate the downgrade on availableNodesFetched (threaded from useNodesQuery through InboundsPage) and on the protocol watch being settled, so a persisted strategy is only downgraded when the node option is genuinely unavailable. Adds a rerender-based regression test covering the nodes-loading race. * <3 * perf(traffic): skip cross-panel quota subquery when no globals exist (#5392, #5389) disableInvalidClients ran a correlated EXISTS against client_global_traffics on the full client_traffics table every 5s. On a panel no master pushes to, that table is empty so the subquery can never match — yet it forced a full scan that pegged Postgres at 100% CPU on large client counts. Probe the table first and drop the EXISTS branch when it's empty (the common case), and add an idx_client_global_email index so the subquery is an index lookup when globals are present. Cross-panel enforcement is unchanged (TestGlobalUsage_DisablesClient). This also relieves #5389 ('traffic writer queue full' / panel freeze): the heavy query runs inside the serialized traffic write, so a slow DB backs the shared writer queue up until request handlers block. * fix(sub): don't advertise a leaked client IP for local wildcard inbounds (#5425) For a local inbound with no node, no custom share address, and a wildcard/blank listen, resolveInboundAddress fell straight through to the subscriber's request host. Behind NAT/proxy/CDN that Host can be the requesting client's own IP, so the subscription wrote the client's address into the inbound instead of the server's — while the panel's own share link (which doesn't use the request host) stayed correct. Prefer the admin's configured public host (Sub/Web domain) over the raw request host for this last-resort fallback. With no configured host the request host still stands, so existing single-domain setups are unaffected.
  • Bu 3 işlemeler için karşılaştırmaları görüntüle »

1 gün önce

txlyre yansıdan txlyre/3x-ui konumundaki fix/open-bug-issues-sweep referansı eşitlendi ve silindi

1 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 0b0b6250d6 feat(clients): orphan cleanup + export/import via CodeMirror modals Add three client-management actions to the Clients page More menu: - Delete unattached clients: removes every client with no inbound attachment, cascading its traffic rows, IP log, and external links (POST /clients/delOrphans). - Export clients: shows the {client, inboundIds} list in a read-only CodeMirror viewer with copy/download (GET /clients/export returns the array in the standard envelope). - Import clients: pastes that JSON into an editable CodeMirror editor, mirroring Import an Inbound (POST /clients/import takes a { data } body). Attached clients go through the create-and-attach path; items with no inboundIds are restored as bare records; existing emails are never overwritten and are reported as skipped. Document the new endpoints in api-docs and translate the new strings into all supported languages.
  • 0483273839 fix(tls): pin remote cert via native uTLS handshake instead of xray subprocess GetRemoteCertHash shelled out to 'xray tls ping' and scraped its stdout, which swallowed the real failure (a refused dial surfaced only as 'no certificate hash found'). Replace it with a native uTLS Chrome handshake: dial/handshake errors now surface verbatim, host:port is honoured, and the leaf is taken from PeerCertificates[0] so IP-only self-signed certs (no DNS SANs) hash correctly. Mirrors alireza0/x-ui@1372ad0 without its nil-leaf panic.
  • 03e89683dd fix(tls): ping the inbound's own port for remote cert pinning The pin-from-remote button passed only the SNI to 'xray tls ping', which defaults to :443 — so it never reached a self-hosted inbound on another port and failed with a vague 'no certificate hash found'. Append the inbound's port when the SNI carries none, and surface the underlying ping failure (dial refused, timeout) in the error.
  • 39774a6a38 fix(tls): default OCSP stapling to off for new inbound certs Certs without an OCSP responder URL (e.g. Let's Encrypt, which dropped OCSP in 2025) made xray log 'ignoring invalid OCSP: no OCSP server specified in cert' on every refresh. Default the per-cert ocspStapling interval to 0 (disabled) so new inbounds stay quiet; the field is kept for certs that do support stapling.
  • 3aa76ea05b fix(deps): bump xray-core past finalmask UDP buffer fix (#5462)
  • Bu 13 işlemeler için karşılaştırmaları görüntüle »

2 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 837300b127 fix(sub): don't advertise a leaked client IP for local wildcard inbounds (#5425) For a local inbound with no node, no custom share address, and a wildcard/blank listen, resolveInboundAddress fell straight through to the subscriber's request host. Behind NAT/proxy/CDN that Host can be the requesting client's own IP, so the subscription wrote the client's address into the inbound instead of the server's — while the panel's own share link (which doesn't use the request host) stayed correct. Prefer the admin's configured public host (Sub/Web domain) over the raw request host for this last-resort fallback. With no configured host the request host still stands, so existing single-domain setups are unaffected.
  • 8b6ccebfb0 perf(traffic): skip cross-panel quota subquery when no globals exist (#5392, #5389) disableInvalidClients ran a correlated EXISTS against client_global_traffics on the full client_traffics table every 5s. On a panel no master pushes to, that table is empty so the subquery can never match — yet it forced a full scan that pegged Postgres at 100% CPU on large client counts. Probe the table first and drop the EXISTS branch when it's empty (the common case), and add an idx_client_global_email index so the subquery is an index lookup when globals are present. Cross-panel enforcement is unchanged (TestGlobalUsage_DisablesClient). This also relieves #5389 ('traffic writer queue full' / panel freeze): the heavy query runs inside the serialized traffic write, so a slow DB backs the shared writer queue up until request handlers block.
  • 6a7495ebea <3
  • a0ea9c9f45 fix(inbound): keep persisted node share strategy on edit (#5375) Opening the edit modal silently reverted shareAddrStrategy from 'node' to 'listen'. The downgrade effect fires before the form settles: availableNodes is an empty placeholder until /nodes/list resolves, and Form.useWatch('protocol') is briefly empty on the first edit render — both transiently make the node option look unavailable, so the effect clobbered the saved value. Gate the downgrade on availableNodesFetched (threaded from useNodesQuery through InboundsPage) and on the protocol watch being settled, so a persisted strategy is only downgraded when the node option is genuinely unavailable. Adds a rerender-based regression test covering the nodes-loading race.
  • e59788bac1 fix(node): never re-add a node's full counter on reset/restart (#5456, #5476, #5390) When a node's per-client counter dips below the master's stored baseline (node reboot, xray restart, or a reset propagated to the node), the delta accounting clamped delta to the node's whole current counter and re-added it to the master total — double-counting a client's lifetime usage in a single sync and often pushing them over quota. Treat a backward-moving counter as a reset: add 0 and rebaseline to the reported value, so only genuine post-reset usage accrues. Resets also now clear the per-node NodeClientTraffic baseline (ResetClient TrafficByEmail, resetClientTrafficLocked, BulkResetTraffic, resetAllClient TrafficsLocked), mirroring the delete paths. Without this the node's pre-reset cumulative — including traffic it had counted but not yet synced — leaks back onto the master after a reset, which is the 'reset reverts after a while' report. The next sync then takes the clean delta=0 + rebaseline path regardless of node state. Updates TestNodeCounterReset (was _Clamped, now _NoReAdd) to assert rebaseline instead of re-add, and adds TestCentralResetClearsNodeBaseline_NoLeak.
  • Bu 10 işlemeler için karşılaştırmaları görüntüle »

2 gün önce

txlyre yansıdan yeni fix/open-bug-issues-sweep referansı txlyre/3x-ui konumuna eşitlendi

2 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 7c8889466b feat(tls,reality): port xray TLS/REALITY fields, cert-hash helpers, fallback UX TLS: add verifyPeerCertByName (vcn) to inbound settings + emit in both share-link generators (frontend + Go sub) and outbound parser; the allowInsecure replacement xray removed after 2026-06-01. Add server-side curvePreferences, masterKeyLog, echSockopt (passthrough + form) at tlsSettings top-level so they survive the panel-only settings strip. REALITY: add limitFallbackUpload/Download (afterBytes/bytesPerSec/burstBytesPerSec) with per-field tooltips, plus masterKeyLog. Verified field names/semantics against pinned xray v1.260327.1 (bytesPerSec=0 disables). Hosts: fix verify_peer_cert_by_name column bool->string (xray expects comma-separated names) with an idempotent, history-gate-free migration (SQLite typeof blank; Postgres ALTER once); emit vcn for hosts/external proxies. Server: add getCertHash (local cert DER SHA-256) and getRemoteCertHash (xray tls ping) endpoints + api-docs; wire pinned-cert field buttons. Drop the meaningless random-hash button. Xray UI: metrics endpoint (listen/tag) config in Basics; import/export for routing rules and outbounds. Fallbacks card: compact empty state, header-aligned actions, responsive labeled grid rows. i18n: add all new keys to every locale; drop unused generateRandomPin.

2 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 315ecc2588 fix(inbound): persist streamSettings for tunnel so sockopt saves normalizeStreamSettings cleared StreamSettings for any protocol outside its whitelist, and tunnel was missing. The frontend sent sockopt correctly but the backend wiped it on every add/update. Tunnel relies on sockopt (notably sockopt.tproxy for TProxy/redirect mode), so add it to the whitelist.
  • 605e90dbf0 feat(sub): add dynamic remark variables with Jalali date, transport, and status tokens (#5430) * feat(sub): implement dynamic single-bracket remark variables with timezone-aware inline Jalali conversion * Update .gitignore * Update .gitignore * merge: bring in origin/main commits to resolve conflict base * fix(sub): address review issues in dynamic remark variables - Add TIME_LEFT to unlimitedDropTokens so segments containing only {TIME_LEFT} are dropped for unlimited clients (same as DAYS_LEFT) - Remove dead uiSingleBraceRe variable (translateUISingleBrackets uses a character scanner, not this regex) - Change expireDateLabel to use time.Local instead of UTC, consistent with jalaliExpireDateLabel Co-authored-by: Sanaei <[email protected]> * fix * fix --------- Co-authored-by: MHSanaei <[email protected]>
  • ce1d348ece feat(sub): add option to hide server settings in subscription (happ) (#5433) * feat(settings): add option to hide server settings in subscription * chore: regenerate codegen and add translations for subHideSettings - Update frontend/src/generated/{types,schemas,zod,examples}.ts to include subHideSettings (bool) in AllSetting and AllSettingView - Add subHideSettings / subHideSettingsDesc translation keys to all 11 remaining locales: ar-EG, fa-IR, es-ES, id-ID, ja-JP, pt-BR, uk-UA, tr-TR, zh-TW, zh-CN, vi-VN Co-authored-by: IgorKha <[email protected]> Co-authored-by: Sanaei <[email protected]> * fix(sub): add subHideSettings default to settings map Every other sub* setting has an entry in defaultValueMap; subHideSettings was missing, so GetSubHideSettings hit the 'key not in defaultValueMap' error path on a fresh install (only masked by the false fallback in sub.go). Add the default for consistency.
  • 1a4aef3353 feat(sub): full XHTTP field mapping for Clash/Mihomo subscriptions (#5417) * feat(sub): add full XHTTP field mapping for Clash subscriptions The Clash subscription generator only emitted path, host, mode in xhttp-opts. Mihomo supports all XHTTP parameters including padding, xmux (reuse-settings), session/seq placement, and more. Add buildXhttpClashOpts() that maps all client-relevant XHTTP fields from 3x-ui's camelCase JSON storage to Mihomo's kebab-case YAML format using an explicit allowlist approach. Field mapping (source-verified against Mihomo adapter/outbound/vless.go): - String fields: xPaddingBytes→x-padding-bytes, sessionPlacement→ session-placement, etc. (10 fields with DPI default filtering) - Bool fields: noGRPCHeader→no-grpc-header, xPaddingObfsMode→ x-padding-obfs-mode (with gated sub-fields) - Nested: xmux→reuse-settings (6 sub-fields with kebab-case) - Headers: pass through with Host key dropped - Server-only fields automatically excluded (not in allowlist) DPI defaults filtered: scMaxEachPostBytes="1000000", scMinPostsIntervalMs="30" (known DPI fingerprint) * test(sub): add comprehensive tests for buildXhttpClashOpts 9 test functions covering all field mapping categories: - FullFieldMapping: every kebab-case key verified - DPIDefaultsFiltered: scMaxEachPostBytes=1000000 and scMinPostsIntervalMs=30 - PaddingObfsGate: false/absent/true-with-no-gated-fields - XmuxMapsToReuseSettings: full mapping, empty, int/float64/zero hKeepAlivePeriod - ServerOnlyFieldsExcluded: noSSEHeader, scMaxBufferedPosts, etc. - NilInput and EmptyInput: return nil - HostFallbackFromHeaders: headers.Host, only-Host, case-insensitive drop - NoGRPCHeaderFalsey: false and absent both produce no key * fix(sub): clean up redundant skipValue check and add missing xhttp no-settings test - In buildXhttpClashOpts, change string-field loop condition so that skipValue == "" means "no filter" rather than redundantly comparing v against "" twice (xPaddingBytes was the affected entry) - Add TestApplyTransport_XHTTP_NoSettings to pin the behaviour when xhttpSettings is absent: applyTransport returns true, network is set to "xhttp", and xhttp-opts is not emitted
  • Bu 4 işlemeler için karşılaştırmaları görüntüle »

2 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 29b14dac59 feat(ci): let mention bot push commits to fork PR branches claude-code-action checks out the PR head branch and pushes Claude's commits with `git push origin ...`. For PRs opened from a fork the head branch lives on the contributor's repo, and the workflow GITHUB_TOKEN cannot push there, so commits ended up as a stray branch on this repo and never landed on the PR. Redirect origin's push URL to the PR head repository (the fork for fork PRs, this repo otherwise) using a PAT secret (CLAUDE_BOT_PAT) that has push access; fetches still come from origin. persist-credentials is disabled so the PAT in the push URL is used instead of the GITHUB_TOKEN auth header. Requires the fork PR to have "Allow edits by maintainers" enabled.
  • 4ab2dffa61 fix(ci): check out PR branch for mention bot so commits land on the PR
  • caf80009c8 feat(ci): add PR review job and commit-capable mention bot Rename claude-issue-bot.yml to claude-bot.yml and broaden it beyond issues: - handle-pr: review pull requests on open (read diff, label, post one grounded review comment); review-only, no code changes. - mention: allow committing. Add Edit/Write and git tools, contents: write, and instruct it to make the smallest correct change and commit to the current branch only on an explicit code-change request. Kept default user gating (no allowed_non_write_users) so only write-access users can trigger commits. - Refresh the repository map (add internal/eventbus and the service/email subpackage) across all three prompts. - Raise max-turns. @
  • 0537cbfb10 chore: bump dompurify to 3.4.11 and expand VS Code tasks - override dompurify to ^3.4.11 (fixes setConfig hook-pollution XSS advisory in the transitive swagger-ui-react dep) - add frontend tasks (build, dev, gen, lint, test, typecheck, install, ncu) and go tasks (fmt, modernize, modernize -fix) - add compound tasks: build:full (frontend + go) and check:all
  • 1eaa73e7c6 chore(deps): bump actions/checkout from 6 to 7 (#5454) Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • Bu 8 işlemeler için karşılaştırmaları görüntüle »

3 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 3cf3fddf12 perf(db): add an index on settings.key (#5359) getSetting (WHERE key=?) runs on nearly every subscription request and job tick and had no index, so each lookup full-scans the settings table past the large xrayTemplateConfig blob. Add an index on settings.key; AutoMigrate creates it on existing DBs too. Includes a HasIndex test.
  • 26cc4838ed perf(xray): compile log/traffic regexps once at package scope (#5362) GetTraffic recompiled two stats regexps on every traffic tick, and LogWriter.Write recompiled two more on every log line. Hoist all four to package-level vars so they compile once at load instead of per call on hot paths. Co-authored-by: Sanaei <[email protected]>
  • a5bc71a6f1 fix(sub): SS2022 share links must not base64-encode userinfo (#5432) Per SIP022, ss:// links for 2022-blake3-* methods must NOT base64-encode the userinfo; method and password are percent-encoded instead. Clients like Hiddify reject the base64 form. Fix both the server-side subscription path and the client-side panel link, plus the matching parsers for round-trip import.
  • c58db81da0 fix(sub): add missing :// in Shadowrocket subscription deep link (#3945)
  • 0a40ec5f13 fix(sub): re-add xhttp mode to extra JSON for Karing (#5446) Regression of #4364. Karing parses the `extra` JSON and ignores the flat `mode=` param, so when extra was present without `mode` it stored the transport with no mode and the handshake failed. The `mode` field that #4365 added to buildXhttpExtra was dropped during the share-link refactor; restore it in both the backend and frontend generators.
  • Bu 7 işlemeler için karşılaştırmaları görüntüle »

3 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • e079490144 chore(db): use DELETE journal mode so sqlite stays a single file Switch sqlite from WAL to DELETE journal mode so the database no longer keeps -shm/-wal sidecar files; only x-ui.db remains at rest. Pair with synchronous=FULL for crash-safe durability in rollback-journal mode. The startup PRAGMA journal_mode=DELETE converts existing WAL databases and removes their leftover sidecar files on first run, so upgrades need no manual cleanup. busy_timeout and _txlock=immediate are unchanged.
  • af3f460065 fix(routing): sync xray rules when panel inbound tags change or are deleted (#5367) * fix(routing): sync xray rules when panel inbound tags change or are deleted When an auto-generated inbound tag changes (e.g. port edit), propagate the rename into xrayTemplateConfig routing rules and loopback outbounds. On inbound delete, drop rules that only matched that tag and strip the tag from rules that also match on domain, IP, or other fields. Run the template update after the inbound DB transaction commits so SQLite WAL reads see the stored xray settings reliably. * fix(inbounds): return needRestart after deferred routing tag sync Use a named needRestart return in UpdateInbound so the post-commit PropagateInboundTagRename defer can signal callers to restart Xray. --------- Co-authored-by: Sanaei <[email protected]>
  • f5e50038f0 fix(nodes): block node delete while inbounds are still attached (#5394) NodeService.Delete dropped the node row (and its per-node child rows) without checking for inbounds still referencing it via node_id, leaving orphaned inbounds with a dangling node_id that confuse node sync, subscriptions and cleanup. Refuse the delete with a clear error when inbounds are still attached, and remove the per-node child rows before the node row inside one transaction. Delete stays tolerant of a missing node row so it can still clean up orphaned rows. Regression test covers the blocked and clean-delete paths.
  • d01d9867e4 fix(sub): preserve non-default scMinPostsIntervalMs and use per-inbound xmux in JSON subscriptions (#5393) * fix(sub): preserve non-default scMinPostsIntervalMs in inbound wire payload The frontend wire normalizer unconditionally deleted scMinPostsIntervalMs from inbound configs before persisting to the database, so JSON subscriptions could never include it — even when the admin set a non-default value like "50-150". Only strip the xray-core default ("30") or empty values. The literal "30" is a known DPI fingerprint (#5141) and must still be removed, but custom tuning knobs must survive the round-trip so that buildXhttpExtra and the JSON subscription generator can propagate them to clients. Add tests for non-default preservation and empty-value stripping. * fix(sub): use per-inbound xmux instead of global subJsonMux in JSON subscriptions The JSON subscription generator always used the global subJsonMux panel setting for outbound.Mux, even when the inbound carried per-inbound xmux inside xhttpSettings. This meant XHTTP outbounds that configured their own multiplexing via xmux still got the legacy mux.cool block injected — and the inbound's own xmux was silently ignored. Now getConfig() checks whether xmux is present in the inbound's xhttpSettings. When it is, the per-inbound xmux handles multiplexing and the legacy outbound.Mux is suppressed. When xmux is absent, the global subJsonMux is used as before. The mux selection is threaded through genVless, genVnext, genServer, and genHy as an explicit parameter so each protocol handler can decide independently. Add tests: - xmux present → outbound.Mux suppressed, xmux survives streamData() - no xmux → global subJsonMux used as outbound.Mux * feat(ui): add scMinPostsIntervalMs to inbound XHTTP form The inbound XHTTP form was missing scMinPostsIntervalMs, making it impossible for admins to configure this client-only tuning knob through the panel. The field already existed in the Zod schema and outbound form, and the wire normalizer (PR #5393) now preserves non-default values for subscription propagation. Add Form.Item for scMinPostsIntervalMs in the packet-up section of the inbound XHTTP form, after scMaxEachPostBytes. Use the existing translation key and a placeholder that shows the range format without endorsing the DPI-fingerprinted default (30). Update the Zod schema comment to clarify that scMinPostsIntervalMs is now preserved on inbound for subscriptions, while uplinkChunkSize and noGRPCHeader remain outbound-only. Add two integration tests: - Non-default value (50-150) preserved through formValuesToWirePayload - Default value (30) stripped through the full pipeline * fix(ui): show packet-up fields for auto mode in inbound XHTTP form When mode is 'auto', the server accepts all three XHTTP modes including packet-up. The packet-up-specific fields (scMaxBufferedPosts, scMaxEachPostBytes, scMinPostsIntervalMs) are therefore relevant and should be configurable. Change the conditional from 'packet-up' only to 'packet-up || auto' so admins using the default 'auto' mode can configure these fields. * fix(outbound): show scMinPostsIntervalMs for auto mode, update placeholder - Show scMinPostsIntervalMs field when mode is 'auto' in addition to 'packet-up', since auto+TLS resolves to packet-up client-side - Change placeholder from '30' (DPI fingerprint) to 'e.g. 50-150' for consistency with inbound form * fix(inbound): show scMaxEachPostBytes for all modes, gate scMaxBufferedPosts behind packet-up/auto scMaxEachPostBytes is used by xray-core in every mode (both handlePacketUp and handleStreamUp validate it) and must be visible regardless of mode. scMaxBufferedPosts is only used by handlePacketUp, so it remains gated behind the packet-up/auto conditional. Also show scMinPostsIntervalMs for auto mode in outbound form and change placeholder from '30' (DPI fingerprint) to 'e.g. 50-150'. Update snapshot to reflect the new field order. * fix(inbound): correct XHTTP field visibility per xray-core source verification - scMaxEachPostBytes: move behind packet-up/auto gate (server only checks it in handlePacketUp, not handleStreamUp) - scMaxBufferedPosts: show for packet-up, stream-up, and auto (server uses uploadQueue in both handlePacketUp and handleStreamUp) - scStreamUpServerSecs: already correct (stream-up only) Verified against xray-core hub.go and dialer.go source code. --------- Co-authored-by: w3struk <[email protected]> Co-authored-by: MHSanaei <[email protected]>
  • da9ecf6f4d fix(nodes): strip central n<id>- tag prefix when pushing inbounds to remote (#5399) The central panel stores node inbounds with an n<id>- prefix so tags stay unique in its database, but pushes were sending that prefixed tag to the remote node. A no-op save or reconcile could rename the remote inbound and break Xray routing rules that still referenced the original tag. Strip only this node's prefix in wireInbound before add/update so the remote keeps its bare tag while central retains the aliased form locally. Signed-off-by: aleskxyz <39186039+[email protected]>
  • Bu 12 işlemeler için karşılaştırmaları görüntüle »

3 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 4f99e48ab7 chore(deps): bump actions/upload-artifact from 4 to 7 (#5427) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • a1aa8fcc08 chore(deps): bump react-router-dom from 7.17.0 to 7.18.0 in /frontend (#5428) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 7.17.0 to 7.18.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/[email protected]/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/[email protected]/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-version: 7.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • a1d71d42c9 chore(deps): bump aws-actions/configure-aws-credentials from 4 to 6 (#5426) Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 4 to 6. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/v4...v6) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • Bu 3 işlemeler için karşılaştırmaları görüntüle »

5 gün önce

txlyre txlyre/libqirt zamanında master buraya push yaptı

5 gün önce

txlyre işlemeler yansıdan txlyre/3x-ui deposundaki dalına eşitlendi

  • 4915d6b18d refactor(frontend): move form-item hints from extra to tooltip Switch reality target, node options, and WARP auto-update-IP hints from inline extra text to label tooltips for a cleaner form layout.
  • d6cddaff12 fix(sub): emit JSON-subscription pinnedPeerCertSha256 as comma-separated string xray-core now parses tlsSettings.pinnedPeerCertSha256 as a comma-separated string rather than a []string array. The JSON subscription still emitted the array form, which current xray-core-backed v2ray clients reject on import. Join the panel's stored pins into the string form, matching the raw share-link path (pcs/pinSHA256). Fixes #5401.
  • 3088e96493 fix(client): clear group when removed in the single-client editor SyncInbound deliberately preserves a stored group when the inbound settings carry none, so node snapshots and group-less rebuilds can't wipe it. That guard also meant removing the group in the single-client editor never took effect: the client kept showing under the old group after save. Persist the group explicitly in ClientService.Update (the single-edit path), like reverse, including the empty string that clears it. The editor always round-trips the field, so this is safe; bulk and the Groups page are unchanged. Add TestClientUpdate_ClearsGroup.
  • c5d31de4e9 fix(service): serialize client/inbound writes to prevent Postgres deadlock Client/inbound mutations opened their own transactions that locked client_traffics before inbounds, while the @every 5s traffic poll (AddTraffic, already serialized through the traffic writer) locks them in the opposite order. Concurrently these formed an ABBA lock cycle that Postgres aborted as "deadlock detected" (SQLSTATE 40P01), failing client updates. Route those DB writes through the same single-goroutine traffic writer via a new runSerializedTx helper, so they can never run concurrently with the poll. For the client-edit paths the runtime (node) push is moved after the commit, keeping network I/O out of the serialized section. UpdateInbound keeps its push inside the transaction because EnsureInboundTagAllowed must reach the node before the central row is committed. Covers UpdateInboundClient/addInboundClient/DelInboundClientByEmail/ delInboundClients, the bulk adjust/delete transactions, and UpdateInbound.
  • 340d0df9fc fix(sub): wrap JSON-subscription SS/Trojan outbound in servers[] array The flat top-level address/method/password form only parses on recent xray-core; older bundled cores (e.g. in v2rayN) reject it. Restore the standard "servers" array used through 2.9.x so the JSON subscription connects across all xray-core versions. VMess/VLESS keep the flat vnext fallback, which is long established in xray-core.
  • Bu 7 işlemeler için karşılaştırmaları görüntüle »

6 gün önce