txlyre

txlyre fixo push a master en txlyre/libqirt

hai 9 horas

txlyre fixo push a master en txlyre/qic

hai 9 horas

txlyre fixo push a master en txlyre/libqirt

hai 11 horas

txlyre synced commits to v3.4.2 at txlyre/3x-ui from mirror

hai 15 horas

txlyre synced new reference v3.4.2 to txlyre/3x-ui from mirror

hai 15 horas

txlyre synced commits to main at txlyre/3x-ui from mirror

hai 15 horas

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 86813758cc fix(node): stop the offline-sync toast firing on saves to online nodes IsNodePending fed the user-facing "saved locally, node offline, will sync on reconnect" toast off three conditions, one of which was the node's config_dirty flag. But every node-backed client/inbound edit marks the node dirty unconditionally inside its write transaction — it is the reconcile self-heal marker, set even for edits pushed live to a healthy online node. The controller reads that freshly-set flag right after the save, so the warning fired on every save to a node-backed inbound regardless of the node actually being online. Drop the dirty term so the predicate reflects only what the message claims: the node being unreachable (offline or disabled). Offline and disabled nodes still mark dirty and still surface the toast. Add regression tests: online+dirty must not be pending; offline and disabled must be.
  • 8332ba67ae chore(deps): bump antd to 6.5 and migrate deprecated component props Upgrade frontend deps (antd 6.4.5 -> 6.5.0, Ant Design icons, TanStack Query, i18next, eslint) and fasthttp 1.71 -> 1.72. AntD 6.5 deprecated several Input/Card/Space props, so adapt the panel UI: - Input/InputNumber addonBefore/addonAfter -> prefix/suffix - Card bordered -> variant="outlined" - Space direction -> orientation - swap the hand-rolled Telegram SVG for the new TelegramFilled icon - guard SettingListItem against cloning aria-labelledby onto a Fragment, which only accepts key/children
  • d8221a8153 fix(sub): bake Host VLESS Route into subscription UUIDs The Host VLESS Route field was stored and shown in the panel but never applied to any generated subscription (raw, JSON, Clash), so the UUID was emitted unmodified (#5655). Xray reads the route from the UUID's 3rd group (bytes 6-7, net.PortFromBytes) and masks those bytes to zero before authenticating, so a value can be baked into the share/JSON/Clash UUIDs without breaking the user match. A shared applyVlessRoute helper encodes a single 0-65535 value as the 3rd group; empty/invalid/non-UUID input is left unchanged, so legacy data never yields a broken link and no DB migration is needed. The field was wrongly validated as a multi-segment port spec (that form belongs to the separate server-side routing rule). It is now a single value 0-65535, with frontend validation, link-preview parity (genVlessLink/hostToExternalProxyEntry), hint + error translations across all 13 locales, and tests on every path. Closes #5655
  • 789e92cddc fix(clients): re-enable depleted clients on API renewal (#5619) Renewing a subscription via POST /panel/api/clients/bulkAdjust extended a client's expiry/quota but left it disabled. The enforcement loop disables a depleted client across client_traffics, client_records and the inbound settings JSON (and pushes that to the node), while BulkAdjust only updated expiry/total and never cleared enable. On a node its UpdateUser push was built from the stale ClientRecord (Enable=false), which the next traffic poll merged back onto the master, so the client never recovered. BulkAdjust now re-enables a client only when it was disabled because it was depleted and the adjustment lifts it back within limits, computed as a set-difference of the production depletedCond predicate and applied through the canonical BulkSetEnable (run after the per-inbound loop, since lockInbound is non-reentrant). Manually-disabled or still-depleted clients stay disabled. Update now writes the clients.enable column explicitly so re-enabling sticks for inbound-less clients and stops feeding a stale record into node pushes.
  • 7a5d6da28c fix(xray): clean stale routing references when a balancer or outbound is deleted (#5648) * feat(xray): reference-cleanup helpers for entity deletion When an outbound or balancer is deleted on the Xray page, routing rules and balancers that reference it must be repaired in the same edit, or the saved config breaks the core: a dangling balancerTag stops Router.Init (whole core down), a dangling outboundTag black-holes matched traffic at the dispatcher. Add pure plan*/apply* helpers that compute and apply the cleanup. A rule is kept when a destination (outboundTag or balancerTag) remains and dropped when none does. Deleting an outbound cascades: emptying a balancer selector removes that balancer too, then repairs its rules in one pass against the full removed set; fallbackTag and dialerProxy references are cleared and observatories re-synced. * fix(balancers): clean routing rules referencing a deleted balancer Deleting a balancer left routing rules pointing at its balancerTag. xray-core's Router.Init then fails ("balancer <tag> not found"), the core won't restart and every inbound drops — the saved config passes CheckXrayConfig (JSON shape only), so it breaks only on the next restart. The delete confirm now lists the affected rules (modified vs removed) next to the existing observatory warning and applies planBalancerDeletion's cleanup: a rule keeps its outboundTag when present, otherwise the whole rule is dropped. Adds the shared DeletionImpactList and refCleanup strings across all 13 locales. * fix(outbounds): clean rules, balancer selectors and dialerProxy on outbound delete Deleting an outbound left routing rules pointing at its outboundTag (matched traffic black-holed at the dispatcher), plus stale references in balancer selectors / fallbackTag and other outbounds' dialerProxy. The delete confirm now shows planOutboundDeletion's impact and applies the cascade: rules keep a remaining balancerTag (else are dropped), the tag is pulled from balancer selectors and fallbacks, dialerProxy references are cleared, and a balancer whose selector is emptied is removed along with its own now-targetless rules. * refactor(xray): share one rule classifier across preview and apply Code review flagged that the keep/drop predicate was transcribed twice — in ruleImpacts (the delete-modal preview) and in applyCleanup (the mutation) — kept in sync only by a parity test. Extract a single classifyRule() that both call, so the preview can never disagree with what apply actually does. Also harden balancersEmptiedBy to skip tagless balancers: an empty/missing tag would otherwise enter the removed set as "" and silently drop every other tagless balancer (only reachable via a hand-edited config, but a silent data loss). And remove observersRemovedByDeletingBalancer, orphaned once BalancersTab switched to planBalancerDeletion. * fix(xray): null-guard reference cleanup against unvalidated configs The PR review noted that classifyRule and applyCleanup dereferenced rule / balancer entries directly, while the sibling propagateOutboundTagRename uses optional chaining — because fetchXrayConfig falls back to the unvalidated parsed object when Zod validation fails, a stray null in rules / balancers can survive into the editor and would throw during the delete preview/apply. Match that defensive style: classifyRule and balancersEmptiedBy read through optional chaining, the balancer loop skips nullish entries, and the dialerProxy walk guards the outbound. A delete on a hand-edited config with null entries now degrades gracefully instead of throwing.
  • Ver comparación destas 6 achegas »

hai 23 horas

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 6c71b725da fix(clients): hide WireGuard config after detaching the WG inbound The client info and QR modals rendered a WireGuard config whenever the client still carried leftover WG key material (privateKey / publicKey / allowedIPs / preSharedKey / keepAlive), regardless of whether a WireGuard inbound was actually attached. After detaching the WG inbound the config kept showing, built with an empty endpoint port and public key. Gate wgConfigText on an attached WireGuard inbound (wgInbound) being present, not just isWireguardClient(client), in both ClientInfoModal and ClientQrModal. Also rename the i18n key pages.clients.conf -> config and add the missing pages.clients keys (wireguardConfig, config, bulkFlow, bulkFlowNoChange, bulkFlowDisable) to all 12 non-English locales so each one matches en-US.
  • a329882e0e feat(wireguard): client config UX, collapsible config card, configurable DNS Land the WireGuard client-config UX work on main (the upstream PR #5642 branch could not be pushed to). - Reusable collapsible ConfigBlock (copy/download/QR, actions aligned right) for the client .conf, used by client info and the public sub page. - Correct .conf: canonical PresharedKey casing and DNS sourced from the inbound (configurable per-inbound, default 1.1.1.1, 1.0.0.1). - Configurable per-inbound DNS for WireGuard (schema + form + backend hint via InboundOption.WgDns); inert at the Xray layer. - Public sub page now shows the WireGuard config, rebuilt from the share link; the Go wireguard:// link carries dns/presharedkey/keepalive for completeness. - QR enabled for the wireguard:// link; link rows are compact like other protocols. - Client information order is subscription, copy URL, WireGuard config; the redundant config tab is removed from the add/edit client modal. - Drop the Inbound Information and QR Code row actions for WireGuard inbounds.
  • Ver comparación destas 2 achegas »

hai 1 día

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 60c54827aa feat: ldap skip tls verify (#5637) * feat(ldap): add InsecureSkipVerify field and tlsConfig helper Extract the inline TLS config at both LDAPS dial sites (FetchVlessFlags, AuthenticateUser) into a tlsConfig(cfg) helper, and add a new Config.InsecureSkipVerify bool that flows through to tls.Config.InsecureSkipVerify. This unblocks enterprise environments (e.g. Microsoft AD CS with internal CAs) where the server certificate chain cannot be imported into the system trust store. Behavior is identical when InsecureSkipVerify is false (the default) - pure refactor + plumbing. The helper is unit-testable without a live server, which is why it is extracted. Closes https://github.com/MHSanaei/3x-ui/issues/5538 * feat(settings): add LdapInsecureSkipVerify setting Plumb the new LDAP skip-TLS-verify toggle through the settings stack: - AllSetting struct field (json/form tag: ldapInsecureSkipVerify) - defaultValueMap default ("false") - GetLdapInsecureSkipVerify() getter - ldap_sync_job wiring into ldaputil.Config (FetchVlessFlags path) - panel/user.go wiring into ldaputil.Config (AuthenticateUser path; the original issue's file list missed this) Persistence is handled by UpdateAllSetting's reflect loop, matching the existing pattern used by ldapUseTLS (no explicit setter). Closes https://github.com/MHSanaei/3x-ui/issues/5538 * feat(ui): add Skip TLS verification switch in LDAP settings Wire the new ldapInsecureSkipVerify setting into the hand-written frontend model and Zod schema, and render it as a new Switch in GeneralTab right under "Use TLS (LDAPS)". The switch is disabled when TLS is off (the setting is meaningless without LDAPS) and shows an insecure-warning description to make the security implication visible to operators. Also adds a Vitest round-trip test pinning schema acceptance and model default-to-false behavior. Closes https://github.com/MHSanaei/3x-ui/issues/5538 * chore(i18n): add Skip TLS verification strings to all locales Add pages.settings.ldap.skipTlsVerify and skipTlsVerifyDesc to all 13 backend-served translation files, matching the existing repo convention of keeping LDAP keys present in every locale (en-US, fa-IR, ru-RU, zh-CN, zh-TW, pt-BR, ar-EG, uk-UA, id-ID, tr-TR, vi-VN, ja-JP, es-ES). No translation-parity test exists in CI, but every other LDAP key is replicated across all files, so this keeps the invariant intact. Closes https://github.com/MHSanaei/3x-ui/issues/5538 * chore(codegen): regenerate frontend artifacts Regenerate frontend/src/generated/{zod,types,schemas,examples}.ts and frontend/public/openapi.json via `npm run gen` to reflect the new ldapInsecureSkipVerify field. The codegen CI job runs `git diff --exit-code` on these files; failing to commit them would break the build. Closes https://github.com/MHSanaei/3x-ui/issues/5538
  • aef35ee0de fix(sync): mark node dirty inside the mutation transaction (atomic ConfigDirty) (#5611) * fix(sync): mark node dirty inside the mutation transaction ConfigDirty is currently set by MarkNodeDirty AFTER the mutation, on a separate DB handle outside the mutation's transaction. A crash or error between the committed change and the mark leaves a committed config change that never reconciles to the node (silent drift). Add MarkNodeDirtyTx(tx, id) and call it inside each mutation's transaction so the dirty mark commits atomically with the change. * fix(test): initialize DB in TestResolveInboundAddress and group gorm import Two CI failures on this branch: - race (-shuffle=on): TestResolveInboundAddress reaches resolveInboundAddress -> configuredPublicHost -> GetSubDomain, which reads the global DB. The test never initialized one, relying on another sub-package test to do so first; under shuffle it ran first and nil-dereferenced gorm. Call initSubDB(t) so it is self-sufficient (empty DB yields an empty subDomain, so the subscriber-host fallback still holds). - golangci goimports: gorm.io/gorm was grouped with the github.com/mhsanaei/3x-ui local imports in node_dirty_test.go. Move it into the third-party group.
  • 2b10808fbd fix(settings): require re-2FA confirmation for sensitive setting changes (#5610) * fix(settings): require server-side 2fa for sensitive changes * fix(lint): group third-party imports separately from local (goimports) golangci-lint goimports flagged setting.go and setting_security_test.go because xlzd/gotp and gorm.io/gorm were mixed into the github.com/mhsanaei/3x-ui local-prefix group. Move them into the third-party group so the local imports stand alone.
  • 25a86b9ee2 feat(balancers): tabbed Observatory/Burst Observatory form (#5627) * feat(balancers): tabbed Observatory/Burst form replacing raw JSON Replace the raw JSON editor for the Observatory / Burst Observatory sections with a proper Ant Design form, and split the Balancers page into two sub-tabs: "Balancer Settings" (the existing table) and "Observatory". Observers stay fully auto-managed by balancer strategy through the existing syncObservatories logic: users edit only the tunable probe fields, the subjectSelector is shown read-only since it is derived from the balancers, and deleting the last balancer that needs an observer now warns in the confirm dialog that the observer will be removed too. Overlapping selectors keep an observer alive while any balancer still references it. Also add the previously missing pingConfig.httpMethod field (HEAD/GET) and translations for the new strings across all 13 locales. * refactor(balancers): tighten httpMethod typing and align connectivity default Address automated review feedback on the Observatory form: - Use the ObservatoryHttpMethodSchema enum for pingConfig.httpMethod instead of a free-form z.string(), and drive the HTTP method Select from its options. Removes the previously dead enum export and the duplicate local list, and types the field as 'HEAD' | 'GET'. - Align the schema's connectivity default with DEFAULT_BURST_OBSERVATORY (the hicloud URL) so it matches what burst observers are actually created with. No behavior change.
  • 51ffba5961 fix(balancers): defer validation errors until touched or save (#5626) The Add Balancer modal parsed its empty initial state through BalancerFormSchema on mount and bound Form.Item validateStatus/help directly to the result, so "Tag is required" and "Pick at least one outbound" rendered the moment the modal opened, before any user input. Gate the inline errors behind per-field touched tracking plus a submit-attempted flag, and drop the disabled Create button so a save attempt surfaces the errors (matching RuleFormModal). The existing key-based remount in BalancersTab resets the flags on each open. Add a regression test asserting no errors on open and errors only after a save attempt.
  • Ver comparación destas 9 achegas »

hai 1 día

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 9c8cd08f90 feat(wireguard): multi-client support WireGuard inbounds now manage per-client peers using xray-core's native WireGuard users (AddUser/RemoveUser). Each client lives in settings.clients (canonical, like every other protocol) and is projected to peers[] only when emitting the xray config, at level 0 so the dispatcher's per-user traffic/online counters work with no extra plumbing. Backend: internal/util/wireguard gains KeyToHex (base64 to hex for the gRPC path), PublicKeyFromPrivate and GenerateWireguardPSK; xray/api.go builds a wireguard account in AddUser with hex keys (RemoveUser already worked); client CRUD generates a keypair and allocates a unique tunnel address per client and never rotates keys on edit; an idempotent migration converts legacy settings.peers into managed clients; WireGuard is included in the raw subscription. Frontend: WireGuard in the add-client modal with keys on the credential tab, client schema, per-client QR/link/.conf, inbound form reduced to server settings; i18n added across 13 locales. Fix: guard the settings[clients] assertion in add/update so a legacy WireGuard inbound stored without a clients key no longer panics.
  • 33aada0c7c feat(xhttp): default xmux maxConnections to 6 xray-core v26.6.27 changed the XHTTP client xmux default to maxConnections=6 (anti-RKN). The panel previously sent maxConnections=0, which overrode that default; default XHttpXmuxSchema to 6 so new outbounds adopt it and the wire-exclusivity rule drops maxConcurrency accordingly.
  • e44075a6e0 chore(deps): bump xray-core to v26.6.27 Update the xray-core Go module (infra/conf builders + gRPC command clients) and the bundled binary pin in DockerInit.sh and the release workflow from v26.6.22 to v26.6.27. No gRPC command-API breaking changes. The release's other inbound work rides along with the bump: TUN autoSystemRoutingTable/autoOutboundsInterface are already modeled in the frontend tun schema, while Hysteria vlessRoute (UUID-derived) and the TUN traffic counters are internal to xray-core and need no panel changes.
  • Ver comparación destas 3 achegas »

hai 2 días

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 56b0be0b6a fix(lint): use errors.Is for io.EOF comparison in sys_linux The errorlint linter rejects direct error comparison with != because it fails on wrapped errors. Compare via errors.Is(err, io.EOF) instead.
  • 9b8a0c9b17 feat(groups): reset group traffic without touching client counters The group page shows traffic counting per group, but the only reset available zeroed every member client's up/down counters (and their quotas) via bulkResetTraffic. Group traffic is a derived sum of client traffic, so zeroing the group display previously required mutating the clients themselves. Add a display-only baseline: ClientGroup gains reset_up/reset_down columns (additive, handled by AutoMigrate). ResetGroupTraffic snapshots the group's current up/down sum into the baseline, and ListGroups now reports max(0, sum - baseline). Client counters are left untouched and no Xray restart is triggered. A new POST /panel/api/clients/groups/ resetTraffic endpoint drives it, creating the client_groups row when the group exists only as a derived label. The groups page action now calls the new endpoint; confirm/success strings updated across all 13 locales to reflect group-only semantics.
  • d1c0d77023 chore(ci): bump golangci-lint action to v9 Update the GitHub Actions CI workflow to use golangci/golangci-lint-action@v9 instead of v8. This keeps the lint job aligned with the latest major version and ongoing action maintenance.
  • 63fca9ef88 docs: correct false RTL claim and stale Vite version in CONTRIBUTING.md RTL is not wired through AntD ConfigProvider direction (no such code exists; only the Jalali date picker is RTL-aware), so the guide now states that accurately instead of claiming a mechanism that is absent. Replace the hardcoded Vite version (said 8.0.16; package.json pins 8.1.0) with a pointer to read the live version, removing the drift source.
  • 2e851978e6 chore: add Makefile as canonical task runner make verify reproduces the CI PR gate locally (gen-check, lint, typecheck, test, build) with the same flags as ci.yml: go test -shuffle=on -count=1 over the node_modules-filtered package list, the internal/web/dist go:embed stub, and the generated-file staleness diff. Run make help for all targets.
  • Ver comparación destas 15 achegas »

hai 3 días

txlyre fixo push a master en txlyre/qic

hai 3 días

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 7a2179535a fix(settings): normalize API token timestamps (#5599) * fix(settings): normalize API token timestamps * refactor(api-token): share timestamp threshold --------- Co-authored-by: Tomilla <5007859+[email protected]>

hai 3 días

txlyre fixo push a master en txlyre/qic

hai 3 días

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 6964d84742 feat(reality): add live REALITY target scanner with IP/CIDR discovery Replace the static reality-targets list with a server-side TLS 1.3 probe that checks TLS 1.3 + HTTP/2 + X25519 + a trusted certificate. - Single-domain validate auto-fills target and serverNames from the cert SAN - Discovery scans an IP/CIDR without SNI to find new targets from their certificates, deduped and ranked by feasibility then latency, private-IP guarded via netsafe - New endpoints scanRealityTarget and scanRealityTargets with RealityScanResult, plus openapigen and api-docs entries - Add scanner strings to all 13 locales - Replace deprecated AntD Alert message prop with title across the panel
  • 451263f1db feat(sidebar): add documentation link button Add a Docs button next to the donate button in the sidebar and mobile drawer linking to https://docs.sanaei.dev/, with menu.docs translations across all 13 languages.
  • Ver comparación destas 2 achegas »

hai 3 días

txlyre synced commits to main at txlyre/3x-ui from mirror

  • 8e4c368200 feat(update): allow opting into the dev channel from a stable build The panel version button opened the GitHub releases page on a stable, up-to-date build, and the dev-channel toggle only rendered on dev builds, so there was no in-panel path from stable to dev. Drop the IsDevBuild() guard in devChannelActive (the toggle alone drives the channel now), always open the update modal instead of releases, and always render the Dev channel switch.
  • 522b1b64b0 fix(logger): prevent nil-deref panic in migrate/setting CLI paths The package-level logger is nil until InitLogger runs, which only happens in runWebServer. The migrate and setting subcommands log without initializing it; PR #5520 added a logger.Info on a success path in MigrationRestoreVisionFlow, so 'x-ui migrate' segfaults on installs with a VLESS inbound needing Vision-flow restoration. Initialize logger to a usable default at package load so no code path can nil-deref it, and set up the dual backend in migrateDb so migration steps are logged like runWebServer. Fixes #5581
  • Ver comparación destas 2 achegas »

hai 4 días

txlyre fixo push a master en txlyre/qic

hai 4 días

txlyre fixo push a master en txlyre/libqirt

hai 4 días

txlyre synced commits to v3.4.1 at txlyre/3x-ui from mirror

hai 4 días

txlyre synced new reference v3.4.1 to txlyre/3x-ui from mirror

hai 4 días