txlyre

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

1 jam lalu

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

1 jam lalu

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

  • 2a03844566 v3.2.5
  • 51d383b1c3 chore: bump bundled Xray-core to v26.6.1 Update the Xray-core download URLs in the release workflow and DockerInit.sh from v26.5.9 to v26.6.1.
  • 2bb9ed1cda feat(outbound): sync DNS outbound config with Xray core changes Rename the DNS rule wire key qtype to qType (reading the legacy qtype on parse for back-compat), add the new rCode response-code field for the return action (omitted when zero), and rename the reject action to return. Align the DNS rule action set across the form dropdown, schema, and adapter to the core's valid values (direct/drop/return/hijack), dropping the never-valid rejectIPv4/rejectIPv6 entries.
  • 32f96298f8 feat(finalmask): sync transport with upstream Xray core changes Consolidate the eight legacy mKCP/header UDP mask types into a single mkcp-legacy type ({header, value}), simplify xicmp to {dgram, ips}, and add the new realm UDP mask type, matching the updated Xray-core wire format. Update the FinalMask schema enum, the transport form, the mKCP seeding default, and the backend KCP share-link translation. Refresh golden fixtures/snapshots and add backend coverage for the mapping.
  • c5ff166056 fix(inbounds): refresh routing inbound-tag list after inbound changes The routing-rule tag picker reads inboundTags from the xray config query (['xray','config']), but refresh() only invalidated the inbounds/clients buckets. So after adding, editing or deleting an inbound the tag list stayed stale until a hard refresh wiped the react-query cache. Invalidate the xray config query too, alongside the existing inbounds-options fix.
  • Lihat perbandingan dari komit ini 18 »

1 jam lalu

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

  • ba2baa9028 chore(ui): redesign Edit Routing Rules modal
  • 2a03844566 v3.2.5
  • 51d383b1c3 chore: bump bundled Xray-core to v26.6.1 Update the Xray-core download URLs in the release workflow and DockerInit.sh from v26.5.9 to v26.6.1.
  • 2bb9ed1cda feat(outbound): sync DNS outbound config with Xray core changes Rename the DNS rule wire key qtype to qType (reading the legacy qtype on parse for back-compat), add the new rCode response-code field for the return action (omitted when zero), and rename the reject action to return. Align the DNS rule action set across the form dropdown, schema, and adapter to the core's valid values (direct/drop/return/hijack), dropping the never-valid rejectIPv4/rejectIPv6 entries.
  • 32f96298f8 feat(finalmask): sync transport with upstream Xray core changes Consolidate the eight legacy mKCP/header UDP mask types into a single mkcp-legacy type ({header, value}), simplify xicmp to {dgram, ips}, and add the new realm UDP mask type, matching the updated Xray-core wire format. Update the FinalMask schema enum, the transport form, the mKCP seeding default, and the backend KCP share-link translation. Refresh golden fixtures/snapshots and add backend coverage for the mapping.
  • Lihat perbandingan dari komit ini 10 »

1 jam lalu

txlyre synced new reference branches/ruleformmodal_redesign to txlyre/3x-ui from mirror

1 jam lalu

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

  • 4643957bca chore(ui): remove cards jump on hover
  • 2a03844566 v3.2.5
  • 51d383b1c3 chore: bump bundled Xray-core to v26.6.1 Update the Xray-core download URLs in the release workflow and DockerInit.sh from v26.5.9 to v26.6.1.
  • 2bb9ed1cda feat(outbound): sync DNS outbound config with Xray core changes Rename the DNS rule wire key qtype to qType (reading the legacy qtype on parse for back-compat), add the new rCode response-code field for the return action (omitted when zero), and rename the reject action to return. Align the DNS rule action set across the form dropdown, schema, and adapter to the core's valid values (direct/drop/return/hijack), dropping the never-valid rejectIPv4/rejectIPv6 entries.
  • 32f96298f8 feat(finalmask): sync transport with upstream Xray core changes Consolidate the eight legacy mKCP/header UDP mask types into a single mkcp-legacy type ({header, value}), simplify xicmp to {dgram, ips}, and add the new realm UDP mask type, matching the updated Xray-core wire format. Update the FinalMask schema enum, the transport form, the mKCP seeding default, and the backend KCP share-link translation. Refresh golden fixtures/snapshots and add backend coverage for the mapping.
  • Lihat perbandingan dari komit ini 10 »

