From 5464862ee6ba7a994e2d2a2d227387c8ad084822 Mon Sep 17 00:00:00 2001 From: RPRX <63339210+RPRX@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:13:56 +0000 Subject: [PATCH] XTLS Vision inbound: Use user-sent VLESS UUID for NewTrafficState() Fixes https://github.com/XTLS/Xray-core/pull/5009#issuecomment-3194523018 --- proxy/vless/encoding/encoding.go | 18 +++++++++--------- proxy/vless/inbound/inbound.go | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/proxy/vless/encoding/encoding.go b/proxy/vless/encoding/encoding.go index 68050117..61bfb911 100644 --- a/proxy/vless/encoding/encoding.go +++ b/proxy/vless/encoding/encoding.go @@ -62,7 +62,7 @@ func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requ } // DecodeRequestHeader decodes and returns (if successful) a RequestHeader from an input stream. -func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator vless.Validator) (byte, *protocol.RequestHeader, *Addons, bool, error) { +func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator vless.Validator) ([]byte, *protocol.RequestHeader, *Addons, bool, error) { buffer := buf.StackNew() defer buffer.Release() @@ -72,7 +72,7 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat request.Version = first.Byte(0) } else { if _, err := buffer.ReadFullFrom(reader, 1); err != nil { - return 0, nil, nil, false, errors.New("failed to read request version").Base(err) + return nil, nil, nil, false, errors.New("failed to read request version").Base(err) } request.Version = buffer.Byte(0) } @@ -87,13 +87,13 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat } else { buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 16); err != nil { - return 0, nil, nil, false, errors.New("failed to read request user id").Base(err) + return nil, nil, nil, false, errors.New("failed to read request user id").Base(err) } copy(id[:], buffer.Bytes()) } if request.User = validator.Get(id); request.User == nil { - return 0, nil, nil, isfb, errors.New("invalid request user id") + return nil, nil, nil, isfb, errors.New("invalid request user id") } if isfb { @@ -102,12 +102,12 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat requestAddons, err := DecodeHeaderAddons(&buffer, reader) if err != nil { - return 0, nil, nil, false, errors.New("failed to decode request header addons").Base(err) + return nil, nil, nil, false, errors.New("failed to decode request header addons").Base(err) } buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 1); err != nil { - return 0, nil, nil, false, errors.New("failed to read request command").Base(err) + return nil, nil, nil, false, errors.New("failed to read request command").Base(err) } request.Command = protocol.RequestCommand(buffer.Byte(0)) @@ -122,11 +122,11 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat } } if request.Address == nil { - return 0, nil, nil, false, errors.New("invalid request address") + return nil, nil, nil, false, errors.New("invalid request address") } - return id[15], request, requestAddons, false, nil + return id[:], request, requestAddons, false, nil default: - return 0, nil, nil, isfb, errors.New("invalid request version") + return nil, nil, nil, isfb, errors.New("invalid request version") } } diff --git a/proxy/vless/inbound/inbound.go b/proxy/vless/inbound/inbound.go index 41ca5197..5359405e 100644 --- a/proxy/vless/inbound/inbound.go +++ b/proxy/vless/inbound/inbound.go @@ -217,7 +217,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s Buffer: buf.MultiBuffer{first}, } - var vlessRoute byte + var userSentID []byte // not MemoryAccount.ID var request *protocol.RequestHeader var requestAddons *encoding.Addons var err error @@ -228,7 +228,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s if isfb && firstLen < 18 { err = errors.New("fallback directly") } else { - vlessRoute, request, requestAddons, isfb, err = encoding.DecodeRequestHeader(isfb, first, reader, h.validator) + userSentID, request, requestAddons, isfb, err = encoding.DecodeRequestHeader(isfb, first, reader, h.validator) } if err != nil { @@ -456,7 +456,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s } inbound.Name = "vless" inbound.User = request.User - inbound.VlessRoute = net.Port(vlessRoute) + inbound.VlessRoute = net.Port(userSentID[15]) account := request.User.Account.(*vless.MemoryAccount) @@ -532,7 +532,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s serverReader := link.Reader // .(*pipe.Reader) serverWriter := link.Writer // .(*pipe.Writer) - trafficState := proxy.NewTrafficState(account.ID.Bytes()) + trafficState := proxy.NewTrafficState(userSentID) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly)