diff --git a/frontend/src/lib/xray/inbound-link.ts b/frontend/src/lib/xray/inbound-link.ts index 28006ad5a..8b8dc01e6 100644 --- a/frontend/src/lib/xray/inbound-link.ts +++ b/frontend/src/lib/xray/inbound-link.ts @@ -1387,11 +1387,8 @@ export function preferPublicHost(browserHost: string, publicHost: string): strin return publicHost && isLoopbackHost(browserHost) ? publicHost : browserHost; } -// Returns the client array for protocols that have one. SS returns its -// clients only in 2022-blake3 multi-user mode (matches the legacy -// `this.clients` getter, which used isSSMultiUser to gate). Returns null -// for SS single-user, http, mixed, tunnel, wireguard, hysteria2-without- -// clients, and any protocol without a clients array. +// Returns the client array for protocols that have one; null for http, mixed, +// tunnel, wireguard, hysteria2-without-clients, and any protocol without one. type ClientShape = { id?: string; uuid?: string; diff --git a/frontend/src/lib/xray/protocol-capabilities.ts b/frontend/src/lib/xray/protocol-capabilities.ts index 68d086010..3d06a89d6 100644 --- a/frontend/src/lib/xray/protocol-capabilities.ts +++ b/frontend/src/lib/xray/protocol-capabilities.ts @@ -1,6 +1,6 @@ // Pure-function ports of the legacy Inbound class capability predicates // (canEnableTls, canEnableReality, canEnableTlsFlow, canEnableStream, -// canEnableVisionSeed, isSS2022, isSSMultiUser). Each accepts the minimal +// canEnableVisionSeed, isSS2022). Each accepts the minimal // slice of an InboundFormValues it needs, so the same predicate can be // called against a partial-row, a full form value, or a hand-built test // fixture without the caller projecting a whole object. @@ -21,7 +21,6 @@ const STREAM_PROTOCOLS = [ ]; const VISION_FLOW = 'xtls-rprx-vision'; const SS_2022_PREFIX = '2022'; -const SS_BLAKE3_CHACHA20 = '2022-blake3-chacha20-poly1305'; export interface CapabilityProtocolSlice { protocol: string; @@ -103,15 +102,6 @@ export function canEnableVisionSeed(values: CapabilityVlessSlice): boolean { return clients.some((c) => c?.flow === VISION_FLOW); } -// Why: legacy returns true on non-SS protocols too (the method getter -// resolves to "" and "" !== blake3-chacha20-poly1305). Preserved for -// parity with the legacy class; in practice the callers all narrow on -// protocol === shadowsocks before checking. -export function isSSMultiUser(values: CapabilityShadowsocksSlice): boolean { - const method = values.protocol === 'shadowsocks' ? (values.settings?.method ?? '') : ''; - return method !== SS_BLAKE3_CHACHA20; -} - export function isSS2022(values: CapabilityShadowsocksSlice): boolean { const method = values.protocol === 'shadowsocks' ? (values.settings?.method ?? '') : ''; return method.substring(0, 4) === SS_2022_PREFIX; diff --git a/frontend/src/pages/inbounds/InboundsPage.tsx b/frontend/src/pages/inbounds/InboundsPage.tsx index 13683f40d..b0f1da7d9 100644 --- a/frontend/src/pages/inbounds/InboundsPage.tsx +++ b/frontend/src/pages/inbounds/InboundsPage.tsx @@ -51,7 +51,6 @@ import { LazyMount } from '@/components/utility'; const InboundFormModal = lazy(() => import('./form/InboundFormModal')); const CloneInboundModal = lazy(() => import('./CloneInboundModal')); const InboundInfoModal = lazy(() => import('./info/InboundInfoModal')); -const QrCodeModal = lazy(() => import('./qr/QrCodeModal')); const AttachClientsModal = lazy(() => import('./clients/AttachClientsModal')); const AttachExistingClientsModal = lazy(() => import('./clients/AttachExistingClientsModal')); const DetachClientsModal = lazy(() => import('./clients/DetachClientsModal')); @@ -60,7 +59,6 @@ const AddClientsToGroupModal = lazy(() => import('./clients/AddClientsToGroupMod type RowAction = | 'edit' | 'showInfo' - | 'qrcode' | 'export' | 'subs' | 'clipboard' @@ -167,9 +165,6 @@ export default function InboundsPage() { const [infoDbInbound, setInfoDbInbound] = useState(null); const [infoClientIndex, setInfoClientIndex] = useState(0); - const [qrOpen, setQrOpen] = useState(false); - const [qrDbInbound, setQrDbInbound] = useState(null); - const [attachOpen, setAttachOpen] = useState(false); const [attachSource, setAttachSource] = useState(null); const [attachExistingOpen, setAttachExistingOpen] = useState(false); @@ -213,7 +208,6 @@ export default function InboundsPage() { () => hostOverrideFor(infoDbInbound), [infoDbInbound, hostOverrideFor], ); - const qrNodeAddress = useMemo(() => hostOverrideFor(qrDbInbound), [qrDbInbound, hostOverrideFor]); const openText = useCallback( (opts: { @@ -637,7 +631,6 @@ export default function InboundsPage() { const hydratingKeys: RowAction[] = [ 'edit', 'showInfo', - 'qrcode', 'export', 'subs', 'clipboard', @@ -659,10 +652,6 @@ export default function InboundsPage() { setInfoClientIndex(findClientIndex(target, null)); setInfoOpen(true); break; - case 'qrcode': - setQrDbInbound(checkFallback(target)); - setQrOpen(true); - break; case 'export': exportInboundLinks(target); break; @@ -847,17 +836,6 @@ export default function InboundsPage() { nodeAddress={infoNodeAddress} /> - - setQrOpen(false)} - dbInbound={qrDbInbound} - client={null} - nodeAddress={qrNodeAddress} - subSettings={subSettings} - hosts={hosts} - /> - )} - - {dbInbound.isSS && !inbound.isSSMultiUser && links.length > 0 && ( - <> - {t('pages.inbounds.copyLink')} - {links.map((link, idx) => ( -
-
- {link.remark || `Link ${idx + 1}`} - -
- {link.link} -
- ))} - - )} ); diff --git a/frontend/src/pages/inbounds/info/helpers.ts b/frontend/src/pages/inbounds/info/helpers.ts index d98bf461c..e8b8db0b2 100644 --- a/frontend/src/pages/inbounds/info/helpers.ts +++ b/frontend/src/pages/inbounds/info/helpers.ts @@ -2,11 +2,7 @@ import { getMessage } from '@/utils/messageBus'; import { ColorUtils, ClipboardManager, FileManager } from '@/utils'; import { Protocols } from '@/schemas/primitives'; import { coerceInboundJsonField } from '@/models/dbinbound'; -import { - canEnableTlsFlow, - isSS2022 as isSS2022Helper, - isSSMultiUser as isSSMultiUserHelper, -} from '@/lib/xray/protocol-capabilities'; +import { canEnableTlsFlow, isSS2022 as isSS2022Helper } from '@/lib/xray/protocol-capabilities'; import type { ClientSetting, ClientStats, DBInboundLike, InboundInfo } from './types'; @@ -123,10 +119,6 @@ export function buildInboundInfo(dbInbound: DBInboundLike): InboundInfo { isHttpupgrade: network === 'httpupgrade', isXHTTP: network === 'xhttp', isGrpc: network === 'grpc', - isSSMultiUser: isSSMultiUserHelper({ - protocol: dbInbound.protocol, - settings: settings as { method?: string }, - }), isSS2022: isSS2022Helper({ protocol: dbInbound.protocol, settings: settings as { method?: string }, diff --git a/frontend/src/pages/inbounds/info/types.ts b/frontend/src/pages/inbounds/info/types.ts index 77a7c907d..779bafeb9 100644 --- a/frontend/src/pages/inbounds/info/types.ts +++ b/frontend/src/pages/inbounds/info/types.ts @@ -36,7 +36,6 @@ export interface InboundInfo { isHttpupgrade: boolean; isXHTTP: boolean; isGrpc: boolean; - isSSMultiUser: boolean; isSS2022: boolean; isVlessTlsFlow: boolean; host: string | null; diff --git a/frontend/src/pages/inbounds/list/RowActions.tsx b/frontend/src/pages/inbounds/list/RowActions.tsx index 4d0b93fb6..1529782e6 100644 --- a/frontend/src/pages/inbounds/list/RowActions.tsx +++ b/frontend/src/pages/inbounds/list/RowActions.tsx @@ -3,7 +3,6 @@ import { Button, Dropdown, type MenuProps } from 'antd'; import { MoreOutlined, EditOutlined, - QrcodeOutlined, CopyOutlined, ExportOutlined, RetweetOutlined, @@ -15,7 +14,7 @@ import { UsergroupDeleteOutlined, } from '@ant-design/icons'; -import { isInboundMultiUser, showQrCodeMenu } from './helpers'; +import { isInboundMultiUser } from './helpers'; import type { DBInboundRecord, RowAction } from './types'; interface RowActionsMenuProps { @@ -43,9 +42,6 @@ export function buildRowActionsMenu({ if (isMobile) { items.push({ key: 'edit', icon: , label: t('edit') }); } - if (showQrCodeMenu(record)) { - items.push({ key: 'qrcode', icon: , label: t('qrCode') }); - } if (isInboundMultiUser(record)) { items.push({ key: 'export', icon: , label: t('pages.inbounds.export') }); if (subEnable) { diff --git a/frontend/src/pages/inbounds/list/helpers.ts b/frontend/src/pages/inbounds/list/helpers.ts index 785c74733..525cac60c 100644 --- a/frontend/src/pages/inbounds/list/helpers.ts +++ b/frontend/src/pages/inbounds/list/helpers.ts @@ -1,8 +1,7 @@ -import { isSSMultiUser } from '@/lib/xray/protocol-capabilities'; import { coerceInboundJsonField } from '@/models/dbinbound'; import type { HostRecord } from '@/schemas/api/host'; -import type { DBInboundRecord, StreamHints } from './types'; +import type { StreamHints } from './types'; export function readStreamHints(streamSettings: unknown): StreamHints { const stream = coerceInboundJsonField(streamSettings) as { network?: string; security?: string }; @@ -82,11 +81,12 @@ export function readSettings(settings: unknown): { }; } -export function isInboundMultiUser(record: { protocol: string; settings: unknown }): boolean { +export function isInboundMultiUser(record: { protocol: string }): boolean { switch (record.protocol) { case 'vmess': case 'vless': case 'trojan': + case 'shadowsocks': case 'hysteria': case 'mtproto': case 'wireguard': @@ -94,20 +94,11 @@ export function isInboundMultiUser(record: { protocol: string; settings: unknown case 'tuic': case 'masque': return true; - case 'shadowsocks': - return isSSMultiUser({ protocol: 'shadowsocks', settings: readSettings(record.settings) }); default: return false; } } -export function showQrCodeMenu(dbInbound: DBInboundRecord): boolean { - if (dbInbound.isSS) { - return !isSSMultiUser({ protocol: 'shadowsocks', settings: readSettings(dbInbound.settings) }); - } - return false; -} - /** Max host remarks shown inline before truncating with "+N". */ export const HOST_REMARK_VISIBLE_LIMIT = 2; diff --git a/frontend/src/pages/inbounds/list/types.ts b/frontend/src/pages/inbounds/list/types.ts index 49c759175..ab76e334e 100644 --- a/frontend/src/pages/inbounds/list/types.ts +++ b/frontend/src/pages/inbounds/list/types.ts @@ -55,7 +55,6 @@ export interface InboundSpeedEntry { export type RowAction = | 'edit' | 'showInfo' - | 'qrcode' | 'export' | 'subs' | 'clipboard' diff --git a/frontend/src/pages/inbounds/qr/QrCodeModal.tsx b/frontend/src/pages/inbounds/qr/QrCodeModal.tsx deleted file mode 100644 index 3375a699e..000000000 --- a/frontend/src/pages/inbounds/qr/QrCodeModal.tsx +++ /dev/null @@ -1,266 +0,0 @@ -import { useMemo, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { Collapse, Modal } from 'antd'; -import type { CollapseProps } from 'antd'; - -import { Protocols } from '@/schemas/primitives'; -import { - genAllLinks, - genAmneziaWGPeerConfigs, - genAmneziaWGPeerLinks, - genWireguardPeerConfigs, - genWireguardPeerLinks, - isPostQuantumLink, - preferPublicHost, -} from '@/lib/xray/inbound-link'; -import { inboundFromDb, type DbInboundLike } from '@/lib/xray/inbound-from-db'; -import { withHostEndpoints } from '@/lib/hosts/host-link'; -import type { HostRecord } from '@/schemas/api/host'; -import QrPanel from './QrPanel'; -import { peerConfFileName } from '../info/helpers'; -import type { SubSettings } from '../useInbounds'; - -interface ClientSetting { - email?: string; - subId?: string; - [k: string]: unknown; -} - -interface QrCodeModalProps { - open: boolean; - onClose: () => void; - dbInbound: (DbInboundLike & { id: number; remark?: string }) | null; - client?: ClientSetting | null; - nodeAddress?: string; - subSettings?: SubSettings; - hosts?: HostRecord[]; -} - -interface QrItem { - key: string; - header: string; - value: string; - downloadName?: string; - showQr?: boolean; -} - -const EMPTY_HOSTS: HostRecord[] = []; - -export default function QrCodeModal({ - open, - onClose, - dbInbound, - client = null, - nodeAddress = '', - subSettings, - hosts = EMPTY_HOSTS, -}: QrCodeModalProps) { - const { t } = useTranslation(); - const [links, setLinks] = useState<{ remark?: string; link: string }[]>([]); - const [wireguardConfigs, setWireguardConfigs] = useState([]); - const [wireguardLinks, setWireguardLinks] = useState([]); - const [amneziawgConfigs, setAmneziawgConfigs] = useState([]); - const [amneziawgLinks, setAmneziawgLinks] = useState([]); - const [subLink, setSubLink] = useState(''); - const [subJsonLink, setSubJsonLink] = useState(''); - const [activeKey, setActiveKey] = useState([]); - - // Building the links is a pure function of the props, so it runs during - // render; an effect would paint the previous inbound's QR first. - const [syncedProps, setSyncedProps] = useState<{ - dbInbound: typeof dbInbound; - client: typeof client; - nodeAddress: typeof nodeAddress; - subSettings: typeof subSettings; - hosts: typeof hosts; - } | null>(null); - if ( - open && - dbInbound && - (syncedProps === null || - syncedProps.dbInbound !== dbInbound || - syncedProps.client !== client || - syncedProps.nodeAddress !== nodeAddress || - syncedProps.subSettings !== subSettings || - syncedProps.hosts !== hosts) - ) { - setSyncedProps({ dbInbound, client, nodeAddress, subSettings, hosts }); - const fallbackHostname = preferPublicHost( - window.location.hostname, - subSettings?.publicHost ?? '', - ); - const inbound = withHostEndpoints( - inboundFromDb(dbInbound), - dbInbound.id, - hosts, - nodeAddress, - fallbackHostname, - ); - if (inbound.protocol === Protocols.WIREGUARD) { - const peerRemark = client?.email - ? `${dbInbound.remark}-${client.email}` - : dbInbound.remark || ''; - setWireguardConfigs( - genWireguardPeerConfigs({ - inbound, - remark: peerRemark, - hostOverride: nodeAddress, - fallbackHostname, - }), - ); - setWireguardLinks( - genWireguardPeerLinks({ - inbound, - remark: peerRemark, - hostOverride: nodeAddress, - fallbackHostname, - }), - ); - setAmneziawgConfigs([]); - setAmneziawgLinks([]); - setLinks([]); - } else if (inbound.protocol === Protocols.AMNEZIAWG) { - const peerRemark = client?.email - ? `${dbInbound.remark}-${client.email}` - : dbInbound.remark || ''; - setAmneziawgConfigs( - genAmneziaWGPeerConfigs({ - inbound, - remark: peerRemark, - hostOverride: nodeAddress, - fallbackHostname, - }), - ); - setAmneziawgLinks( - genAmneziaWGPeerLinks({ - inbound, - remark: peerRemark, - hostOverride: nodeAddress, - fallbackHostname, - }), - ); - setWireguardConfigs([]); - setWireguardLinks([]); - setLinks([]); - } else { - setLinks( - genAllLinks({ - inbound, - remark: dbInbound.remark || '', - client: client ?? {}, - hostOverride: nodeAddress, - fallbackHostname, - }), - ); - setWireguardConfigs([]); - setWireguardLinks([]); - setAmneziawgConfigs([]); - setAmneziawgLinks([]); - } - - const subId = client?.subId; - let nextSub = ''; - let nextSubJson = ''; - if (subSettings?.enable && subId) { - nextSub = (subSettings.subURI || '') + subId; - nextSubJson = subSettings.subJsonEnable ? (subSettings.subJsonURI || '') + subId : ''; - } - setSubLink(nextSub); - setSubJsonLink(nextSubJson); - } - - const qrItems = useMemo(() => { - const items: QrItem[] = []; - if (subLink) { - items.push({ key: 'sub', header: t('subscription.title'), value: subLink }); - } - if (subJsonLink) { - items.push({ - key: 'sub-json', - header: `${t('subscription.title')} (JSON)`, - value: subJsonLink, - }); - } - links.forEach((link, idx) => { - items.push({ key: `l${idx}`, header: link.remark || `Link ${idx + 1}`, value: link.link }); - }); - const pushTunnelPeers = (prefix: string, configs: string[][], peerLinks: string[][]) => { - configs.forEach((peerConfigs, idx) => { - peerConfigs.forEach((cfg, j) => { - const multi = peerConfigs.length > 1 ? ` #${j + 1}` : ''; - items.push({ - key: `${prefix}c${idx}-${j}`, - header: `Peer ${idx + 1} config${multi}`, - value: cfg, - downloadName: peerConfFileName(idx, j, peerConfigs.length), - }); - const link = peerLinks[idx]?.[j]; - if (link) { - items.push({ - key: `${prefix}l${idx}-${j}`, - header: `Peer ${idx + 1} link${multi}`, - value: link, - showQr: false, - }); - } - }); - }); - }; - pushTunnelPeers('w', wireguardConfigs, wireguardLinks); - pushTunnelPeers('a', amneziawgConfigs, amneziawgLinks); - return items; - }, [ - subLink, - subJsonLink, - links, - wireguardConfigs, - wireguardLinks, - amneziawgConfigs, - amneziawgLinks, - t, - ]); - - const collapseItems: CollapseProps['items'] = useMemo( - () => - qrItems.map((item) => ({ - key: item.key, - label: item.header, - children: ( - - ), - })), - [qrItems], - ); - - const firstKey = open && qrItems.length > 0 ? qrItems[0].key : null; - const [syncedFirstKey, setSyncedFirstKey] = useState(null); - if (firstKey !== syncedFirstKey) { - setSyncedFirstKey(firstKey); - setActiveKey(firstKey ? [firstKey] : []); - } - - return ( - - {dbInbound && collapseItems && collapseItems.length > 0 && ( - setActiveKey(typeof keys === 'string' ? [keys] : (keys as string[]))} - items={collapseItems} - /> - )} - - ); -} diff --git a/frontend/src/pages/inbounds/qr/index.ts b/frontend/src/pages/inbounds/qr/index.ts index 03515b0be..d71ae934b 100644 --- a/frontend/src/pages/inbounds/qr/index.ts +++ b/frontend/src/pages/inbounds/qr/index.ts @@ -1,2 +1 @@ export { default as QrPanel } from './QrPanel'; -export { default as QrCodeModal } from './QrCodeModal'; diff --git a/frontend/src/pages/inbounds/useInbounds.ts b/frontend/src/pages/inbounds/useInbounds.ts index 5e8caa91c..b69de541a 100644 --- a/frontend/src/pages/inbounds/useInbounds.ts +++ b/frontend/src/pages/inbounds/useInbounds.ts @@ -6,7 +6,6 @@ import { parseMsg } from '@/utils/zodValidate'; import { DBInbound, coerceInboundJsonField } from '@/models/dbinbound'; import type { ClientStats, DBInboundInit } from '@/models/dbinbound'; import { Protocols } from '@/schemas/primitives'; -import { isSSMultiUser } from '@/lib/xray/protocol-capabilities'; import { setDatepicker } from '@/hooks/useDatepicker'; import { keys } from '@/api/queryKeys'; import { SlimInboundListSchema, LastOnlineMapSchema, InboundDetailSchema } from '@/schemas/inbound'; @@ -351,10 +350,8 @@ export function useInbounds() { const protocol = dbInbound.protocol; if (!TRACKED_PROTOCOLS.includes(protocol)) continue; const settings = coerceInboundJsonField(dbInbound.settings) as { - method?: string; clients?: Array<{ email?: string; enable?: boolean; comment?: string }>; }; - if (protocol === Protocols.SHADOWSOCKS && !isSSMultiUser({ protocol, settings })) continue; counts[dbInbound.id] = rollupClients(dbInbound, { clients: settings.clients }); } return counts; diff --git a/frontend/src/test/__snapshots__/protocol-capabilities.test.ts.snap b/frontend/src/test/__snapshots__/protocol-capabilities.test.ts.snap index d410e1c25..b0f6249a1 100644 --- a/frontend/src/test/__snapshots__/protocol-capabilities.test.ts.snap +++ b/frontend/src/test/__snapshots__/protocol-capabilities.test.ts.snap @@ -8,7 +8,6 @@ exports[`protocol capability predicates > http-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -20,7 +19,6 @@ exports[`protocol capability predicates > http-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -32,7 +30,6 @@ exports[`protocol capability predicates > http-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -44,7 +41,6 @@ exports[`protocol capability predicates > http-basic :: httpupgrade/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -56,7 +52,6 @@ exports[`protocol capability predicates > http-basic :: httpupgrade/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -68,7 +63,6 @@ exports[`protocol capability predicates > http-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -80,7 +74,6 @@ exports[`protocol capability predicates > http-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -92,7 +85,6 @@ exports[`protocol capability predicates > http-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -104,7 +96,6 @@ exports[`protocol capability predicates > http-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -116,7 +107,6 @@ exports[`protocol capability predicates > http-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -128,7 +118,6 @@ exports[`protocol capability predicates > http-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -140,7 +129,6 @@ exports[`protocol capability predicates > http-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -152,7 +140,6 @@ exports[`protocol capability predicates > http-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -164,7 +151,6 @@ exports[`protocol capability predicates > http-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -176,7 +162,6 @@ exports[`protocol capability predicates > hysteria-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -188,7 +173,6 @@ exports[`protocol capability predicates > hysteria-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -200,7 +184,6 @@ exports[`protocol capability predicates > hysteria-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -212,7 +195,6 @@ exports[`protocol capability predicates > hysteria-basic :: httpupgrade/none 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -224,7 +206,6 @@ exports[`protocol capability predicates > hysteria-basic :: httpupgrade/tls 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -236,7 +217,6 @@ exports[`protocol capability predicates > hysteria-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -248,7 +228,6 @@ exports[`protocol capability predicates > hysteria-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -260,7 +239,6 @@ exports[`protocol capability predicates > hysteria-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -272,7 +250,6 @@ exports[`protocol capability predicates > hysteria-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -284,7 +261,6 @@ exports[`protocol capability predicates > hysteria-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -296,7 +272,6 @@ exports[`protocol capability predicates > hysteria-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -308,7 +283,6 @@ exports[`protocol capability predicates > hysteria-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -320,7 +294,6 @@ exports[`protocol capability predicates > hysteria-basic :: xhttp/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -332,7 +305,6 @@ exports[`protocol capability predicates > hysteria-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -344,7 +316,6 @@ exports[`protocol capability predicates > mixed-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -356,7 +327,6 @@ exports[`protocol capability predicates > mixed-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -368,7 +338,6 @@ exports[`protocol capability predicates > mixed-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -380,7 +349,6 @@ exports[`protocol capability predicates > mixed-basic :: httpupgrade/none 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -392,7 +360,6 @@ exports[`protocol capability predicates > mixed-basic :: httpupgrade/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -404,7 +371,6 @@ exports[`protocol capability predicates > mixed-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -416,7 +382,6 @@ exports[`protocol capability predicates > mixed-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -428,7 +393,6 @@ exports[`protocol capability predicates > mixed-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -440,7 +404,6 @@ exports[`protocol capability predicates > mixed-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -452,7 +415,6 @@ exports[`protocol capability predicates > mixed-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -464,7 +426,6 @@ exports[`protocol capability predicates > mixed-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -476,7 +437,6 @@ exports[`protocol capability predicates > mixed-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -488,7 +448,6 @@ exports[`protocol capability predicates > mixed-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -500,7 +459,6 @@ exports[`protocol capability predicates > mixed-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -512,7 +470,6 @@ exports[`protocol capability predicates > mtproto-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -524,7 +481,6 @@ exports[`protocol capability predicates > mtproto-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -536,7 +492,6 @@ exports[`protocol capability predicates > mtproto-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -548,7 +503,6 @@ exports[`protocol capability predicates > mtproto-basic :: httpupgrade/none 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -560,7 +514,6 @@ exports[`protocol capability predicates > mtproto-basic :: httpupgrade/tls 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -572,7 +525,6 @@ exports[`protocol capability predicates > mtproto-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -584,7 +536,6 @@ exports[`protocol capability predicates > mtproto-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -596,7 +547,6 @@ exports[`protocol capability predicates > mtproto-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -608,7 +558,6 @@ exports[`protocol capability predicates > mtproto-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -620,7 +569,6 @@ exports[`protocol capability predicates > mtproto-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -632,7 +580,6 @@ exports[`protocol capability predicates > mtproto-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -644,7 +591,6 @@ exports[`protocol capability predicates > mtproto-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -656,7 +602,6 @@ exports[`protocol capability predicates > mtproto-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -668,7 +613,6 @@ exports[`protocol capability predicates > mtproto-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -680,7 +624,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: grpc/none 1 "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -692,7 +635,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: grpc/realit "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -704,7 +646,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: grpc/tls 1` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -716,7 +657,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: httpupgrade "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -728,7 +668,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: httpupgrade "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -740,7 +679,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: kcp/none 1` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -752,7 +690,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: tcp/none 1` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -764,7 +701,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: tcp/reality "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -776,7 +712,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: tcp/tls 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -788,7 +723,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: ws/none 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -800,7 +734,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: ws/tls 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -812,7 +745,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: xhttp/none "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -824,7 +756,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: xhttp/reali "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -836,7 +767,6 @@ exports[`protocol capability predicates > mtproto-domain-fronting :: xhttp/tls 1 "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -848,7 +778,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -860,7 +789,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: grpc/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -872,7 +800,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -884,7 +811,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: httpupgrade/none 1 "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -896,7 +822,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: httpupgrade/tls 1` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -908,7 +833,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -920,7 +844,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -932,7 +855,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: tcp/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -944,7 +866,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -956,7 +877,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -968,7 +888,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -980,7 +899,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -992,7 +910,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: xhttp/reality 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -1004,7 +921,6 @@ exports[`protocol capability predicates > shadowsocks-2022 :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": true, - "isSSMultiUser": true, } `; @@ -1016,7 +932,6 @@ exports[`protocol capability predicates > trojan-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1028,7 +943,6 @@ exports[`protocol capability predicates > trojan-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1040,7 +954,6 @@ exports[`protocol capability predicates > trojan-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1052,7 +965,6 @@ exports[`protocol capability predicates > trojan-basic :: httpupgrade/none 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1064,7 +976,6 @@ exports[`protocol capability predicates > trojan-basic :: httpupgrade/tls 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1076,7 +987,6 @@ exports[`protocol capability predicates > trojan-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1088,7 +998,6 @@ exports[`protocol capability predicates > trojan-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1100,7 +1009,6 @@ exports[`protocol capability predicates > trojan-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1112,7 +1020,6 @@ exports[`protocol capability predicates > trojan-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1124,7 +1031,6 @@ exports[`protocol capability predicates > trojan-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1136,7 +1042,6 @@ exports[`protocol capability predicates > trojan-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1148,7 +1053,6 @@ exports[`protocol capability predicates > trojan-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1160,7 +1064,6 @@ exports[`protocol capability predicates > trojan-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1172,7 +1075,6 @@ exports[`protocol capability predicates > trojan-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1184,7 +1086,6 @@ exports[`protocol capability predicates > tunnel-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1196,7 +1097,6 @@ exports[`protocol capability predicates > tunnel-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1208,7 +1108,6 @@ exports[`protocol capability predicates > tunnel-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1220,7 +1119,6 @@ exports[`protocol capability predicates > tunnel-basic :: httpupgrade/none 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1232,7 +1130,6 @@ exports[`protocol capability predicates > tunnel-basic :: httpupgrade/tls 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1244,7 +1141,6 @@ exports[`protocol capability predicates > tunnel-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1256,7 +1152,6 @@ exports[`protocol capability predicates > tunnel-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1268,7 +1163,6 @@ exports[`protocol capability predicates > tunnel-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1280,7 +1174,6 @@ exports[`protocol capability predicates > tunnel-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1292,7 +1185,6 @@ exports[`protocol capability predicates > tunnel-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1304,7 +1196,6 @@ exports[`protocol capability predicates > tunnel-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1316,7 +1207,6 @@ exports[`protocol capability predicates > tunnel-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1328,7 +1218,6 @@ exports[`protocol capability predicates > tunnel-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1340,7 +1229,6 @@ exports[`protocol capability predicates > tunnel-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1352,7 +1240,6 @@ exports[`protocol capability predicates > vless-tcp-none :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1364,7 +1251,6 @@ exports[`protocol capability predicates > vless-tcp-none :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1376,7 +1262,6 @@ exports[`protocol capability predicates > vless-tcp-none :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1388,7 +1273,6 @@ exports[`protocol capability predicates > vless-tcp-none :: httpupgrade/none 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1400,7 +1284,6 @@ exports[`protocol capability predicates > vless-tcp-none :: httpupgrade/tls 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1412,7 +1295,6 @@ exports[`protocol capability predicates > vless-tcp-none :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1424,7 +1306,6 @@ exports[`protocol capability predicates > vless-tcp-none :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1436,7 +1317,6 @@ exports[`protocol capability predicates > vless-tcp-none :: tcp/reality 1`] = ` "canEnableTlsFlow": true, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1448,7 +1328,6 @@ exports[`protocol capability predicates > vless-tcp-none :: tcp/tls 1`] = ` "canEnableTlsFlow": true, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1460,7 +1339,6 @@ exports[`protocol capability predicates > vless-tcp-none :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1472,7 +1350,6 @@ exports[`protocol capability predicates > vless-tcp-none :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1484,7 +1361,6 @@ exports[`protocol capability predicates > vless-tcp-none :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1496,7 +1372,6 @@ exports[`protocol capability predicates > vless-tcp-none :: xhttp/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1508,7 +1383,6 @@ exports[`protocol capability predicates > vless-tcp-none :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1520,7 +1394,6 @@ exports[`protocol capability predicates > vmess-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1532,7 +1405,6 @@ exports[`protocol capability predicates > vmess-basic :: grpc/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1544,7 +1416,6 @@ exports[`protocol capability predicates > vmess-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1556,7 +1427,6 @@ exports[`protocol capability predicates > vmess-basic :: httpupgrade/none 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1568,7 +1438,6 @@ exports[`protocol capability predicates > vmess-basic :: httpupgrade/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1580,7 +1449,6 @@ exports[`protocol capability predicates > vmess-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1592,7 +1460,6 @@ exports[`protocol capability predicates > vmess-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1604,7 +1471,6 @@ exports[`protocol capability predicates > vmess-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1616,7 +1482,6 @@ exports[`protocol capability predicates > vmess-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1628,7 +1493,6 @@ exports[`protocol capability predicates > vmess-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1640,7 +1504,6 @@ exports[`protocol capability predicates > vmess-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1652,7 +1515,6 @@ exports[`protocol capability predicates > vmess-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1664,7 +1526,6 @@ exports[`protocol capability predicates > vmess-basic :: xhttp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1676,7 +1537,6 @@ exports[`protocol capability predicates > vmess-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1688,7 +1548,6 @@ exports[`protocol capability predicates > wireguard-basic :: grpc/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1700,7 +1559,6 @@ exports[`protocol capability predicates > wireguard-basic :: grpc/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1712,7 +1570,6 @@ exports[`protocol capability predicates > wireguard-basic :: grpc/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1724,7 +1581,6 @@ exports[`protocol capability predicates > wireguard-basic :: httpupgrade/none 1` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1736,7 +1592,6 @@ exports[`protocol capability predicates > wireguard-basic :: httpupgrade/tls 1`] "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1748,7 +1603,6 @@ exports[`protocol capability predicates > wireguard-basic :: kcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1760,7 +1614,6 @@ exports[`protocol capability predicates > wireguard-basic :: tcp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1772,7 +1625,6 @@ exports[`protocol capability predicates > wireguard-basic :: tcp/reality 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1784,7 +1636,6 @@ exports[`protocol capability predicates > wireguard-basic :: tcp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1796,7 +1647,6 @@ exports[`protocol capability predicates > wireguard-basic :: ws/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1808,7 +1658,6 @@ exports[`protocol capability predicates > wireguard-basic :: ws/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1820,7 +1669,6 @@ exports[`protocol capability predicates > wireguard-basic :: xhttp/none 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1832,7 +1680,6 @@ exports[`protocol capability predicates > wireguard-basic :: xhttp/reality 1`] = "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; @@ -1844,6 +1691,5 @@ exports[`protocol capability predicates > wireguard-basic :: xhttp/tls 1`] = ` "canEnableTlsFlow": false, "canEnableVisionSeed": false, "isSS2022": false, - "isSSMultiUser": true, } `; diff --git a/frontend/src/test/inbound-from-db.test.ts b/frontend/src/test/inbound-from-db.test.ts index 8f4e67f2d..aa9bf53cd 100644 --- a/frontend/src/test/inbound-from-db.test.ts +++ b/frontend/src/test/inbound-from-db.test.ts @@ -8,7 +8,7 @@ import { genWireguardLinks, getInboundClients, } from '@/lib/xray/inbound-link'; -import { canEnableTlsFlow, isSS2022, isSSMultiUser } from '@/lib/xray/protocol-capabilities'; +import { canEnableTlsFlow, isSS2022 } from '@/lib/xray/protocol-capabilities'; const FALLBACK_HOST = 'panel.example.test'; @@ -171,24 +171,6 @@ describe('inboundFromDb', () => { }); describe('protocol-capability helpers with raw coerced shapes', () => { - it('isSSMultiUser returns true for legacy SS methods', () => { - expect(isSSMultiUser({ protocol: 'shadowsocks', settings: { method: 'aes-256-gcm' } })).toBe( - true, - ); - expect( - isSSMultiUser({ protocol: 'shadowsocks', settings: { method: '2022-blake3-aes-128-gcm' } }), - ).toBe(true); - }); - - it('isSSMultiUser returns false for single-user blake3-chacha20 method', () => { - expect( - isSSMultiUser({ - protocol: 'shadowsocks', - settings: { method: '2022-blake3-chacha20-poly1305' }, - }), - ).toBe(false); - }); - it('isSS2022 detects 2022-blake3 family', () => { expect( isSS2022({ protocol: 'shadowsocks', settings: { method: '2022-blake3-aes-128-gcm' } }), diff --git a/frontend/src/test/protocol-capabilities.test.ts b/frontend/src/test/protocol-capabilities.test.ts index c2ecf3d13..0174714a6 100644 --- a/frontend/src/test/protocol-capabilities.test.ts +++ b/frontend/src/test/protocol-capabilities.test.ts @@ -8,7 +8,6 @@ import { canEnableStream, canEnableVisionSeed, isSS2022, - isSSMultiUser, } from '@/lib/xray/protocol-capabilities'; // Pure-function tests for the capability predicates. Each fixture × stream @@ -67,7 +66,6 @@ describe('protocol capability predicates', () => { canEnableStream: canEnableStream(values), canEnableVisionSeed: canEnableVisionSeed(values), isSS2022: isSS2022(values), - isSSMultiUser: isSSMultiUser(values), }; expect(result).toMatchSnapshot(); });