1 jam lalu

txlyre synced new reference branches/hover_effect_disable to txlyre/3x-ui from mirror

1 jam lalu

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

  • fb311afa6f fix(sub): keep listen/bind IP out of subscription page URLs The subscription page leaked an inbound's server-side Listen IP into the client-facing URLs when a bind address was set: - Per-config links: resolveInboundAddress returned the bind Listen IP (loopback/private/public alike) instead of the host the subscriber reached the panel on. It now returns the node address for node-managed inbounds, otherwise the subscriber host; the bind Listen is ignored (External Proxy remains the way to advertise a specific endpoint). - Subscription Copy URL (SUB/JSON/CLASH): BuildURLs composed the base differently from the panel's Client Information page and never normalized the request host, so a loopback/bind request leaked the raw IP. The composition is extracted into the shared SettingService.BuildSubURIBase, used by both the panel and the sub page so they render identically, and fed the already-normalized subscriber host.
  • eb78b8666f fix(inbound): re-derive auto tags on edit and keep node tags consistent Auto-generated inbound tags (in-<port>-<l4>, n<id>- prefixed for node inbounds) now re-derive when port/listen/transport change on update instead of keeping the stale round-tripped value. The resolved tag is mirrored onto the API response, and NodeID is pinned to the stored row so a node inbound never loses its n<id>- prefix on edit. The edit form recomputes the tag live via a Go-parity helper so the JSON preview matches what gets saved. Make node/central tag matching prefix-agnostic in all three places (traffic attribution, remote-id resolution, and the orphan sweep) so an n<id>- prefix present on only one side can no longer spawn duplicate inbounds or drop traffic on sync. Force LF on shell scripts via .gitattributes (CRLF broke the Docker build shebang when the repo is checked out on Windows) and add a .dockerignore to keep node_modules/.git out of the build context. Adds Go and frontend tests covering tag re-derivation, prefix-agnostic matching, and node-snapshot prefix mismatch.
  • 4a11375f36 fix(tgbot): send login notification asynchronously UserLoginNotify ran SendMsgToTgbotAdmins synchronously on the login request goroutine. When Telegram was unreachable, the send retried up to 3x with a 30s timeout each, blocking the login handler for ~90s+ and effectively locking users out (issue #4585). Dispatch the send in a goroutine after the cheap bot-running/login-notify-enabled guards so login always returns promptly; the existing per-send 30s context timeout and bounded retries keep the background goroutine from leaking.
  • 8db9729913 fix(model): accept tun protocol in inbound validation Adding a TUN inbound failed with "request body failed validation" because the Inbound.Protocol oneof allowlist omitted "tun". Add it so the validator matches the protocol the frontend already offers. Closes #4736
  • 4e4e30d8c1 fix(ci): raise issue-bot max-turns so full triage completes The handle-issue job capped at 25 turns, which only covered the early-exit spam/duplicate paths. Real bug reports went through the full flow (categorize + Read/Grep the code + post an answer) and hit the cap mid-step 5, leaving the issue labeled but with no reply. Raise to 45 to match the heavier path; the mention job already uses 40. @
  • Lihat perbandingan dari komit ini 13 »

9 jam lalu

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

  • 998fa0dfe1 fix(postgres): stop FK constraint from blocking inbound delete The schema was written for SQLite, which never enforces foreign keys, so relationships are managed in application code and deleting an inbound keeps its client_traffics by design. On Postgres GORM auto-created the fk_inbounds_client_stats constraint, which rejected those deletes with SQLSTATE 23503. Set DisableForeignKeyConstraintWhenMigrating so neither backend creates the constraint, and drop the already-created one on existing Postgres DBs via dropLegacyForeignKeys. Also revert the client_traffics deletion that c20ee00f added to DelInbound so traffic is preserved.
  • f02018cfb7 fix(outbounds): prevent freedom save crash, complete its fields (#4686) freedomToWire called Object.entries(s.fragment), but getFieldsValue(true) returns freedom settings without a fragment object when the Fragment switch is off (its sub-fields never register). That threw 'Cannot convert undefined or null to object' and silently killed the save. Guard fragment with a fallback so an unset value is treated as empty. While verifying against xray-core's freedom config, also: - add the missing userLevel field (schema, form schema, adapter, UI) - fix noise applyTo enum to ip/ipv4/ipv6 (xray rejects the old host/all) Closes #4686
  • c20ee00fa3 fix(postgres): clear client_traffics before deleting inbound DelInbound removed the client_inbounds join rows but never deleted the inbound's client_traffics, so Postgres rejected the inbound delete with fk_inbounds_client_stats (SQLSTATE 23503). SQLite never enforced the FK so this went unnoticed. Delete client_traffics first, matching the order already used in the sync path.
  • b1c141a515 fix(settings): sync generated schemas - entity.go: tighten SessionMaxAge validate tag gte=0 -> gte=1 to match the panel UI (min 60) and the hand-written setting.ts schema - GeneralTab.tsx: add max bounds to sessionMaxAge (525600) and pageSize (1000), raise pageSize min to 1 - regenerate zod.ts/types.ts, picking up pending drift: panelProxy field, client group field, InboundFallback.dest, and dropping the stale hysteria2 protocol enum value
  • 982a78ecdd ci(issue-bot): focus @claude mention on answering, raise turn limit
  • Lihat perbandingan dari komit ini 12 »

17 jam lalu

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

  • 3f6fe1167d fix(sub): don't leak loopback bind IP into link host When the sub server is reached on a loopback/unspecified host (e.g. 127.0.0.2 from its Listen IP bind), the request host was used as the link address. Substitute the configured Subscription/Web Domain, or normalize loopback to localhost, so the sub link address matches the panel's Client Information.
  • 234cce408b @ ci: replace legacy frontend path filters with frontend/** glob The CI, CodeQL, and release workflows still gated on a per-extension list (**.js, **.html, **.css, **.cjs, ...) left over from the old Vue/JS UI. That list missed .tsx entirely, so React component edits never triggered the workflows, and carried dead entries like **.cjs. Replace the whole enumeration with a single frontend/** glob in all three so any change under frontend/ triggers build/test/analysis, while keeping **.go, go.mod, go.sum, **.sh, and the service-file paths. @
  • a7d763a542 fix(clients): persist sort selection across navigation The clients page saved searchKey and filters to localStorage but not the sort selection, so leaving the page and returning reset sort to the default (Oldest). Persist the chosen sort alongside the existing filter state and restore it on mount, matching the filter-persistence pattern.
  • 80110f9404 fix(inbounds): reset id sequence on delete so old ids are reused SQLite AUTOINCREMENT keeps a high-water mark in sqlite_sequence that deleting rows never lowers, so after removing inbounds the next add kept climbing instead of reusing freed ids. DelInbound now realigns the counter to MAX(id) after each delete, clearing the sqlite_sequence row entirely when the table is empty so the next inbound starts at id 1. Guarded behind !IsPostgres(); Postgres sequences are left untouched.
  • cf50952921 feat(inbounds): add multi-select and bulk delete Mirror the clients page: checkbox selection on the desktop table and on mobile cards, with a danger Delete button in the toolbar that removes all selected inbounds in one call. Backend adds POST /panel/api/inbounds/bulkDel, which loops the existing DelInbound per id (xray restarts at most once) and returns {deleted, skipped}. Frontend shows a confirm modal plus a result toast, clears the selection on success, adds bulk-delete i18n keys across all 13 languages, and documents the endpoint in the in-panel API docs.
  • Lihat perbandingan dari komit ini 10 »

1 hari lalu

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

  • 84a689cf10 feat(sub): add HEAD method support for subscription endpoints (#4684) Allow clients to retrieve Subscription-Userinfo header via lightweight HEAD requests without downloading the full response body. This enables traffic monitoring tools and proxy clients to check quota usage more efficiently.

1 hari lalu

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

  • eee26e4788 fix(outbounds): lock hysteria to its QUIC transport + TLS, add version/masquerade The hysteria protocol now offers only the Hysteria transport (other transports removed) and security is always TLS. This prevents the broken hysteria-over-tcp / security:none outbounds that made xray-core fail to start with 'Failed to build Hysteria config. > version != 2'. Show the fixed version field directly under Transmission, and expose the full masquerade sub-form on the outbound too. The masquerade UI was extracted into a shared HysteriaMasqueradeForm component used by both the inbound and outbound forms. Closes #4665
  • 987a6dd1e5 feat(clients/inbounds): IP log popups, clearer titles, tag-based inbound labels Add an IP Log popup (view list + refresh + clear) to the client edit form and the Client Information modal, with IPs stacked vertically. Identify inbounds by their xray tag (not remark/protocol:port) across every picker and chip: attach/detach modals, the attached-inbounds column and field, the filter drawer, and bulk-add. Add the tag field to the InboundOption schema (the backend already returned it). Clarify modal titles/labels: Client Information (was More Information) and Inbound Information (was Inbound's Data); Client Information / QR Code titles now include the client email. i18n: rename keys moreInformation->clientInfo and inboundData->inboundInfo with proper translations in all languages; addTitle->addClient, editTitle->editClient, addToGroupPlaceholder->groupName.
  • 12afb862ff fix(outbounds): parse wireguard:// links and fix ss:// query-string port Add parseWireguardLink to the outbound import dispatcher: maps the secretKey userinfo, peer publicKey/endpoint, address, mtu, reserved, preSharedKey and keepAlive (probing common client aliases). Previously any wireguard:// link fell through to null and showed "Wrong Link!". Also fix parseShadowsocksLink so a trailing query string (e.g. ?type=tcp) no longer leaks into the host:port slice, which made Number(port) NaN and silently fell back to 443. Strip the query before parsing in both the modern and legacy ss forms.
  • cb7af04cd3 fix(xray): test UDP outbounds via xray probe (#4657) + Vision testseed & Flow form fixes Outbound connection tester (#4657): UDP-based outbounds (wireguard, hysteria, kcp/quic transports) were probed with a raw UDP dial that treated the inevitable read timeout as success, so every one reported a fake ~5s 'alive'. Route them through the authoritative xray burstObservatory probe and drop the broken raw-UDP path. Test All now runs a parallel TCP lane and a serial HTTP lane so xray-probe outbounds don't collide on the test semaphore. Vision testseed: the [900, 500, 900, 256] default repeats 900, and a tags Select keys each tag by value -> 'two children with the same key, 900'. Render it as four InputNumbers (inbound + outbound forms); the field is a fixed 4-tuple where repeats are valid. Inbound form: drop the null-valued 'Local Panel' Select option (AntD rejects null option values; placeholder + allowClear already cover it). Outbound form: add an explicit 'None' option to the Flow selector.
  • Lihat perbandingan dari komit ini 4 »

2 hari lalu

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

  • 8c30ddbfd9 fix(outbounds): persist optional blocks and fix stale edit reopen - derive XMUX toggle from saved xmux on load, seed defaults on enable, and drop xmux when disabled (#4654) - save the JSON tab straight from parsed text so sockopt, finalmask (TCP masks), mux, and reverse excludes round-trip instead of being dropped by the form-store bounce - remove the redundant Host/Path fields from HTTP obfuscation that fought the request.headers editor over the same form path - rebuild the outbounds table columns on row content change (rows, not rows.length) so a re-opened edited outbound shows fresh values - add adapter round-trip regression tests Closes #4654
  • 62c293e034 fix(outbounds): support proxyProtocol on freedom outbound Xray's freedom outbound accepts a numeric proxyProtocol (0 disabled, 1 or 2 for the PROXY protocol version), but the panel had no field for it and the typed form adapter dropped the key on save — so a value set via the JSON editor disappeared the moment the outbound was saved. Model proxyProtocol through the freedom wire schema, the form schema, and both adapter directions (clamped to 0/1/2, omitted from the wire when 0), and add a Select (none / v1 / v2) to the freedom section of the outbound form. Add round-trip test coverage and the proxyProtocol label across all locales. Closes #4486
  • 5d0081a3b9 fix(qr): hide QR for post-quantum links on client QR page Opening the client sublinks/QR modal crashed when a link used post-quantum keys (ML-DSA-65 / ML-KEM-768): the encoded URL exceeds the antd QRCode capacity and the component throws. The client QR modal rendered the QRCode unconditionally, so it took down the page. The names don't appear verbatim in a share link — mldsa65Verify rides inside pqv=<base64> and ML-KEM-768 inside encryption=mlkem768x25519plus. The QR modal and inbound QR modal used a literal-substring guard that missed those encoded forms, leaving the QR (and the crash) in place. Consolidate detection into a single isPostQuantumLink() helper in inbound-link.ts and reuse it across the client QR, inbound QR, client info, and sub surfaces. The copy/download link still works; only the QR image is suppressed for oversized post-quantum links. Closes #4656
  • Lihat perbandingan dari komit ini 3 »

2 hari lalu

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

  • 90a64a1b22 fix(ssl): prompt before setting IP cert path for panel The IP certificate flow auto-set the panel cert path silently, unlike the domain and Cloudflare flows which ask first. Add the same "Would you like to set this certificate for the panel? (y/n)" prompt so the IP flow is consistent and only configures the panel on confirmation.
  • 7ea88e3e37 fix(clients): store flow per-inbound for shared clients A client shared across inbounds (e.g. VLESS+TCP+Reality and VLESS+WS+TLS) had its `flow` applied globally, so enabling xtls-rprx-vision for Reality broke the WS+TLS inbound for the same client (#4628). Gate flow per inbound at every fan-out site via clientWithInboundFlow, reusing inboundCanEnableTlsFlow (VLESS+TCP+TLS/Reality only), and make ListForInbound treat flow_override as authoritative so an empty override means "no flow on this inbound" instead of inheriting the record's global flow. Also tighten buildTargetClientFromSource (copy-clients) to gate on transport, not just protocol.
  • 8e301dbca9 fix(clients): preserve UUID when toggling enable from clients page The clients list returns slim rows without secrets (uuid/password/auth) or flow/security/tgId/reset/group. setEnable built its update payload straight from the slim row, sending an empty id, so the backend treated it as a new client and regenerated the UUID (and dropped the omitted fields). Hydrate the full record first and send a complete payload that changes only the enable flag.
  • 8a28373a01 fix(nodes): use GREATEST for last_online merge on PostgreSQL setRemoteTrafficLocked merged last_online with MAX(last_online, ?), which is SQLite's two-argument scalar max. PostgreSQL's MAX() is aggregate-only, so node traffic sync failed every cycle with "function max(bigint, unknown) does not exist (SQLSTATE 42883)", flooding the logs. Add a dialect-aware database.GreatestExpr helper (GREATEST on Postgres, MAX on SQLite) and use it for the last_online merge. last_online is a non-null int64, so the two functions are semantically identical here. Closes #4633
  • df777c12d3 fix(outbounds): preserve TLS/Reality security on save OutboundFormModal.onOk built the save payload from form.validateFields(), which only returns REGISTERED Form.Item values. The security selector is a Radio.Group that writes streamSettings.security via setFieldValue with no bound Form.Item, so validateFields() dropped it — network, tlsSettings and realitySettings (all registered) survived, but the security discriminator vanished and xray-core fell back to security="none". This hit both new outbounds and re-saved ones. Read the full form store with getFieldsValue(true) for the payload (still validating first), matching how the inbound modal already does it. Closes #4634
  • Lihat perbandingan dari komit ini 9 »

3 hari lalu

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

3 hari lalu

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

3 hari lalu

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

  • 1fd2c1333c v3.2.0
  • ffe661d212 fix(groups): fetch full client list for Add/Remove/SubLinks modals GroupsPage was sourcing modal candidates from useClients(), which is server-paginated at 25 rows — so "Add clients to group" only ever offered the first page, "Remove" missed members past page 1, and SubLinks silently skipped emails whose record wasn't in the cached page. Pull the unpaginated list via /panel/api/clients/list when any of the three modals open.
  • 3f0b7fbe97 feat(tls): surface pinnedPeerCertSha256 in panel, share links, and subs Adds a panel-only `pinnedPeerCertSha256` field on TLS settings with a tags input and a random-hash generator. The hashes ride share links as `pcs` (v2rayN-compatible), Clash sub as `pin-sha256`, and JSON sub as `pinnedPeerCertSha256`, while remaining stripped from the run-config sent to xray-core.
  • c5b5606bf5 i18n(panel): translate Copy/Cancel buttons, Stream/Sniffing tabs, and All-Inbounds filenames - TextModal: route the Copy button label and the post-copy toast through t('copy')/t('copied') instead of hardcoded English. - PromptModal: route cancelText through t('cancel') and default okText through t('confirm') so the import-inbound prompt stops showing "Cancel" in non-English UI. - InboundsPage: pass the All-Inbounds and All-Inbounds-Subs download filenames through t(...) so each locale can localize them. - en-US.json: add pages.inbounds.exportAllLinksFileName and pages.inbounds.exportAllSubsFileName. - All 12 non-English locales: translate streamTab and sniffingTab (previously left as literal English) and add the two new filename keys with appropriate translations. All 13 locale files now have 1541 lines.
  • bee8288d41 fix(clients): bump auto-generated email length to 10 chars The "create" form opened with a 9-char random email default, the bulk modal's random portion was only 6 chars, and the inbound-defaults seed used 8 — all below the 10-char minimum we want for new clients. Bring each generator to 10 so an unedited auto-generated email meets the threshold without the user having to extend it.
  • Lihat perbandingan dari komit ini 19 »

3 hari lalu

txlyre synced and deleted reference feat/postgres-install at txlyre/3x-ui from mirror

3 hari lalu

txlyre synced and deleted reference dependabot/npm_and_yarn/frontend/ant-design/icons-6.2.5 at txlyre/3x-ui from mirror

3 hari lalu

txlyre synced commits to dependabot/npm_and_yarn/frontend/ant-design/icons-6.2.5 at txlyre/3x-ui from mirror

  • 2f7805a7df build(deps): bump @ant-design/icons from 6.2.3 to 6.2.5 in /frontend Bumps [@ant-design/icons](https://github.com/ant-design/ant-design-icons) from 6.2.3 to 6.2.5. - [Commits](https://github.com/ant-design/ant-design-icons/commits) --- updated-dependencies: - dependency-name: "@ant-design/icons" dependency-version: 6.2.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]>
  • a07b68894c docs(api): document clients bulkAttach endpoint
  • 9e005ffcf9 feat(inbounds): restore "Set Cert from Panel" / Clear buttons in TLS certs Bring back the per-certificate buttons in the inbound TLS section (File Path mode): "Set Cert from Panel" fetches the panel's own webCertFile/webKeyFile via /panel/setting/all and fills the cert's certificateFile/keyFile, warning when no panel cert is configured; "Clear" empties both paths. Reuses the existing pages.inbounds.setDefaultCert label and adds a setDefaultCertEmpty warning string.
  • 486ac9c28d feat(inbounds): expose Vision testseed field with sensible default Add a "Vision testseed" form item to the inbound modal for TCP + TLS/reality inbounds, normalized to positive integers and defaulting to [900,500,900,256]. Apply the same default in the outbound form adapter when no valid saved seed is present. Replace the http/mixed snapshot assertions in inbound-defaults with explicit field checks so generated credentials don't break the snapshots.
  • 1a096d72f1 feat(inbounds): bulk-attach & assign-group client actions + form defaults - Bulk-attach an inbound's clients onto other inbounds (same identity, shared traffic): new ClientService.BulkAttach + POST /clients/bulkAttach, an inbound row action, and AttachClientsModal. - Assign all of an inbound's clients to a group from the inbound page, reusing /clients/bulkAssignGroup and the existing BulkAssignGroupModal. - Default a random user/pass account for new Mixed and HTTP inbounds instead of an empty accounts list. - Capitalize the inbound Security toggle labels (None/TLS/Reality).
  • Lihat perbandingan dari komit ini 10 »

4 hari lalu