mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-05 12:44:22 +00:00
Second-pass on the SOCKS5 inbound scaffold (PR #4452). This commit ticks off two of the 'help wanted' items from the scaffold's TODO list and tightens the existing dispatcher so that adding a new protocol-without-link in the future is a one-line change instead of an audit through every switch. Backend (Go) ------------ * database/model/model.go: new IsSocksLike(p) helper that returns true for both 'socks' and 'mixed'. Mirrors the existing IsHysteria pattern (one helper, two underlying constants) so call sites don't have to re-list both protocols every time they need to treat 'this inbound speaks SOCKS5' uniformly. * database/model/model_test.go: - TestSocksProtocolConstant pins the wire value 'socks' so a future refactor can't silently rename it (which would orphan every stored inbound row). - TestIsSocksLike covers Socks, Mixed, every other declared protocol, the empty Protocol, and a wrong-case input. * sub/subService.go GetLink: - Replace bare string literals ('vmess', 'vless', …) with the typed model.* constants so a typo can't silently fall through. - Add an explicit link-less case for Socks/Mixed/HTTP/Tunnel/WireGuard with a comment explaining why we don't emit 'socks://…' URLs (follow-up #1 in the scaffold PR description). Frontend (JS/Vue) ----------------- * frontend/src/models/dbinbound.js: add 'isSocks' getter (pure SOCKS5 inbound) and 'isSocksLike' getter (Socks OR Mixed), matching the pattern used by isMixed/isHTTP/isWireguard above. * frontend/src/pages/inbounds/InboundInfoModal.vue: the existing 'Mixed' info block (auth/UDP/IP/accounts) now also renders for the new SOCKS protocol via isSocksLike, since Xray's mixed and socks inbounds accept the exact same settings keys. Without this, opening the info modal for a SOCKS inbound would show an empty body. Header comment updated to list SOCKS alongside Mixed/HTTP/Tunnel. Still outstanding from the scaffold's TODO list: - Xray runtime AddUser hooks (web/service/inbound.go) - Translations for the 'socks' label across all 13 locales - Routing UI protocol == socks helper
61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestSocksProtocolConstant pins the wire value of the SOCKS5 protocol
|
|
// constant. It must stay "socks" because that's the literal Xray expects
|
|
// in inbound.protocol JSON (see https://xtls.github.io/config/inbounds/socks.html);
|
|
// changing it would silently break every stored inbound row.
|
|
func TestSocksProtocolConstant(t *testing.T) {
|
|
if got, want := string(Socks), "socks"; got != want {
|
|
t.Errorf("Socks protocol constant = %q, want %q", got, want)
|
|
}
|
|
if Socks == Mixed {
|
|
t.Error("Socks and Mixed must be distinct protocols")
|
|
}
|
|
}
|
|
|
|
func TestIsSocksLike(t *testing.T) {
|
|
cases := []struct {
|
|
in Protocol
|
|
want bool
|
|
}{
|
|
{Socks, true},
|
|
{Mixed, true},
|
|
{HTTP, false},
|
|
{VLESS, false},
|
|
{VMESS, false},
|
|
{Trojan, false},
|
|
{Shadowsocks, false},
|
|
{WireGuard, false},
|
|
{Hysteria, false},
|
|
{Hysteria2, false},
|
|
{Tunnel, false},
|
|
{Protocol(""), false},
|
|
{Protocol("SOCKS"), false}, // case-sensitive: must match the stored lowercase value
|
|
}
|
|
for _, c := range cases {
|
|
if got := IsSocksLike(c.in); got != c.want {
|
|
t.Errorf("IsSocksLike(%q) = %v, want %v", c.in, got, c.want)
|
|
}
|
|
}
|
|
}
|