mirror of https://github.com/XTLS/Xray-core
				
				
				
			XTLS Vision inbound: Use user-sent VLESS UUID for NewTrafficState()
Fixes https://github.com/XTLS/Xray-core/pull/5009#issuecomment-3194523018pull/5029/head
							parent
							
								
									337b4b814e
								
							
						
					
					
						commit
						5464862ee6
					
				| 
						 | 
				
			
			@ -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")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue