mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-02 09:48:43 +00:00
feat: validate and initialize browser dialer at config build
Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/d0035ff5-3633-402f-890e-e68c267a65c1 Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
9ad099774a
commit
aeb689284c
@@ -0,0 +1,63 @@
|
||||
package conf_test
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
. "github.com/xtls/xray-core/infra/conf"
|
||||
)
|
||||
|
||||
const testBrowserDialerPath = "/123e4567-e89b-12d3-a456-426614174000"
|
||||
|
||||
func TestStreamConfigBuildRejectsBrowserDialerUnsupportedProtocol(t *testing.T) {
|
||||
network := TransportProtocol("tcp")
|
||||
config := &StreamConfig{
|
||||
Network: &network,
|
||||
SocketSettings: &SocketConfig{
|
||||
BrowserDialer: "127.0.0.1:18080" + testBrowserDialerPath,
|
||||
},
|
||||
}
|
||||
|
||||
_, err := config.Build()
|
||||
if err == nil || !strings.Contains(err.Error(), "sockopt.browserDialer only supports WS or XHTTP") {
|
||||
t.Fatalf("expected unsupported protocol error, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStreamConfigBuildRejectsBrowserDialerWithREALITY(t *testing.T) {
|
||||
network := TransportProtocol("splithttp")
|
||||
config := &StreamConfig{
|
||||
Network: &network,
|
||||
Security: "reality",
|
||||
SocketSettings: &SocketConfig{
|
||||
BrowserDialer: "127.0.0.1:18081" + testBrowserDialerPath,
|
||||
},
|
||||
}
|
||||
|
||||
_, err := config.Build()
|
||||
if err == nil || !strings.Contains(err.Error(), "sockopt.browserDialer does not support REALITY") {
|
||||
t.Fatalf("expected REALITY rejection, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStreamConfigBuildFailsOnBrowserDialerAddressConflict(t *testing.T) {
|
||||
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to prepare occupied listener: %v", err)
|
||||
}
|
||||
defer listener.Close()
|
||||
|
||||
network := TransportProtocol("websocket")
|
||||
config := &StreamConfig{
|
||||
Network: &network,
|
||||
SocketSettings: &SocketConfig{
|
||||
BrowserDialer: listener.Addr().String() + testBrowserDialerPath,
|
||||
},
|
||||
}
|
||||
|
||||
_, err = config.Build()
|
||||
if err == nil || !strings.Contains(err.Error(), "Failed to start Browser Dialer listener") {
|
||||
t.Fatalf("expected address conflict error, got: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"github.com/xtls/xray-core/common/platform/filesystem"
|
||||
"github.com/xtls/xray-core/common/serial"
|
||||
"github.com/xtls/xray-core/transport/internet"
|
||||
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
||||
"github.com/xtls/xray-core/transport/internet/finalmask/fragment"
|
||||
"github.com/xtls/xray-core/transport/internet/finalmask/header/custom"
|
||||
"github.com/xtls/xray-core/transport/internet/finalmask/header/dns"
|
||||
@@ -1972,6 +1973,14 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) {
|
||||
}
|
||||
config.ProtocolName = protocol
|
||||
}
|
||||
if c.SocketSettings != nil && c.SocketSettings.BrowserDialer != "" {
|
||||
if config.ProtocolName != "websocket" && config.ProtocolName != "splithttp" {
|
||||
return nil, errors.New("sockopt.browserDialer only supports WS or XHTTP")
|
||||
}
|
||||
if strings.EqualFold(c.Security, "reality") {
|
||||
return nil, errors.New("sockopt.browserDialer does not support REALITY")
|
||||
}
|
||||
}
|
||||
|
||||
switch strings.ToLower(c.Security) {
|
||||
case "", "none":
|
||||
@@ -2088,6 +2097,9 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) {
|
||||
if err != nil {
|
||||
return nil, errors.New("Failed to build sockopt.").Base(err)
|
||||
}
|
||||
if err := browser_dialer.EnsureDialerWithAddress(ss.BrowserDialer); err != nil {
|
||||
return nil, errors.New("Failed to start Browser Dialer listener.").Base(err)
|
||||
}
|
||||
config.SocketSettings = ss
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user