Browse Source

fix(sockopt): rename interfaceName to interface so xray honors it

xray-core reads the bind-interface sockopt as json:"interface", but the schema and forms used interfaceName. Go's JSON unmarshal is case-insensitive, yet interfacename != interface, so the value never reached xray and interface binding silently did nothing. Rename the field across the schema, the inbound/outbound forms, and the golden fixture to match xray-core and the official docs.
MHSanaei 10 giờ trước cách đây
mục cha
commit
b6641439d4

+ 1 - 1
frontend/src/pages/inbounds/form/transport/sockopt.tsx

@@ -130,7 +130,7 @@ export default function SockoptForm({
                   <Input />
                 </Form.Item>
                 <Form.Item
-                  name={['streamSettings', 'sockopt', 'interfaceName']}
+                  name={['streamSettings', 'sockopt', 'interface']}
                   label={t('pages.inbounds.info.interfaceName')}
                 >
                   <Input />

+ 1 - 1
frontend/src/pages/xray/outbounds/transport/sockopt.tsx

@@ -89,7 +89,7 @@ export default function SockoptForm({ form }: { form: FormInstance<OutboundFormV
                 </Form.Item>
                 <Form.Item
                   label={t('pages.xray.outboundForm.interface')}
-                  name={['streamSettings', 'sockopt', 'interfaceName']}
+                  name={['streamSettings', 'sockopt', 'interface']}
                 >
                   <Input />
                 </Form.Item>

+ 1 - 1
frontend/src/schemas/protocols/stream/sockopt.ts

@@ -65,7 +65,7 @@ export const SockoptStreamSettingsSchema = z.object({
   tcpcongestion: TcpCongestionSchema.default('bbr'),
   V6Only: z.boolean().default(false),
   tcpWindowClamp: z.number().int().min(0).default(600),
-  interfaceName: z.string().default(''),
+  interface: z.string().default(''),
   trustedXForwardedFor: z.array(z.string()).default([]),
   addressPortStrategy: AddressPortStrategySchema.default('none'),
   happyEyeballs: HappyEyeballsSchema.optional(),

+ 4 - 4
frontend/src/test/__snapshots__/sockopt.test.ts.snap

@@ -8,7 +8,7 @@ exports[`SockoptStreamSettingsSchema fixtures > parses defaults byte-stably 1`]
   "customSockopt": [],
   "dialerProxy": "",
   "domainStrategy": "AsIs",
-  "interfaceName": "",
+  "interface": "",
   "mark": 0,
   "penetrate": false,
   "tcpFastOpen": false,
@@ -32,7 +32,7 @@ exports[`SockoptStreamSettingsSchema fixtures > parses full byte-stably 1`] = `
   "customSockopt": [],
   "dialerProxy": "out-proxy-tag",
   "domainStrategy": "UseIP",
-  "interfaceName": "eth0",
+  "interface": "eth0",
   "mark": 100,
   "penetrate": false,
   "tcpFastOpen": true,
@@ -59,7 +59,7 @@ exports[`SockoptStreamSettingsSchema fixtures > parses tcp-tuning byte-stably 1`
   "customSockopt": [],
   "dialerProxy": "",
   "domainStrategy": "AsIs",
-  "interfaceName": "",
+  "interface": "",
   "mark": 0,
   "penetrate": false,
   "tcpFastOpen": true,
@@ -83,7 +83,7 @@ exports[`SockoptStreamSettingsSchema fixtures > parses tproxy byte-stably 1`] =
   "customSockopt": [],
   "dialerProxy": "",
   "domainStrategy": "ForceIPv4",
-  "interfaceName": "",
+  "interface": "",
   "mark": 255,
   "penetrate": true,
   "tcpFastOpen": false,

+ 1 - 1
frontend/src/test/golden/fixtures/sockopt/full.json

@@ -14,6 +14,6 @@
   "tcpcongestion": "cubic",
   "V6Only": false,
   "tcpWindowClamp": 600,
-  "interfaceName": "eth0",
+  "interface": "eth0",
   "trustedXForwardedFor": ["10.0.0.0/8", "192.168.0.0/16"]
 }