mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-08-26 13:07:14 +00:00
fix(sub): stop the subscription from 500ing on valid-but-unusual stream settings
The raw share-link generators used unchecked type assertions and unguarded array indexing: an empty Reality shortIds/serverNames array (random.Num(0) panics), a tcp-http header with no request block or an empty request.path, a grpc block missing its keys, empty stream settings, and a non-string Host header all panicked mid-generation. Because getSubs loops every client's link with no recover, one such client 500s the entire subscription for everyone. The sibling JSON, Clash and frontend generators already guard these; make the raw generators match with comma-ok assertions and length checks.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package sub
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// A subscription is built by iterating every client's share link with no
|
||||
// recover(), so any panic in the link generators 500s the whole subscription
|
||||
// for every client. Valid-but-unusual stream settings (an empty Reality
|
||||
// shortIds/serverNames array, a tcp-http header with no request, a grpc block
|
||||
// missing its keys) must therefore produce a link, not a panic.
|
||||
func TestGetSubsToleratesUnusualStreamSettings(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
cases := []struct {
|
||||
name string
|
||||
stream string
|
||||
}{
|
||||
{"reality empty arrays", `{"network":"tcp","security":"reality","realitySettings":{"serverNames":[],"shortIds":[],"settings":{"publicKey":"pk"}}}`},
|
||||
{"tcp http missing request", `{"network":"tcp","security":"none","tcpSettings":{"header":{"type":"http","response":{"headers":{}}}}}`},
|
||||
{"tcp http empty path", `{"network":"tcp","security":"none","tcpSettings":{"header":{"type":"http","request":{"path":[]}}}}`},
|
||||
{"grpc missing keys", `{"network":"grpc","security":"none","grpcSettings":{}}`},
|
||||
{"empty stream settings", `{}`},
|
||||
}
|
||||
|
||||
for i, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
seedSubDB(t)
|
||||
subId := fmt.Sprintf("s%d", i)
|
||||
seedSubInbound(t, subId, fmt.Sprintf("t%d", i), 46000+i, 1, tc.stream)
|
||||
|
||||
links, _, _, _, err := NewSubService("").GetSubs(subId, "req.example.com")
|
||||
if err != nil {
|
||||
t.Fatalf("GetSubs errored: %v", err)
|
||||
}
|
||||
if len(links) != 1 {
|
||||
t.Fatalf("expected 1 share link, got %d", len(links))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user