From c0a98f74fc9bc9ff2fcbc27903a942600d4fb220 Mon Sep 17 00:00:00 2001 From: mmmray <142015632+mmmray@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:36:11 +0200 Subject: [PATCH] Transport: Remove DomainSocket (#3757) https://github.com/XTLS/Xray-core/pull/3755#issuecomment-2325533003 --- infra/conf/transport.go | 12 -- infra/conf/transport_internet.go | 33 +--- infra/conf/xray.go | 3 - main/distro/all/all.go | 1 - testing/scenarios/transport_test.go | 117 ------------ transport/internet/config.go | 2 - transport/internet/config.pb.go | 74 ++++--- transport/internet/config.proto | 1 - transport/internet/domainsocket/config.go | 39 ---- transport/internet/domainsocket/config.pb.go | 180 ------------------ transport/internet/domainsocket/config.proto | 20 -- transport/internet/domainsocket/dial.go | 41 ---- transport/internet/domainsocket/errgen.go | 3 - transport/internet/domainsocket/listener.go | 141 -------------- .../internet/domainsocket/listener_test.go | 94 --------- 15 files changed, 37 insertions(+), 724 deletions(-) delete mode 100644 transport/internet/domainsocket/config.go delete mode 100644 transport/internet/domainsocket/config.pb.go delete mode 100644 transport/internet/domainsocket/config.proto delete mode 100644 transport/internet/domainsocket/dial.go delete mode 100644 transport/internet/domainsocket/errgen.go delete mode 100644 transport/internet/domainsocket/listener.go delete mode 100644 transport/internet/domainsocket/listener_test.go diff --git a/infra/conf/transport.go b/infra/conf/transport.go index 5577e823..7957ee7d 100644 --- a/infra/conf/transport.go +++ b/infra/conf/transport.go @@ -12,7 +12,6 @@ type TransportConfig struct { KCPConfig *KCPConfig `json:"kcpSettings"` WSConfig *WebSocketConfig `json:"wsSettings"` HTTPConfig *HTTPConfig `json:"httpSettings"` - DSConfig *DomainSocketConfig `json:"dsSettings"` GRPCConfig *GRPCConfig `json:"grpcSettings"` GUNConfig *GRPCConfig `json:"gunSettings"` HTTPUPGRADEConfig *HttpUpgradeConfig `json:"httpupgradeSettings"` @@ -67,17 +66,6 @@ func (c *TransportConfig) Build() (*global.Config, error) { }) } - if c.DSConfig != nil { - ds, err := c.DSConfig.Build() - if err != nil { - return nil, errors.New("Failed to build DomainSocket config.").Base(err) - } - config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ - ProtocolName: "domainsocket", - Settings: serial.ToTypedMessage(ds), - }) - } - if c.GRPCConfig == nil { c.GRPCConfig = c.GUNConfig } diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index 8e84d0f3..8cc057a8 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -16,7 +16,6 @@ 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/domainsocket" httpheader "github.com/xtls/xray-core/transport/internet/headers/http" "github.com/xtls/xray-core/transport/internet/http" "github.com/xtls/xray-core/transport/internet/httpupgrade" @@ -313,21 +312,6 @@ func (c *HTTPConfig) Build() (proto.Message, error) { return config, nil } -type DomainSocketConfig struct { - Path string `json:"path"` - Abstract bool `json:"abstract"` - Padding bool `json:"padding"` -} - -// Build implements Buildable. -func (c *DomainSocketConfig) Build() (proto.Message, error) { - return &domainsocket.Config{ - Path: c.Path, - Abstract: c.Abstract, - Padding: c.Padding, - }, nil -} - func readFileOrString(f string, s []string) ([]byte, error) { if len(f) > 0 { return filesystem.ReadFile(f) @@ -646,8 +630,6 @@ func (p TransportProtocol) Build() (string, error) { return "websocket", nil case "h2", "http": return "http", nil - case "ds", "domainsocket": - return "domainsocket", nil case "grpc", "gun": return "grpc", nil case "httpupgrade": @@ -783,7 +765,6 @@ type StreamConfig struct { KCPSettings *KCPConfig `json:"kcpSettings"` WSSettings *WebSocketConfig `json:"wsSettings"` HTTPSettings *HTTPConfig `json:"httpSettings"` - DSSettings *DomainSocketConfig `json:"dsSettings"` SocketSettings *SocketConfig `json:"sockopt"` GRPCConfig *GRPCConfig `json:"grpcSettings"` GUNConfig *GRPCConfig `json:"gunSettings"` @@ -818,8 +799,8 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) { config.SecuritySettings = append(config.SecuritySettings, tm) config.SecurityType = tm.Type case "reality": - if config.ProtocolName != "tcp" && config.ProtocolName != "http" && config.ProtocolName != "grpc" && config.ProtocolName != "domainsocket" { - return nil, errors.New("REALITY only supports TCP, H2, gRPC and DomainSocket for now.") + if config.ProtocolName != "tcp" && config.ProtocolName != "http" && config.ProtocolName != "grpc" { + return nil, errors.New("REALITY only supports TCP, H2 and gRPC for now.") } if c.REALITYSettings == nil { return nil, errors.New(`REALITY: Empty "realitySettings".`) @@ -876,16 +857,6 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) { Settings: serial.ToTypedMessage(ts), }) } - if c.DSSettings != nil { - ds, err := c.DSSettings.Build() - if err != nil { - return nil, errors.New("Failed to build DomainSocket config.").Base(err) - } - config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ - ProtocolName: "domainsocket", - Settings: serial.ToTypedMessage(ds), - }) - } if c.GRPCConfig == nil { c.GRPCConfig = c.GUNConfig } diff --git a/infra/conf/xray.go b/infra/conf/xray.go index 29616ef3..9488589c 100644 --- a/infra/conf/xray.go +++ b/infra/conf/xray.go @@ -553,9 +553,6 @@ func applyTransportConfig(s *StreamConfig, t *TransportConfig) { if s.HTTPSettings == nil { s.HTTPSettings = t.HTTPConfig } - if s.DSSettings == nil { - s.DSSettings = t.DSConfig - } if s.HTTPUPGRADESettings == nil { s.HTTPUPGRADESettings = t.HTTPUPGRADEConfig } diff --git a/main/distro/all/all.go b/main/distro/all/all.go index 56ae664b..4e9ac3c0 100644 --- a/main/distro/all/all.go +++ b/main/distro/all/all.go @@ -50,7 +50,6 @@ import ( _ "github.com/xtls/xray-core/proxy/wireguard" // Transports - _ "github.com/xtls/xray-core/transport/internet/domainsocket" _ "github.com/xtls/xray-core/transport/internet/grpc" _ "github.com/xtls/xray-core/transport/internet/http" _ "github.com/xtls/xray-core/transport/internet/httpupgrade" diff --git a/testing/scenarios/transport_test.go b/testing/scenarios/transport_test.go index d6abbebd..ac9db7ac 100644 --- a/testing/scenarios/transport_test.go +++ b/testing/scenarios/transport_test.go @@ -1,8 +1,6 @@ package scenarios import ( - "os" - "runtime" "testing" "time" @@ -20,7 +18,6 @@ import ( "github.com/xtls/xray-core/proxy/vmess/outbound" "github.com/xtls/xray-core/testing/servers/tcp" "github.com/xtls/xray-core/transport/internet" - "github.com/xtls/xray-core/transport/internet/domainsocket" "github.com/xtls/xray-core/transport/internet/headers/http" tcptransport "github.com/xtls/xray-core/transport/internet/tcp" ) @@ -128,117 +125,3 @@ func TestHTTPConnectionHeader(t *testing.T) { t.Error(err) } } - -func TestDomainSocket(t *testing.T) { - if runtime.GOOS == "windows" || runtime.GOOS == "android" { - t.Skip("Not supported on windows or android") - return - } - tcpServer := tcp.Server{ - MsgProcessor: xor, - } - dest, err := tcpServer.Start() - common.Must(err) - defer tcpServer.Close() - - const dsPath = "/tmp/ds_scenario" - os.Remove(dsPath) - - userID := protocol.NewID(uuid.New()) - serverPort := tcp.PickPort() - serverConfig := &core.Config{ - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}}, - Listen: net.NewIPOrDomain(net.LocalHostIP), - StreamSettings: &internet.StreamConfig{ - Protocol: internet.TransportProtocol_DomainSocket, - TransportSettings: []*internet.TransportConfig{ - { - Protocol: internet.TransportProtocol_DomainSocket, - Settings: serial.ToTypedMessage(&domainsocket.Config{ - Path: dsPath, - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&inbound.Config{ - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&vmess.Account{ - Id: userID.String(), - }), - }, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - ProxySettings: serial.ToTypedMessage(&freedom.Config{}), - }, - }, - } - - clientPort := tcp.PickPort() - clientConfig := &core.Config{ - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}}, - Listen: net.NewIPOrDomain(net.LocalHostIP), - }), - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ - Address: net.NewIPOrDomain(dest.Address), - Port: uint32(dest.Port), - NetworkList: &net.NetworkList{ - Network: []net.Network{net.Network_TCP}, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - ProxySettings: serial.ToTypedMessage(&outbound.Config{ - Receiver: []*protocol.ServerEndpoint{ - { - Address: net.NewIPOrDomain(net.LocalHostIP), - Port: uint32(serverPort), - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&vmess.Account{ - Id: userID.String(), - }), - }, - }, - }, - }, - }), - SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ - StreamSettings: &internet.StreamConfig{ - Protocol: internet.TransportProtocol_DomainSocket, - TransportSettings: []*internet.TransportConfig{ - { - Protocol: internet.TransportProtocol_DomainSocket, - Settings: serial.ToTypedMessage(&domainsocket.Config{ - Path: dsPath, - }), - }, - }, - }, - }), - }, - }, - } - - servers, err := InitializeServerConfigs(serverConfig, clientConfig) - common.Must(err) - defer CloseAllServers(servers) - - if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { - t.Error(err) - } -} - diff --git a/transport/internet/config.go b/transport/internet/config.go index 80353f39..5968b564 100644 --- a/transport/internet/config.go +++ b/transport/internet/config.go @@ -42,8 +42,6 @@ func transportProtocolToString(protocol TransportProtocol) string { return "mkcp" case TransportProtocol_WebSocket: return "websocket" - case TransportProtocol_DomainSocket: - return "domainsocket" case TransportProtocol_HTTPUpgrade: return "httpupgrade" default: diff --git a/transport/internet/config.pb.go b/transport/internet/config.pb.go index 6c71bcc3..2cbe7fac 100644 --- a/transport/internet/config.pb.go +++ b/transport/internet/config.pb.go @@ -24,14 +24,13 @@ const ( type TransportProtocol int32 const ( - TransportProtocol_TCP TransportProtocol = 0 - TransportProtocol_UDP TransportProtocol = 1 - TransportProtocol_MKCP TransportProtocol = 2 - TransportProtocol_WebSocket TransportProtocol = 3 - TransportProtocol_HTTP TransportProtocol = 4 - TransportProtocol_DomainSocket TransportProtocol = 5 - TransportProtocol_HTTPUpgrade TransportProtocol = 6 - TransportProtocol_SplitHTTP TransportProtocol = 7 + TransportProtocol_TCP TransportProtocol = 0 + TransportProtocol_UDP TransportProtocol = 1 + TransportProtocol_MKCP TransportProtocol = 2 + TransportProtocol_WebSocket TransportProtocol = 3 + TransportProtocol_HTTP TransportProtocol = 4 + TransportProtocol_HTTPUpgrade TransportProtocol = 6 + TransportProtocol_SplitHTTP TransportProtocol = 7 ) // Enum value maps for TransportProtocol. @@ -42,19 +41,17 @@ var ( 2: "MKCP", 3: "WebSocket", 4: "HTTP", - 5: "DomainSocket", 6: "HTTPUpgrade", 7: "SplitHTTP", } TransportProtocol_value = map[string]int32{ - "TCP": 0, - "UDP": 1, - "MKCP": 2, - "WebSocket": 3, - "HTTP": 4, - "DomainSocket": 5, - "HTTPUpgrade": 6, - "SplitHTTP": 7, + "TCP": 0, + "UDP": 1, + "MKCP": 2, + "WebSocket": 3, + "HTTP": 4, + "HTTPUpgrade": 6, + "SplitHTTP": 7, } ) @@ -821,32 +818,31 @@ var file_transport_internet_config_proto_rawDesc = []byte{ 0x6f, 0x63, 0x6b, 0x6f, 0x70, 0x74, 0x22, 0x2f, 0x0a, 0x0a, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x66, 0x66, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7a, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x68, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x4b, 0x43, 0x50, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, - 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x48, 0x54, 0x54, - 0x50, 0x10, 0x07, 0x2a, 0xa9, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f, 0x49, 0x53, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53, - 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49, - 0x50, 0x34, 0x36, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36, - 0x34, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x10, - 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x07, - 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x08, 0x12, - 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x36, 0x10, 0x09, 0x12, - 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x34, 0x10, 0x0a, 0x42, - 0x67, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x01, - 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, - 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0xaa, 0x02, - 0x17, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x48, 0x54, 0x54, 0x50, 0x10, + 0x07, 0x2a, 0xa9, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f, 0x49, 0x53, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, + 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53, 0x45, 0x5f, + 0x49, 0x50, 0x36, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, + 0x36, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x34, 0x10, + 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x06, 0x12, + 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x07, 0x12, 0x0d, + 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x08, 0x12, 0x0e, 0x0a, + 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x36, 0x10, 0x09, 0x12, 0x0e, 0x0a, + 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x34, 0x10, 0x0a, 0x42, 0x67, 0x0a, + 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x2c, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, + 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x17, 0x58, + 0x72, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/transport/internet/config.proto b/transport/internet/config.proto index b0a63524..cab6162c 100644 --- a/transport/internet/config.proto +++ b/transport/internet/config.proto @@ -14,7 +14,6 @@ enum TransportProtocol { MKCP = 2; WebSocket = 3; HTTP = 4; - DomainSocket = 5; HTTPUpgrade = 6; SplitHTTP = 7; } diff --git a/transport/internet/domainsocket/config.go b/transport/internet/domainsocket/config.go deleted file mode 100644 index 7f80a595..00000000 --- a/transport/internet/domainsocket/config.go +++ /dev/null @@ -1,39 +0,0 @@ -package domainsocket - -import ( - "github.com/xtls/xray-core/common" - "github.com/xtls/xray-core/common/errors" - "github.com/xtls/xray-core/common/net" - "github.com/xtls/xray-core/transport/internet" -) - -const ( - protocolName = "domainsocket" - sizeofSunPath = 108 -) - -func (c *Config) GetUnixAddr() (*net.UnixAddr, error) { - path := c.Path - if path == "" { - return nil, errors.New("empty domain socket path") - } - if c.Abstract && path[0] != '@' { - path = "@" + path - } - if c.Abstract && c.Padding { - raw := []byte(path) - addr := make([]byte, sizeofSunPath) - copy(addr, raw) - path = string(addr) - } - return &net.UnixAddr{ - Name: path, - Net: "unix", - }, nil -} - -func init() { - common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { - return new(Config) - })) -} diff --git a/transport/internet/domainsocket/config.pb.go b/transport/internet/domainsocket/config.pb.go deleted file mode 100644 index dc9f5371..00000000 --- a/transport/internet/domainsocket/config.pb.go +++ /dev/null @@ -1,180 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.34.2 -// protoc v5.27.0 -// source: transport/internet/domainsocket/config.proto - -package domainsocket - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Path of the domain socket. This overrides the IP/Port parameter from - // upstream caller. - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - // Abstract specifies whether to use abstract namespace or not. - // Traditionally Unix domain socket is file system based. Abstract domain - // socket can be used without acquiring file lock. - Abstract bool `protobuf:"varint,2,opt,name=abstract,proto3" json:"abstract,omitempty"` - // Some apps, eg. haproxy, use the full length of sockaddr_un.sun_path to - // connect(2) or bind(2) when using abstract UDS. - Padding bool `protobuf:"varint,3,opt,name=padding,proto3" json:"padding,omitempty"` -} - -func (x *Config) Reset() { - *x = Config{} - if protoimpl.UnsafeEnabled { - mi := &file_transport_internet_domainsocket_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_domainsocket_config_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_domainsocket_config_proto_rawDescGZIP(), []int{0} -} - -func (x *Config) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *Config) GetAbstract() bool { - if x != nil { - return x.Abstract - } - return false -} - -func (x *Config) GetPadding() bool { - if x != nil { - return x.Padding - } - return false -} - -var File_transport_internet_domainsocket_config_proto protoreflect.FileDescriptor - -var file_transport_internet_domainsocket_config_proto_rawDesc = []byte{ - 0x0a, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x24, - 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x8e, 0x01, 0x0a, 0x28, 0x63, 0x6f, 0x6d, - 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0xaa, 0x02, 0x24, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -} - -var ( - file_transport_internet_domainsocket_config_proto_rawDescOnce sync.Once - file_transport_internet_domainsocket_config_proto_rawDescData = file_transport_internet_domainsocket_config_proto_rawDesc -) - -func file_transport_internet_domainsocket_config_proto_rawDescGZIP() []byte { - file_transport_internet_domainsocket_config_proto_rawDescOnce.Do(func() { - file_transport_internet_domainsocket_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_domainsocket_config_proto_rawDescData) - }) - return file_transport_internet_domainsocket_config_proto_rawDescData -} - -var file_transport_internet_domainsocket_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_domainsocket_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.domainsocket.Config -} -var file_transport_internet_domainsocket_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_domainsocket_config_proto_init() } -func file_transport_internet_domainsocket_config_proto_init() { - if File_transport_internet_domainsocket_config_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_transport_internet_domainsocket_config_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Config); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_transport_internet_domainsocket_config_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_domainsocket_config_proto_goTypes, - DependencyIndexes: file_transport_internet_domainsocket_config_proto_depIdxs, - MessageInfos: file_transport_internet_domainsocket_config_proto_msgTypes, - }.Build() - File_transport_internet_domainsocket_config_proto = out.File - file_transport_internet_domainsocket_config_proto_rawDesc = nil - file_transport_internet_domainsocket_config_proto_goTypes = nil - file_transport_internet_domainsocket_config_proto_depIdxs = nil -} diff --git a/transport/internet/domainsocket/config.proto b/transport/internet/domainsocket/config.proto deleted file mode 100644 index dafb9bc6..00000000 --- a/transport/internet/domainsocket/config.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.domainsocket; -option csharp_namespace = "Xray.Transport.Internet.DomainSocket"; -option go_package = "github.com/xtls/xray-core/transport/internet/domainsocket"; -option java_package = "com.xray.transport.internet.domainsocket"; -option java_multiple_files = true; - -message Config { - // Path of the domain socket. This overrides the IP/Port parameter from - // upstream caller. - string path = 1; - // Abstract specifies whether to use abstract namespace or not. - // Traditionally Unix domain socket is file system based. Abstract domain - // socket can be used without acquiring file lock. - bool abstract = 2; - // Some apps, eg. haproxy, use the full length of sockaddr_un.sun_path to - // connect(2) or bind(2) when using abstract UDS. - bool padding = 3; -} diff --git a/transport/internet/domainsocket/dial.go b/transport/internet/domainsocket/dial.go deleted file mode 100644 index a060da78..00000000 --- a/transport/internet/domainsocket/dial.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build !windows && !wasm -// +build !windows,!wasm - -package domainsocket - -import ( - "context" - - "github.com/xtls/xray-core/common" - "github.com/xtls/xray-core/common/errors" - "github.com/xtls/xray-core/common/net" - "github.com/xtls/xray-core/transport/internet" - "github.com/xtls/xray-core/transport/internet/reality" - "github.com/xtls/xray-core/transport/internet/stat" - "github.com/xtls/xray-core/transport/internet/tls" -) - -func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) { - settings := streamSettings.ProtocolSettings.(*Config) - addr, err := settings.GetUnixAddr() - if err != nil { - return nil, err - } - - conn, err := net.DialUnix("unix", nil, addr) - if err != nil { - return nil, errors.New("failed to dial unix: ", settings.Path).Base(err).AtWarning() - } - - if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { - return tls.Client(conn, config.GetTLSConfig(tls.WithDestination(dest))), nil - } else if config := reality.ConfigFromStreamSettings(streamSettings); config != nil { - return reality.UClient(conn, config, ctx, dest) - } - - return conn, nil -} - -func init() { - common.Must(internet.RegisterTransportDialer(protocolName, Dial)) -} diff --git a/transport/internet/domainsocket/errgen.go b/transport/internet/domainsocket/errgen.go deleted file mode 100644 index 83ac04d0..00000000 --- a/transport/internet/domainsocket/errgen.go +++ /dev/null @@ -1,3 +0,0 @@ -package domainsocket - -//go:generate go run github.com/xtls/xray-core/common/errors/errorgen diff --git a/transport/internet/domainsocket/listener.go b/transport/internet/domainsocket/listener.go deleted file mode 100644 index 0b19c681..00000000 --- a/transport/internet/domainsocket/listener.go +++ /dev/null @@ -1,141 +0,0 @@ -//go:build !windows && !wasm -// +build !windows,!wasm - -package domainsocket - -import ( - "context" - gotls "crypto/tls" - "os" - "strings" - - goreality "github.com/xtls/reality" - "github.com/xtls/xray-core/common" - "github.com/xtls/xray-core/common/errors" - "github.com/xtls/xray-core/common/net" - "github.com/xtls/xray-core/transport/internet" - "github.com/xtls/xray-core/transport/internet/reality" - "github.com/xtls/xray-core/transport/internet/stat" - "github.com/xtls/xray-core/transport/internet/tls" - "golang.org/x/sys/unix" -) - -type Listener struct { - addr *net.UnixAddr - ln net.Listener - tlsConfig *gotls.Config - realityConfig *goreality.Config - config *Config - addConn internet.ConnHandler - locker *fileLocker -} - -func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { - settings := streamSettings.ProtocolSettings.(*Config) - addr, err := settings.GetUnixAddr() - if err != nil { - return nil, err - } - - unixListener, err := net.ListenUnix("unix", addr) - if err != nil { - return nil, errors.New("failed to listen domain socket").Base(err).AtWarning() - } - - ln := &Listener{ - addr: addr, - ln: unixListener, - config: settings, - addConn: handler, - } - - if !settings.Abstract { - ln.locker = &fileLocker{ - path: settings.Path + ".lock", - } - if err := ln.locker.Acquire(); err != nil { - unixListener.Close() - return nil, err - } - } - - if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { - ln.tlsConfig = config.GetTLSConfig() - } - if config := reality.ConfigFromStreamSettings(streamSettings); config != nil { - ln.realityConfig = config.GetREALITYConfig() - } - - go ln.run() - - return ln, nil -} - -func (ln *Listener) Addr() net.Addr { - return ln.addr -} - -func (ln *Listener) Close() error { - if ln.locker != nil { - ln.locker.Release() - } - return ln.ln.Close() -} - -func (ln *Listener) run() { - for { - conn, err := ln.ln.Accept() - if err != nil { - if strings.Contains(err.Error(), "closed") { - break - } - errors.LogWarningInner(context.Background(), err, "failed to accepted raw connections") - continue - } - go func() { - if ln.tlsConfig != nil { - conn = tls.Server(conn, ln.tlsConfig) - } else if ln.realityConfig != nil { - if conn, err = reality.Server(conn, ln.realityConfig); err != nil { - errors.LogInfo(context.Background(), err.Error()) - return - } - } - ln.addConn(stat.Connection(conn)) - }() - } -} - -type fileLocker struct { - path string - file *os.File -} - -func (fl *fileLocker) Acquire() error { - f, err := os.Create(fl.path) - if err != nil { - return err - } - if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { - f.Close() - return errors.New("failed to lock file: ", fl.path).Base(err) - } - fl.file = f - return nil -} - -func (fl *fileLocker) Release() { - if err := unix.Flock(int(fl.file.Fd()), unix.LOCK_UN); err != nil { - errors.LogInfoInner(context.Background(), err, "failed to unlock file: ", fl.path) - } - if err := fl.file.Close(); err != nil { - errors.LogInfoInner(context.Background(), err, "failed to close file: ", fl.path) - } - if err := os.Remove(fl.path); err != nil { - errors.LogInfoInner(context.Background(), err, "failed to remove file: ", fl.path) - } -} - -func init() { - common.Must(internet.RegisterTransportListener(protocolName, Listen)) -} diff --git a/transport/internet/domainsocket/listener_test.go b/transport/internet/domainsocket/listener_test.go deleted file mode 100644 index 308fa07b..00000000 --- a/transport/internet/domainsocket/listener_test.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build !windows && !android -// +build !windows,!android - -package domainsocket_test - -import ( - "context" - "runtime" - "testing" - - "github.com/xtls/xray-core/common" - "github.com/xtls/xray-core/common/buf" - "github.com/xtls/xray-core/common/net" - "github.com/xtls/xray-core/transport/internet" - . "github.com/xtls/xray-core/transport/internet/domainsocket" - "github.com/xtls/xray-core/transport/internet/stat" -) - -func TestListen(t *testing.T) { - ctx := context.Background() - streamSettings := &internet.MemoryStreamConfig{ - ProtocolName: "domainsocket", - ProtocolSettings: &Config{ - Path: "/tmp/ts3", - }, - } - listener, err := Listen(ctx, nil, net.Port(0), streamSettings, func(conn stat.Connection) { - defer conn.Close() - - b := buf.New() - defer b.Release() - common.Must2(b.ReadFrom(conn)) - b.WriteString("Response") - - common.Must2(conn.Write(b.Bytes())) - }) - common.Must(err) - defer listener.Close() - - conn, err := Dial(ctx, net.Destination{}, streamSettings) - common.Must(err) - defer conn.Close() - - common.Must2(conn.Write([]byte("Request"))) - - b := buf.New() - defer b.Release() - common.Must2(b.ReadFrom(conn)) - - if b.String() != "RequestResponse" { - t.Error("expected response as 'RequestResponse' but got ", b.String()) - } -} - -func TestListenAbstract(t *testing.T) { - if runtime.GOOS != "linux" { - return - } - - ctx := context.Background() - streamSettings := &internet.MemoryStreamConfig{ - ProtocolName: "domainsocket", - ProtocolSettings: &Config{ - Path: "/tmp/ts3", - Abstract: true, - }, - } - listener, err := Listen(ctx, nil, net.Port(0), streamSettings, func(conn stat.Connection) { - defer conn.Close() - - b := buf.New() - defer b.Release() - common.Must2(b.ReadFrom(conn)) - b.WriteString("Response") - - common.Must2(conn.Write(b.Bytes())) - }) - common.Must(err) - defer listener.Close() - - conn, err := Dial(ctx, net.Destination{}, streamSettings) - common.Must(err) - defer conn.Close() - - common.Must2(conn.Write([]byte("Request"))) - - b := buf.New() - defer b.Release() - common.Must2(b.ReadFrom(conn)) - - if b.String() != "RequestResponse" { - t.Error("expected response as 'RequestResponse' but got ", b.String()) - } -}