From 1f014eb6554a7b43a0d1eb678225636043d3f4a3 Mon Sep 17 00:00:00 2001 From: Sergey Gorbunov Date: Wed, 14 May 2025 14:29:15 +0300 Subject: [PATCH] Return additional ProxySettings, SenderSettings and ReceiverSettings strucutres. --- app/commander/outbound.go | 11 +++++++++++ app/metrics/outbound.go | 11 +++++++++++ app/proxyman/command/command.go | 8 ++++++-- app/proxyman/inbound/always.go | 33 +++++++++++++++++++++++++------- app/proxyman/inbound/dynamic.go | 15 +++++++++++++++ app/proxyman/outbound/handler.go | 14 ++++++++++++++ app/reverse/portal.go | 11 +++++++++++ features/inbound/inbound.go | 5 +++++ features/outbound/outbound.go | 3 +++ 9 files changed, 102 insertions(+), 9 deletions(-) diff --git a/app/commander/outbound.go b/app/commander/outbound.go index 001423ff..7f520d74 100644 --- a/app/commander/outbound.go +++ b/app/commander/outbound.go @@ -8,6 +8,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/net/cnc" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/signal/done" "github.com/xtls/xray-core/transport" ) @@ -108,3 +109,13 @@ func (co *Outbound) Close() error { co.closed = true return co.listener.Close() } + +// SenderSettings implements outbound.Handler. +func (co *Outbound) SenderSettings() *serial.TypedMessage { + return nil +} + +// ProxySettings implements outbound.Handler. +func (co *Outbound) ProxySettings() *serial.TypedMessage { + return nil +} diff --git a/app/metrics/outbound.go b/app/metrics/outbound.go index 40f19383..e55b33fb 100644 --- a/app/metrics/outbound.go +++ b/app/metrics/outbound.go @@ -8,6 +8,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/net/cnc" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/signal/done" "github.com/xtls/xray-core/transport" ) @@ -108,3 +109,13 @@ func (co *Outbound) Close() error { co.closed = true return co.listener.Close() } + +// SenderSettings implements outbound.Handler. +func (co *Outbound) SenderSettings() *serial.TypedMessage { + return nil +} + +// ProxySettings implements outbound.Handler. +func (co *Outbound) ProxySettings() *serial.TypedMessage { + return nil +} diff --git a/app/proxyman/command/command.go b/app/proxyman/command/command.go index 94fba464..842580ee 100644 --- a/app/proxyman/command/command.go +++ b/app/proxyman/command/command.go @@ -104,7 +104,9 @@ func (s *handlerServer) ListInbounds(ctx context.Context, request *ListInboundsR response := &ListInboundsResponse{} for _, handler := range handlers { response.Inbounds = append(response.Inbounds, &core.InboundHandlerConfig{ - Tag: handler.Tag(), + Tag: handler.Tag(), + ReceiverSettings: handler.ReceiverSettings(), + ProxySettings: handler.ProxySettings(), }) } return response, nil @@ -180,7 +182,9 @@ func (s *handlerServer) ListOutbounds(ctx context.Context, request *ListOutbound response := &ListOutboundsResponse{} for _, handler := range handlers { response.Outbounds = append(response.Outbounds, &core.OutboundHandlerConfig{ - Tag: handler.Tag(), + Tag: handler.Tag(), + SenderSettings: handler.SenderSettings(), + ProxySettings: handler.ProxySettings(), }) } return response, nil diff --git a/app/proxyman/inbound/always.go b/app/proxyman/inbound/always.go index ff585c87..f6a769fb 100644 --- a/app/proxyman/inbound/always.go +++ b/app/proxyman/inbound/always.go @@ -9,11 +9,13 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/mux" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/policy" "github.com/xtls/xray-core/features/stats" "github.com/xtls/xray-core/proxy" "github.com/xtls/xray-core/transport/internet" + "google.golang.org/protobuf/proto" ) func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) { @@ -42,10 +44,12 @@ func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) } type AlwaysOnInboundHandler struct { - proxy proxy.Inbound - workers []worker - mux *mux.Server - tag string + proxyConfig interface{} + receiverConfig *proxyman.ReceiverConfig + proxy proxy.Inbound + workers []worker + mux *mux.Server + tag string } func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*AlwaysOnInboundHandler, error) { @@ -59,9 +63,11 @@ func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig * } h := &AlwaysOnInboundHandler{ - proxy: p, - mux: mux.NewServer(ctx), - tag: tag, + receiverConfig: receiverConfig, + proxyConfig: proxyConfig, + proxy: p, + mux: mux.NewServer(ctx), + tag: tag, } uplinkCounter, downlinkCounter := getStatCounter(core.MustFromContext(ctx), tag) @@ -187,3 +193,16 @@ func (h *AlwaysOnInboundHandler) Tag() string { func (h *AlwaysOnInboundHandler) GetInbound() proxy.Inbound { return h.proxy } + +// ReceiverSettings implements inbound.Handler. +func (h *AlwaysOnInboundHandler) ReceiverSettings() *serial.TypedMessage { + return serial.ToTypedMessage(h.receiverConfig) +} + +// ProxySettings implements inbound.Handler. +func (h *AlwaysOnInboundHandler) ProxySettings() *serial.TypedMessage { + if v, ok := h.proxyConfig.(proto.Message); ok { + return serial.ToTypedMessage(v) + } + return nil +} diff --git a/app/proxyman/inbound/dynamic.go b/app/proxyman/inbound/dynamic.go index 9bf49717..f14a9952 100644 --- a/app/proxyman/inbound/dynamic.go +++ b/app/proxyman/inbound/dynamic.go @@ -10,10 +10,12 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/mux" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/task" "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/proxy" "github.com/xtls/xray-core/transport/internet" + "google.golang.org/protobuf/proto" ) type DynamicInboundHandler struct { @@ -205,3 +207,16 @@ func (h *DynamicInboundHandler) GetRandomInboundProxy() (interface{}, net.Port, func (h *DynamicInboundHandler) Tag() string { return h.tag } + +// ReceiverSettings implements inbound.Handler. +func (h *DynamicInboundHandler) ReceiverSettings() *serial.TypedMessage { + return serial.ToTypedMessage(h.receiverConfig) +} + +// ProxySettings implements inbound.Handler. +func (h *DynamicInboundHandler) ProxySettings() *serial.TypedMessage { + if v, ok := h.proxyConfig.(proto.Message); ok { + return serial.ToTypedMessage(v) + } + return nil +} diff --git a/app/proxyman/outbound/handler.go b/app/proxyman/outbound/handler.go index 9a91480f..45821b0c 100644 --- a/app/proxyman/outbound/handler.go +++ b/app/proxyman/outbound/handler.go @@ -16,6 +16,7 @@ import ( "github.com/xtls/xray-core/common/mux" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/net/cnc" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/session" "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/outbound" @@ -27,6 +28,7 @@ import ( "github.com/xtls/xray-core/transport/internet/stat" "github.com/xtls/xray-core/transport/internet/tls" "github.com/xtls/xray-core/transport/pipe" + "google.golang.org/protobuf/proto" ) func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) { @@ -59,6 +61,7 @@ type Handler struct { tag string senderSettings *proxyman.SenderConfig streamSettings *internet.MemoryStreamConfig + proxyConfig proto.Message proxy proxy.Outbound outboundManager outbound.Manager mux *mux.ClientManager @@ -101,6 +104,7 @@ func NewHandler(ctx context.Context, config *core.OutboundHandlerConfig) (outbou if err != nil { return nil, err } + h.proxyConfig = proxyConfig rawProxyHandler, err := common.CreateObject(ctx, proxyConfig) if err != nil { @@ -349,6 +353,16 @@ func (h *Handler) Close() error { return nil } +// SenderSettings implements outbound.Handler. +func (h *Handler) SenderSettings() *serial.TypedMessage { + return serial.ToTypedMessage(h.senderSettings) +} + +// ProxySettings implements outbound.Handler. +func (h *Handler) ProxySettings() *serial.TypedMessage { + return serial.ToTypedMessage(h.proxyConfig) +} + func ParseRandomIP(addr net.Address, prefix string) net.Address { _, ipnet, _ := gonet.ParseCIDR(addr.IP().String() + "/" + prefix) diff --git a/app/reverse/portal.go b/app/reverse/portal.go index d57ac29a..818c5718 100644 --- a/app/reverse/portal.go +++ b/app/reverse/portal.go @@ -10,6 +10,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/mux" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/session" "github.com/xtls/xray-core/common/task" "github.com/xtls/xray-core/features/outbound" @@ -111,6 +112,16 @@ func (o *Outbound) Close() error { return nil } +// SenderSettings implements outbound.Handler. +func (o *Outbound) SenderSettings() *serial.TypedMessage { + return nil +} + +// ProxySettings implements outbound.Handler. +func (o *Outbound) ProxySettings() *serial.TypedMessage { + return nil +} + type StaticMuxPicker struct { access sync.Mutex workers []*PortalWorker diff --git a/features/inbound/inbound.go b/features/inbound/inbound.go index fbe7d149..1d3ba7b1 100644 --- a/features/inbound/inbound.go +++ b/features/inbound/inbound.go @@ -5,6 +5,7 @@ import ( "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/features" ) @@ -15,6 +16,10 @@ type Handler interface { common.Runnable // The tag of this handler. Tag() string + // Returns the active receiver settings. + ReceiverSettings() *serial.TypedMessage + // Returns the active proxy settings. + ProxySettings() *serial.TypedMessage // Deprecated: Do not use in new code. GetRandomInboundProxy() (interface{}, net.Port, int) diff --git a/features/outbound/outbound.go b/features/outbound/outbound.go index e8d37002..ecde6e1e 100644 --- a/features/outbound/outbound.go +++ b/features/outbound/outbound.go @@ -4,6 +4,7 @@ import ( "context" "github.com/xtls/xray-core/common" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/features" "github.com/xtls/xray-core/transport" ) @@ -15,6 +16,8 @@ type Handler interface { common.Runnable Tag() string Dispatch(ctx context.Context, link *transport.Link) + SenderSettings() *serial.TypedMessage + ProxySettings() *serial.TypedMessage } type HandlerSelector interface {