mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-11-15 09:35:00 +03:00
fix(sub): omit non-standard fm param from Hysteria2 URI (#6048)
Hysteria2 subscription links included a v2rayN-specific fm=<json> finalmask dump alongside standard obfs/obfs-password. Clients such as mihomo reject the unknown query param and fail to update the provider. Emit only the standard salamander fields in genHysteriaLink, matching the Clash generator. Fixes #5982
This commit is contained in:
@@ -1025,11 +1025,10 @@ func (s *SubService) genHysteriaLink(inbound *model.Inbound, email string) strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// salamander obfs (Hysteria2). The panel-side link generator already
|
// salamander obfs (Hysteria2). Emit only the standard URI fields;
|
||||||
// emits these; keep the subscription output in sync so a client has
|
// the non-standard fm=<json> finalmask dump breaks mihomo and other
|
||||||
// the obfs password to match the server.
|
// Hysteria2 clients that reject unknown query params.
|
||||||
if finalmask, ok := stream["finalmask"].(map[string]any); ok {
|
if finalmask, ok := stream["finalmask"].(map[string]any); ok {
|
||||||
applyFinalMaskParams(finalmask, params)
|
|
||||||
if udpMasks, ok := finalmask["udp"].([]any); ok {
|
if udpMasks, ok := finalmask["udp"].([]any); ok {
|
||||||
for _, m := range udpMasks {
|
for _, m := range udpMasks {
|
||||||
mask, _ := m.(map[string]any)
|
mask, _ := m.(map[string]any)
|
||||||
|
|||||||
@@ -1110,3 +1110,32 @@ func TestHysteriaHopPorts(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenHysteriaLinkOmitsFinalMaskQueryParam(t *testing.T) {
|
||||||
|
stream := `{
|
||||||
|
"security":"tls",
|
||||||
|
"tlsSettings":{"serverName":"hy.sni","alpn":["h3"],"settings":{"fingerprint":"chrome"}},
|
||||||
|
"finalmask":{"udp":[{"type":"salamander","settings":{"password":"obfs-secret"}}]}
|
||||||
|
}`
|
||||||
|
in := &model.Inbound{
|
||||||
|
Listen: "203.0.113.1",
|
||||||
|
Port: 443,
|
||||||
|
Protocol: model.Hysteria,
|
||||||
|
Remark: "hy2",
|
||||||
|
Settings: `{"version":2,"clients":[{"auth":"hyauth","email":"user"}]}`,
|
||||||
|
StreamSettings: stream,
|
||||||
|
}
|
||||||
|
got := (&SubService{}).genHysteriaLink(in, "user")
|
||||||
|
if got == "" {
|
||||||
|
t.Fatal("expected hysteria2 link")
|
||||||
|
}
|
||||||
|
if strings.Contains(got, "fm=") {
|
||||||
|
t.Fatalf("hysteria2 subscription URI must not include non-standard fm param: %s", got)
|
||||||
|
}
|
||||||
|
if !strings.Contains(got, "obfs=salamander") {
|
||||||
|
t.Fatalf("missing standard obfs=salamander: %s", got)
|
||||||
|
}
|
||||||
|
if !strings.Contains(got, "obfs-password=obfs-secret") {
|
||||||
|
t.Fatalf("missing standard obfs-password: %s", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user