Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpwnnex <eternxles@gmail.com>2026-04-22 18:55:09 +0300
committerpwnnex <eternxles@gmail.com>2026-04-22 18:55:09 +0300
commiteb4791a1cdabebbf0b0d5a81a40ecc7d88924656 (patch)
tree9c8e302bd2e0594f3d64341561716f83c4b1c56f /database/model
parente6d0c33937f5776911e5fc1e9d8015d8a9323450 (diff)
hysteria: also accept "hysteria2" protocol string
UI stores v1 and v2 both as "hysteria" with settings.version, but inbounds that came in from imports / manual SQL can carry the literal "hysteria2" string and get silently dropped everywhere we switch on protocol. Add Hysteria2 constant + IsHysteria helper, use it in the places that gate on protocol (sub SQL, getLink, genHysteriaLink, clash buildProxy, json gen, inbound.go validation, xray AddUser). Existing "hysteria" inbounds are untouched. closes #4081
Diffstat (limited to 'database/model')
-rw-r--r--database/model/model.go14
-rw-r--r--database/model/model_test.go22
2 files changed, 35 insertions, 1 deletions
diff --git a/database/model/model.go b/database/model/model.go
index 5fa934c0..01654d22 100644
--- a/database/model/model.go
+++ b/database/model/model.go
@@ -21,9 +21,21 @@ const (
Shadowsocks Protocol = "shadowsocks"
Mixed Protocol = "mixed"
WireGuard Protocol = "wireguard"
- Hysteria Protocol = "hysteria"
+ // UI stores Hysteria v1 and v2 both as "hysteria" and uses
+ // settings.version to discriminate. Imports from outside the panel
+ // can carry the literal "hysteria2" string, so IsHysteria below
+ // accepts both.
+ Hysteria Protocol = "hysteria"
+ Hysteria2 Protocol = "hysteria2"
)
+// IsHysteria returns true for both "hysteria" and "hysteria2".
+// Use instead of a bare ==model.Hysteria check: a v2 inbound stored
+// with the literal v2 string would otherwise fall through (#4081).
+func IsHysteria(p Protocol) bool {
+ return p == Hysteria || p == Hysteria2
+}
+
// User represents a user account in the 3x-ui panel.
type User struct {
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
diff --git a/database/model/model_test.go b/database/model/model_test.go
new file mode 100644
index 00000000..d98c5157
--- /dev/null
+++ b/database/model/model_test.go
@@ -0,0 +1,22 @@
+package model
+
+import "testing"
+
+func TestIsHysteria(t *testing.T) {
+ cases := []struct {
+ in Protocol
+ want bool
+ }{
+ {Hysteria, true},
+ {Hysteria2, true},
+ {VLESS, false},
+ {Shadowsocks, false},
+ {Protocol(""), false},
+ {Protocol("hysteria3"), false},
+ }
+ for _, c := range cases {
+ if got := IsHysteria(c.in); got != c.want {
+ t.Errorf("IsHysteria(%q) = %v, want %v", c.in, got, c.want)
+ }
+ }
+}