From d9ec23c442bfb3b0f93162e6e453eec00dfd9188 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Wed, 27 May 2026 04:23:09 +0200 Subject: [PATCH] feat(settings): drop email leg from default remark model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the default remarkModel from "-ieo" to "-io" so a freshly installed panel composes share-link remarks from the inbound name + optional extra only, leaving out the client email. Existing panels keep whatever value they have saved — only fresh installs and fallback paths (parse failure, missing setting) pick up the new default. Touched everywhere the literal "-ieo" lived: the canonical default map, the two sub-package fallback constants, the four frontend defaults (model class, link generator, two inbound modals, useInbounds hook). Two snapshot tests regenerated and one obsolete "contains email" assertion in inbound-from-db.test.ts removed. To migrate an existing panel that wants the new behaviour, edit Settings → Remark Model and remove the email leg. --- frontend/src/lib/xray/inbound-link.ts | 10 +++++----- frontend/src/models/setting.ts | 2 +- frontend/src/pages/inbounds/InboundInfoModal.tsx | 6 +++--- frontend/src/pages/inbounds/QrCodeModal.tsx | 6 +++--- frontend/src/pages/inbounds/useInbounds.ts | 2 +- .../src/test/__snapshots__/inbound-link.test.ts.snap | 12 ++++++------ frontend/src/test/inbound-from-db.test.ts | 1 - sub/links.go | 2 +- sub/sub.go | 2 +- web/service/setting.go | 2 +- 10 files changed, 22 insertions(+), 23 deletions(-) diff --git a/frontend/src/lib/xray/inbound-link.ts b/frontend/src/lib/xray/inbound-link.ts index e7c8f92a..07089dd1 100644 --- a/frontend/src/lib/xray/inbound-link.ts +++ b/frontend/src/lib/xray/inbound-link.ts @@ -790,13 +790,13 @@ export interface GenAllLinksInput { // link when there are no external proxies. remarkModel is a 4-char // string: first char is the separator, remaining chars pick which // pieces to compose into the per-link remark — 'i' = inbound remark, -// 'e' = client email, 'o' = externalProxy remark. Defaults to '-ieo' +// 'e' = client email, 'o' = externalProxy remark. Defaults to '-io' // (dash-separated, inbound + email + proxy). export function genAllLinks(input: GenAllLinksInput): GenAllLinksEntry[] { const { inbound, remark = '', - remarkModel = '-ieo', + remarkModel = '-io', client, hostOverride = '', fallbackHostname, @@ -855,7 +855,7 @@ export function genInboundLinks(input: GenInboundLinksInput): string { const { inbound, remark = '', - remarkModel = '-ieo', + remarkModel = '-io', hostOverride = '', fallbackHostname, } = input; @@ -890,7 +890,7 @@ export interface GenWireguardFanoutInput { } export function genWireguardLinks(input: GenWireguardFanoutInput): string { - const { inbound, remark = '', remarkModel = '-ieo', hostOverride = '', fallbackHostname } = input; + const { inbound, remark = '', remarkModel = '-io', hostOverride = '', fallbackHostname } = input; if (inbound.protocol !== 'wireguard') return ''; const addr = resolveAddr(inbound, hostOverride, fallbackHostname); const sep = remarkModel.charAt(0); @@ -906,7 +906,7 @@ export function genWireguardLinks(input: GenWireguardFanoutInput): string { } export function genWireguardConfigs(input: GenWireguardFanoutInput): string { - const { inbound, remark = '', remarkModel = '-ieo', hostOverride = '', fallbackHostname } = input; + const { inbound, remark = '', remarkModel = '-io', hostOverride = '', fallbackHostname } = input; if (inbound.protocol !== 'wireguard') return ''; const addr = resolveAddr(inbound, hostOverride, fallbackHostname); const sep = remarkModel.charAt(0); diff --git a/frontend/src/models/setting.ts b/frontend/src/models/setting.ts index d4d09d91..7e09c315 100644 --- a/frontend/src/models/setting.ts +++ b/frontend/src/models/setting.ts @@ -12,7 +12,7 @@ export class AllSetting { pageSize = 25; expireDiff = 0; trafficDiff = 0; - remarkModel = '-ieo'; + remarkModel = '-io'; datepicker: 'gregorian' | 'jalalian' = 'gregorian'; tgBotEnable = false; tgBotToken = ''; diff --git a/frontend/src/pages/inbounds/InboundInfoModal.tsx b/frontend/src/pages/inbounds/InboundInfoModal.tsx index 823e2363..75431c57 100644 --- a/frontend/src/pages/inbounds/InboundInfoModal.tsx +++ b/frontend/src/pages/inbounds/InboundInfoModal.tsx @@ -280,7 +280,7 @@ export default function InboundInfoModal({ onClose, dbInbound, clientIndex = 0, - remarkModel = '-ieo', + remarkModel = '-io', expireDiff = 0, trafficDiff = 0, ipLimitEnable = false, @@ -369,7 +369,7 @@ export default function InboundInfoModal({ genWireguardConfigs({ inbound: inboundForLinks, remark: dbInbound.remark, - remarkModel: '-ieo', + remarkModel: '-io', hostOverride: nodeAddress, fallbackHostname, }).split('\r\n'), @@ -378,7 +378,7 @@ export default function InboundInfoModal({ genWireguardLinks({ inbound: inboundForLinks, remark: dbInbound.remark, - remarkModel: '-ieo', + remarkModel: '-io', hostOverride: nodeAddress, fallbackHostname, }).split('\r\n'), diff --git a/frontend/src/pages/inbounds/QrCodeModal.tsx b/frontend/src/pages/inbounds/QrCodeModal.tsx index 74d95462..edfb2e71 100644 --- a/frontend/src/pages/inbounds/QrCodeModal.tsx +++ b/frontend/src/pages/inbounds/QrCodeModal.tsx @@ -41,7 +41,7 @@ export default function QrCodeModal({ onClose, dbInbound, client = null, - remarkModel = '-ieo', + remarkModel = '-io', nodeAddress = '', subSettings, }: QrCodeModalProps) { @@ -65,7 +65,7 @@ export default function QrCodeModal({ genWireguardConfigs({ inbound, remark: peerRemark, - remarkModel: '-ieo', + remarkModel: '-io', hostOverride: nodeAddress, fallbackHostname, }).split('\r\n'), @@ -74,7 +74,7 @@ export default function QrCodeModal({ genWireguardLinks({ inbound, remark: peerRemark, - remarkModel: '-ieo', + remarkModel: '-io', hostOverride: nodeAddress, fallbackHostname, }).split('\r\n'), diff --git a/frontend/src/pages/inbounds/useInbounds.ts b/frontend/src/pages/inbounds/useInbounds.ts index 8bf982c7..80853ba1 100644 --- a/frontend/src/pages/inbounds/useInbounds.ts +++ b/frontend/src/pages/inbounds/useInbounds.ts @@ -101,7 +101,7 @@ export function useInbounds() { const tgBotEnable = !!defaults.tgBotEnable; const ipLimitEnable = !!defaults.ipLimitEnable; const pageSize = defaults.pageSize ?? 0; - const remarkModel = defaults.remarkModel || '-ieo'; + const remarkModel = defaults.remarkModel || '-io'; const datepicker = (defaults.datepicker as 'gregorian' | 'jalalian') || 'gregorian'; const subSettings: SubSettings = useMemo(() => ({ diff --git a/frontend/src/test/__snapshots__/inbound-link.test.ts.snap b/frontend/src/test/__snapshots__/inbound-link.test.ts.snap index 7880d806..8a2fec07 100644 --- a/frontend/src/test/__snapshots__/inbound-link.test.ts.snap +++ b/frontend/src/test/__snapshots__/inbound-link.test.ts.snap @@ -2,17 +2,17 @@ exports[`genHysteriaLink > hysteria-v1-tls: byte-stable 1`] = `"hysteria://hyst-v1-auth-XYZ@example.test:36715?security=tls&fp=chrome&alpn=h3&sni=hysteria.example.test#parity-test"`; -exports[`genInboundLinks orchestrator > hysteria-v1-tls: byte-stable 1`] = `"hysteria://hyst-v1-auth-XYZ@override.test:36715?security=tls&fp=chrome&alpn=h3&sni=hysteria.example.test#parity-test-gina%40example.test"`; +exports[`genInboundLinks orchestrator > hysteria-v1-tls: byte-stable 1`] = `"hysteria://hyst-v1-auth-XYZ@override.test:36715?security=tls&fp=chrome&alpn=h3&sni=hysteria.example.test#parity-test"`; -exports[`genInboundLinks orchestrator > shadowsocks-tcp-2022: byte-stable 1`] = `"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206Wm1GclpTMXpaWEoyWlhJdGNHRnpjM2R2Y21RdE1EQXdNUT09OmRHVnpkQzFqYkdsbGJuUXRjR0Z6YzNkdmNtUXRNUT09@override.test:8388?type=tcp#parity-test-frank%40example.test"`; +exports[`genInboundLinks orchestrator > shadowsocks-tcp-2022: byte-stable 1`] = `"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206Wm1GclpTMXpaWEoyWlhJdGNHRnpjM2R2Y21RdE1EQXdNUT09OmRHVnpkQzFqYkdsbGJuUXRjR0Z6YzNkdmNtUXRNUT09@override.test:8388?type=tcp#parity-test"`; -exports[`genInboundLinks orchestrator > trojan-ws-tls: byte-stable 1`] = `"trojan://trojan-test-pw-XYZ@override.test:443?type=ws&path=%2Ftrojan&host=trojan.example.test&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=trojan.example.test#parity-test-eve%40example.test"`; +exports[`genInboundLinks orchestrator > trojan-ws-tls: byte-stable 1`] = `"trojan://trojan-test-pw-XYZ@override.test:443?type=ws&path=%2Ftrojan&host=trojan.example.test&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=trojan.example.test#parity-test"`; -exports[`genInboundLinks orchestrator > vless-tcp-reality: byte-stable 1`] = `"vless://22222222-3333-4444-9555-666666666666@override.test:443?type=tcp&encryption=none&security=reality&pbk=Tx5yj1bRcOPHkdvT2pIAQ2zh0gQ8m4OPdnzqXJxxV3o&fp=chrome&sid=a3f1&spx=%2F&flow=xtls-rprx-vision#parity-test-dave%40example.test"`; +exports[`genInboundLinks orchestrator > vless-tcp-reality: byte-stable 1`] = `"vless://22222222-3333-4444-9555-666666666666@override.test:443?type=tcp&encryption=none&security=reality&pbk=Tx5yj1bRcOPHkdvT2pIAQ2zh0gQ8m4OPdnzqXJxxV3o&fp=chrome&sid=a3f1&spx=%2F&flow=xtls-rprx-vision#parity-test"`; -exports[`genInboundLinks orchestrator > vless-ws-tls: byte-stable 1`] = `"vless://8c14d6f7-2e3b-4a91-9d24-3f7a6b8c1e02@override.test:443?type=ws&encryption=none&path=%2Fws&host=cdn.example.test&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=cdn.example.test#parity-test-alice%40example.test"`; +exports[`genInboundLinks orchestrator > vless-ws-tls: byte-stable 1`] = `"vless://8c14d6f7-2e3b-4a91-9d24-3f7a6b8c1e02@override.test:443?type=ws&encryption=none&path=%2Fws&host=cdn.example.test&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=cdn.example.test#parity-test"`; -exports[`genInboundLinks orchestrator > vmess-tcp-tls: byte-stable 1`] = `"vmess://ewogICJ2IjogIjIiLAogICJwcyI6ICJwYXJpdHktdGVzdC1jYXJvbEBleGFtcGxlLnRlc3QiLAogICJhZGQiOiAib3ZlcnJpZGUudGVzdCIsCiAgInBvcnQiOiA4NDQzLAogICJpZCI6ICIxMTExMTExMS0yMjIyLTQzMzMtODQ0NC01NTU1NTU1NTU1NTUiLAogICJzY3kiOiAiYXV0byIsCiAgIm5ldCI6ICJ0Y3AiLAogICJ0bHMiOiAidGxzIiwKICAidHlwZSI6ICJub25lIiwKICAic25pIjogInZtZXNzLmV4YW1wbGUudGVzdCIsCiAgImZwIjogImNocm9tZSIsCiAgImFscG4iOiAiaDIsaHR0cC8xLjEiCn0="`; +exports[`genInboundLinks orchestrator > vmess-tcp-tls: byte-stable 1`] = `"vmess://ewogICJ2IjogIjIiLAogICJwcyI6ICJwYXJpdHktdGVzdCIsCiAgImFkZCI6ICJvdmVycmlkZS50ZXN0IiwKICAicG9ydCI6IDg0NDMsCiAgImlkIjogIjExMTExMTExLTIyMjItNDMzMy04NDQ0LTU1NTU1NTU1NTU1NSIsCiAgInNjeSI6ICJhdXRvIiwKICAibmV0IjogInRjcCIsCiAgInRscyI6ICJ0bHMiLAogICJ0eXBlIjogIm5vbmUiLAogICJzbmkiOiAidm1lc3MuZXhhbXBsZS50ZXN0IiwKICAiZnAiOiAiY2hyb21lIiwKICAiYWxwbiI6ICJoMixodHRwLzEuMSIKfQ=="`; exports[`genInboundLinks orchestrator > wireguard-server: byte-stable 1`] = ` "[Interface] diff --git a/frontend/src/test/inbound-from-db.test.ts b/frontend/src/test/inbound-from-db.test.ts index 6c8b11ec..7369212d 100644 --- a/frontend/src/test/inbound-from-db.test.ts +++ b/frontend/src/test/inbound-from-db.test.ts @@ -94,7 +94,6 @@ describe('inboundFromDb', () => { fallbackHostname: FALLBACK_HOST, }); expect(links).toContain('vless://'); - expect(links).toContain('alice%40test'); expect(links).toContain('encryption=none'); }); diff --git a/sub/links.go b/sub/links.go index b8bc5536..0d1b024d 100644 --- a/sub/links.go +++ b/sub/links.go @@ -19,7 +19,7 @@ func (p *LinkProvider) build(host string) *SubService { showInfo, _ := p.settingService.GetSubShowInfo() rModel, err := p.settingService.GetRemarkModel() if err != nil { - rModel = "-ieo" + rModel = "-io" } svc := NewSubService(showInfo, rModel) svc.PrepareForRequest(host) diff --git a/sub/sub.go b/sub/sub.go index 534af5ff..667ea006 100644 --- a/sub/sub.go +++ b/sub/sub.go @@ -112,7 +112,7 @@ func (s *Server) initRouter() (*gin.Engine, error) { RemarkModel, err := s.settingService.GetRemarkModel() if err != nil { - RemarkModel = "-ieo" + RemarkModel = "-io" } SubUpdates, err := s.settingService.GetSubUpdates() diff --git a/web/service/setting.go b/web/service/setting.go index 1d5173a6..9280acda 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -39,7 +39,7 @@ var defaultValueMap = map[string]string{ "pageSize": "25", "expireDiff": "0", "trafficDiff": "0", - "remarkModel": "-ieo", + "remarkModel": "-io", "timeLocation": "Local", "tgBotEnable": "false", "tgBotToken": "",