mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-08-22 01:26:49 +08:00
XTLS Vision inbound: Use user-sent VLESS UUID for NewTrafficState()
Fixes https://github.com/XTLS/Xray-core/pull/5009#issuecomment-3194523018
This commit is contained in:
@@ -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.
|
// 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()
|
buffer := buf.StackNew()
|
||||||
defer buffer.Release()
|
defer buffer.Release()
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat
|
|||||||
request.Version = first.Byte(0)
|
request.Version = first.Byte(0)
|
||||||
} else {
|
} else {
|
||||||
if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
|
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)
|
request.Version = buffer.Byte(0)
|
||||||
}
|
}
|
||||||
@@ -87,13 +87,13 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat
|
|||||||
} else {
|
} else {
|
||||||
buffer.Clear()
|
buffer.Clear()
|
||||||
if _, err := buffer.ReadFullFrom(reader, 16); err != nil {
|
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())
|
copy(id[:], buffer.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
if request.User = validator.Get(id); request.User == nil {
|
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 {
|
if isfb {
|
||||||
@@ -102,12 +102,12 @@ func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validat
|
|||||||
|
|
||||||
requestAddons, err := DecodeHeaderAddons(&buffer, reader)
|
requestAddons, err := DecodeHeaderAddons(&buffer, reader)
|
||||||
if err != nil {
|
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()
|
buffer.Clear()
|
||||||
if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
|
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))
|
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 {
|
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:
|
default:
|
||||||
return 0, nil, nil, isfb, errors.New("invalid request version")
|
return nil, nil, nil, isfb, errors.New("invalid request version")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -217,7 +217,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||||||
Buffer: buf.MultiBuffer{first},
|
Buffer: buf.MultiBuffer{first},
|
||||||
}
|
}
|
||||||
|
|
||||||
var vlessRoute byte
|
var userSentID []byte // not MemoryAccount.ID
|
||||||
var request *protocol.RequestHeader
|
var request *protocol.RequestHeader
|
||||||
var requestAddons *encoding.Addons
|
var requestAddons *encoding.Addons
|
||||||
var err error
|
var err error
|
||||||
@@ -228,7 +228,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||||||
if isfb && firstLen < 18 {
|
if isfb && firstLen < 18 {
|
||||||
err = errors.New("fallback directly")
|
err = errors.New("fallback directly")
|
||||||
} else {
|
} 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 {
|
if err != nil {
|
||||||
@@ -456,7 +456,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
|||||||
}
|
}
|
||||||
inbound.Name = "vless"
|
inbound.Name = "vless"
|
||||||
inbound.User = request.User
|
inbound.User = request.User
|
||||||
inbound.VlessRoute = net.Port(vlessRoute)
|
inbound.VlessRoute = net.Port(userSentID[15])
|
||||||
|
|
||||||
account := request.User.Account.(*vless.MemoryAccount)
|
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)
|
serverReader := link.Reader // .(*pipe.Reader)
|
||||||
serverWriter := link.Writer // .(*pipe.Writer)
|
serverWriter := link.Writer // .(*pipe.Writer)
|
||||||
trafficState := proxy.NewTrafficState(account.ID.Bytes())
|
trafficState := proxy.NewTrafficState(userSentID)
|
||||||
postRequest := func() error {
|
postRequest := func() error {
|
||||||
defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly)
|
defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user