mirror of https://github.com/XTLS/Xray-core
				
				
				
			VLESS practice: Use user-sent VLESS UUID's last byte as `vlessRoute` for `routing` `rules`
https://github.com/XTLS/Xray-core/pull/5009#issuecomment-3194262087pull/5242/head
							parent
							
								
									de23e51077
								
							
						
					
					
						commit
						105b306d07
					
				| 
						 | 
				
			
			@ -44,6 +44,7 @@ type RoutingContext struct {
 | 
			
		|||
	OutboundTag       string            `protobuf:"bytes,12,opt,name=OutboundTag,proto3" json:"OutboundTag,omitempty"`
 | 
			
		||||
	LocalIPs          [][]byte          `protobuf:"bytes,13,rep,name=LocalIPs,proto3" json:"LocalIPs,omitempty"`
 | 
			
		||||
	LocalPort         uint32            `protobuf:"varint,14,opt,name=LocalPort,proto3" json:"LocalPort,omitempty"`
 | 
			
		||||
	VlessRoute        uint32            `protobuf:"varint,15,opt,name=VlessRoute,proto3" json:"VlessRoute,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RoutingContext) Reset() {
 | 
			
		||||
| 
						 | 
				
			
			@ -174,6 +175,13 @@ func (x *RoutingContext) GetLocalPort() uint32 {
 | 
			
		|||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RoutingContext) GetVlessRoute() uint32 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.VlessRoute
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SubscribeRoutingStatsRequest subscribes to routing statistics channel if
 | 
			
		||||
// opened by xray-core.
 | 
			
		||||
// * FieldSelectors selects a subset of fields in routing statistics to return.
 | 
			
		||||
| 
						 | 
				
			
			@ -843,7 +851,7 @@ var file_app_router_command_command_proto_rawDesc = []byte{
 | 
			
		|||
	0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e,
 | 
			
		||||
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65,
 | 
			
		||||
	0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,
 | 
			
		||||
	0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x04, 0x0a, 0x0e, 0x52, 0x6f, 0x75,
 | 
			
		||||
	0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf6, 0x04, 0x0a, 0x0e, 0x52, 0x6f, 0x75,
 | 
			
		||||
	0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x49,
 | 
			
		||||
	0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
			
		||||
	0x0a, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e,
 | 
			
		||||
| 
						 | 
				
			
			@ -877,7 +885,9 @@ var file_app_router_command_command_proto_rawDesc = []byte{
 | 
			
		|||
	0x6c, 0x49, 0x50, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61,
 | 
			
		||||
	0x6c, 0x49, 0x50, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72,
 | 
			
		||||
	0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f,
 | 
			
		||||
	0x72, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
 | 
			
		||||
	0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65,
 | 
			
		||||
	0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x75,
 | 
			
		||||
	0x74, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
 | 
			
		||||
	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
 | 
			
		||||
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ message RoutingContext {
 | 
			
		|||
  string OutboundTag = 12;
 | 
			
		||||
  repeated bytes LocalIPs = 13;
 | 
			
		||||
  uint32 LocalPort = 14;
 | 
			
		||||
  uint32 VlessRoute = 15;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SubscribeRoutingStatsRequest subscribes to routing statistics channel if
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,10 @@ func (c routingContext) GetLocalPort() net.Port {
 | 
			
		|||
	return net.Port(c.RoutingContext.GetLocalPort())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c routingContext) GetVlessRoute() net.Port {
 | 
			
		||||
	return net.Port(c.RoutingContext.GetVlessRoute())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c routingContext) GetRuleTag() string {
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -166,6 +166,8 @@ func (v *PortMatcher) Apply(ctx routing.Context) bool {
 | 
			
		|||
		return v.port.Contains(ctx.GetSourcePort())
 | 
			
		||||
	case "target":
 | 
			
		||||
		return v.port.Contains(ctx.GetTargetPort())
 | 
			
		||||
	case "vlessRoute":
 | 
			
		||||
		return v.port.Contains(ctx.GetVlessRoute())
 | 
			
		||||
	default:
 | 
			
		||||
		panic("unreachable, asType should be local or source or target")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,6 +45,10 @@ func (rr *RoutingRule) BuildCondition() (Condition, error) {
 | 
			
		|||
		conds.Add(NewUserMatcher(rr.UserEmail))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rr.VlessRouteList != nil {
 | 
			
		||||
		conds.Add(NewPortMatcher(rr.VlessRouteList, "vlessRoute"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(rr.InboundTag) > 0 {
 | 
			
		||||
		conds.Add(NewInboundTagMatcher(rr.InboundTag))
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -493,6 +493,7 @@ type RoutingRule struct {
 | 
			
		|||
	Attributes     map[string]string `protobuf:"bytes,15,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 | 
			
		||||
	LocalGeoip     []*GeoIP          `protobuf:"bytes,17,rep,name=local_geoip,json=localGeoip,proto3" json:"local_geoip,omitempty"`
 | 
			
		||||
	LocalPortList  *net.PortList     `protobuf:"bytes,18,opt,name=local_port_list,json=localPortList,proto3" json:"local_port_list,omitempty"`
 | 
			
		||||
	VlessRouteList *net.PortList     `protobuf:"bytes,20,opt,name=vless_route_list,json=vlessRouteList,proto3" json:"vless_route_list,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RoutingRule) Reset() {
 | 
			
		||||
| 
						 | 
				
			
			@ -637,6 +638,13 @@ func (x *RoutingRule) GetLocalPortList() *net.PortList {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RoutingRule) GetVlessRouteList() *net.PortList {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.VlessRouteList
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type isRoutingRule_TargetTag interface {
 | 
			
		||||
	isRoutingRule_TargetTag()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1077,7 +1085,7 @@ var file_app_router_config_proto_rawDesc = []byte{
 | 
			
		|||
	0x6f, 0x53, 0x69, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x6e, 0x74,
 | 
			
		||||
	0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e,
 | 
			
		||||
	0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x53, 0x69,
 | 
			
		||||
	0x74, 0x65, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xa3, 0x06, 0x0a, 0x0b, 0x52, 0x6f,
 | 
			
		||||
	0x74, 0x65, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xe8, 0x06, 0x0a, 0x0b, 0x52, 0x6f,
 | 
			
		||||
	0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x74, 0x61, 0x67,
 | 
			
		||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x25, 0x0a,
 | 
			
		||||
	0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x0c,
 | 
			
		||||
| 
						 | 
				
			
			@ -1123,66 +1131,71 @@ var file_app_router_config_proto_rawDesc = []byte{
 | 
			
		|||
	0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e,
 | 
			
		||||
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4c,
 | 
			
		||||
	0x69, 0x73, 0x74, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69,
 | 
			
		||||
	0x73, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
 | 
			
		||||
	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
 | 
			
		||||
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
 | 
			
		||||
	0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x22,
 | 
			
		||||
	0xdc, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c,
 | 
			
		||||
	0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
 | 
			
		||||
	0x74, 0x61, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f,
 | 
			
		||||
	0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10,
 | 
			
		||||
	0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72,
 | 
			
		||||
	0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x4d, 0x0a, 0x11,
 | 
			
		||||
	0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
 | 
			
		||||
	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63,
 | 
			
		||||
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70,
 | 
			
		||||
	0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x73, 0x74, 0x72, 0x61, 0x74,
 | 
			
		||||
	0x65, 0x67, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66,
 | 
			
		||||
	0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x67, 0x22, 0x54,
 | 
			
		||||
	0x0a, 0x0e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74,
 | 
			
		||||
	0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
 | 
			
		||||
	0x52, 0x06, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63,
 | 
			
		||||
	0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14,
 | 
			
		||||
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76,
 | 
			
		||||
	0x61, 0x6c, 0x75, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x17, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
 | 
			
		||||
	0x79, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
 | 
			
		||||
	0x12, 0x35, 0x0a, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
 | 
			
		||||
	0x1f, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65,
 | 
			
		||||
	0x72, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74,
 | 
			
		||||
	0x52, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x65, 0x6c,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65,
 | 
			
		||||
	0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
 | 
			
		||||
	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
 | 
			
		||||
	0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x54, 0x54, 0x18, 0x05, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x54, 0x54, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x6c,
 | 
			
		||||
	0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x74, 0x6f,
 | 
			
		||||
	0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x9b, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66,
 | 
			
		||||
	0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72,
 | 
			
		||||
	0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x78, 0x72,
 | 
			
		||||
	0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f,
 | 
			
		||||
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74,
 | 
			
		||||
	0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74,
 | 
			
		||||
	0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28,
 | 
			
		||||
	0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75,
 | 
			
		||||
	0x74, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52,
 | 
			
		||||
	0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69,
 | 
			
		||||
	0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
 | 
			
		||||
	0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e,
 | 
			
		||||
	0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x62,
 | 
			
		||||
	0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x47, 0x0a, 0x0e,
 | 
			
		||||
	0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x08,
 | 
			
		||||
	0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x49,
 | 
			
		||||
	0x70, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x70, 0x49, 0x66, 0x4e, 0x6f, 0x6e, 0x4d, 0x61,
 | 
			
		||||
	0x74, 0x63, 0x68, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x70, 0x4f, 0x6e, 0x44, 0x65, 0x6d,
 | 
			
		||||
	0x61, 0x6e, 0x64, 0x10, 0x03, 0x42, 0x4f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61,
 | 
			
		||||
	0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x24,
 | 
			
		||||
	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, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f,
 | 
			
		||||
	0x75, 0x74, 0x65, 0x72, 0xaa, 0x02, 0x0f, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x41, 0x70, 0x70, 0x2e,
 | 
			
		||||
	0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
	0x73, 0x74, 0x12, 0x43, 0x0a, 0x10, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x74,
 | 
			
		||||
	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78,
 | 
			
		||||
	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50,
 | 
			
		||||
	0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x6f,
 | 
			
		||||
	0x75, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69,
 | 
			
		||||
	0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
 | 
			
		||||
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
 | 
			
		||||
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
 | 
			
		||||
	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
 | 
			
		||||
	0x5f, 0x74, 0x61, 0x67, 0x22, 0xdc, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69,
 | 
			
		||||
	0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20,
 | 
			
		||||
	0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x62,
 | 
			
		||||
	0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20,
 | 
			
		||||
	0x03, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x65, 0x6c,
 | 
			
		||||
	0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
 | 
			
		||||
	0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
 | 
			
		||||
	0x79, 0x12, 0x4d, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x73, 0x65,
 | 
			
		||||
	0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78,
 | 
			
		||||
	0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61,
 | 
			
		||||
	0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,
 | 
			
		||||
	0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
 | 
			
		||||
	0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x67,
 | 
			
		||||
	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b,
 | 
			
		||||
	0x54, 0x61, 0x67, 0x22, 0x54, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x57,
 | 
			
		||||
	0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x14, 0x0a,
 | 
			
		||||
	0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61,
 | 
			
		||||
	0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x17, 0x53, 0x74,
 | 
			
		||||
	0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x43,
 | 
			
		||||
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02,
 | 
			
		||||
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e,
 | 
			
		||||
	0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x57,
 | 
			
		||||
	0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09,
 | 
			
		||||
	0x62, 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52,
 | 
			
		||||
	0x09, 0x62, 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78,
 | 
			
		||||
	0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78,
 | 
			
		||||
	0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x54, 0x54,
 | 
			
		||||
	0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x54, 0x54, 0x12, 0x1c,
 | 
			
		||||
	0x0a, 0x09, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x02, 0x52, 0x09, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x9b, 0x02, 0x0a,
 | 
			
		||||
	0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69,
 | 
			
		||||
	0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
 | 
			
		||||
	0x32, 0x26, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74,
 | 
			
		||||
	0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
 | 
			
		||||
	0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
 | 
			
		||||
	0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65,
 | 
			
		||||
	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70,
 | 
			
		||||
	0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67,
 | 
			
		||||
	0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x62, 0x61,
 | 
			
		||||
	0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03,
 | 
			
		||||
	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
 | 
			
		||||
	0x75, 0x74, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75,
 | 
			
		||||
	0x6c, 0x65, 0x52, 0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c,
 | 
			
		||||
	0x65, 0x22, 0x47, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74,
 | 
			
		||||
	0x65, 0x67, 0x79, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x09, 0x0a,
 | 
			
		||||
	0x05, 0x55, 0x73, 0x65, 0x49, 0x70, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x70, 0x49, 0x66,
 | 
			
		||||
	0x4e, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x70,
 | 
			
		||||
	0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x42, 0x4f, 0x0a, 0x13, 0x63, 0x6f,
 | 
			
		||||
	0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65,
 | 
			
		||||
	0x72, 0x50, 0x01, 0x5a, 0x24, 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, 0x61,
 | 
			
		||||
	0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0xaa, 0x02, 0x0f, 0x58, 0x72, 0x61, 0x79,
 | 
			
		||||
	0x2e, 0x41, 0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
			
		||||
	0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			@ -1235,16 +1248,17 @@ var file_app_router_config_proto_depIdxs = []int32{
 | 
			
		|||
	14, // 12: xray.app.router.RoutingRule.attributes:type_name -> xray.app.router.RoutingRule.AttributesEntry
 | 
			
		||||
	4,  // 13: xray.app.router.RoutingRule.local_geoip:type_name -> xray.app.router.GeoIP
 | 
			
		||||
	15, // 14: xray.app.router.RoutingRule.local_port_list:type_name -> xray.common.net.PortList
 | 
			
		||||
	17, // 15: xray.app.router.BalancingRule.strategy_settings:type_name -> xray.common.serial.TypedMessage
 | 
			
		||||
	10, // 16: xray.app.router.StrategyLeastLoadConfig.costs:type_name -> xray.app.router.StrategyWeight
 | 
			
		||||
	1,  // 17: xray.app.router.Config.domain_strategy:type_name -> xray.app.router.Config.DomainStrategy
 | 
			
		||||
	8,  // 18: xray.app.router.Config.rule:type_name -> xray.app.router.RoutingRule
 | 
			
		||||
	9,  // 19: xray.app.router.Config.balancing_rule:type_name -> xray.app.router.BalancingRule
 | 
			
		||||
	20, // [20:20] is the sub-list for method output_type
 | 
			
		||||
	20, // [20:20] is the sub-list for method input_type
 | 
			
		||||
	20, // [20:20] is the sub-list for extension type_name
 | 
			
		||||
	20, // [20:20] is the sub-list for extension extendee
 | 
			
		||||
	0,  // [0:20] is the sub-list for field type_name
 | 
			
		||||
	15, // 15: xray.app.router.RoutingRule.vless_route_list:type_name -> xray.common.net.PortList
 | 
			
		||||
	17, // 16: xray.app.router.BalancingRule.strategy_settings:type_name -> xray.common.serial.TypedMessage
 | 
			
		||||
	10, // 17: xray.app.router.StrategyLeastLoadConfig.costs:type_name -> xray.app.router.StrategyWeight
 | 
			
		||||
	1,  // 18: xray.app.router.Config.domain_strategy:type_name -> xray.app.router.Config.DomainStrategy
 | 
			
		||||
	8,  // 19: xray.app.router.Config.rule:type_name -> xray.app.router.RoutingRule
 | 
			
		||||
	9,  // 20: xray.app.router.Config.balancing_rule:type_name -> xray.app.router.BalancingRule
 | 
			
		||||
	21, // [21:21] is the sub-list for method output_type
 | 
			
		||||
	21, // [21:21] is the sub-list for method input_type
 | 
			
		||||
	21, // [21:21] is the sub-list for extension type_name
 | 
			
		||||
	21, // [21:21] is the sub-list for extension extendee
 | 
			
		||||
	0,  // [0:21] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { file_app_router_config_proto_init() }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,6 +111,8 @@ message RoutingRule {
 | 
			
		|||
 | 
			
		||||
  repeated GeoIP local_geoip = 17;
 | 
			
		||||
  xray.common.net.PortList local_port_list = 18;
 | 
			
		||||
 | 
			
		||||
  xray.common.net.PortList vless_route_list = 20;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message BalancingRule {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,8 @@ type Inbound struct {
 | 
			
		|||
	Name string
 | 
			
		||||
	// User is the user that authenticates for the inbound. May be nil if the protocol allows anonymous traffic.
 | 
			
		||||
	User *protocol.MemoryUser
 | 
			
		||||
	// VlessRoute is the user-sent VLESS UUID's last byte.
 | 
			
		||||
	VlessRoute net.Port
 | 
			
		||||
	// Conn is actually internet.Connection. May be nil.
 | 
			
		||||
	Conn net.Conn
 | 
			
		||||
	// Timer of the inbound buf copier. May be nil.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,9 @@ type Context interface {
 | 
			
		|||
	// GetUser returns the user email from the connection content, if exists.
 | 
			
		||||
	GetUser() string
 | 
			
		||||
 | 
			
		||||
	// GetVlessRoute returns the user-sent VLESS UUID's last byte, if exists.
 | 
			
		||||
	GetVlessRoute() net.Port
 | 
			
		||||
 | 
			
		||||
	// GetAttributes returns extra attributes from the conneciont content.
 | 
			
		||||
	GetAttributes() map[string]string
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -128,6 +128,14 @@ func (ctx *Context) GetUser() string {
 | 
			
		|||
	return ctx.Inbound.User.Email
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetVlessRoute implements routing.Context.
 | 
			
		||||
func (ctx *Context) GetVlessRoute() net.Port {
 | 
			
		||||
	if ctx.Inbound == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return ctx.Inbound.VlessRoute
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetAttributes implements routing.Context.
 | 
			
		||||
func (ctx *Context) GetAttributes() map[string]string {
 | 
			
		||||
	if ctx.Content == nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -531,6 +531,7 @@ func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
 | 
			
		|||
		Source     *StringList       `json:"source"`
 | 
			
		||||
		SourcePort *PortList         `json:"sourcePort"`
 | 
			
		||||
		User       *StringList       `json:"user"`
 | 
			
		||||
		VlessRoute *PortList         `json:"vlessRoute"`
 | 
			
		||||
		InboundTag *StringList       `json:"inboundTag"`
 | 
			
		||||
		Protocols  *StringList       `json:"protocol"`
 | 
			
		||||
		Attributes map[string]string `json:"attrs"`
 | 
			
		||||
| 
						 | 
				
			
			@ -628,6 +629,10 @@ func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rawFieldRule.VlessRoute != nil {
 | 
			
		||||
		rule.VlessRouteList = rawFieldRule.VlessRoute.Build()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rawFieldRule.InboundTag != nil {
 | 
			
		||||
		for _, s := range *rawFieldRule.InboundTag {
 | 
			
		||||
			rule.InboundTag = append(rule.InboundTag, s)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) (*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 nil, nil, false, errors.New("failed to read request version").Base(err)
 | 
			
		||||
			return 0, 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 nil, nil, false, errors.New("failed to read request user id").Base(err)
 | 
			
		||||
				return 0, 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 nil, nil, isfb, errors.New("invalid request user id")
 | 
			
		||||
			return 0, 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 nil, nil, false, errors.New("failed to decode request header addons").Base(err)
 | 
			
		||||
			return 0, nil, nil, false, errors.New("failed to decode request header addons").Base(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		buffer.Clear()
 | 
			
		||||
		if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
 | 
			
		||||
			return nil, nil, false, errors.New("failed to read request command").Base(err)
 | 
			
		||||
			return 0, 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 nil, nil, false, errors.New("invalid request address")
 | 
			
		||||
			return 0, nil, nil, false, errors.New("invalid request address")
 | 
			
		||||
		}
 | 
			
		||||
		return request, requestAddons, false, nil
 | 
			
		||||
		return id[15], request, requestAddons, false, nil
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, nil, isfb, errors.New("invalid request version")
 | 
			
		||||
		return 0, nil, nil, isfb, errors.New("invalid request version")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ func TestRequestSerialization(t *testing.T) {
 | 
			
		|||
	Validator := new(vless.MemoryValidator)
 | 
			
		||||
	Validator.Add(user)
 | 
			
		||||
 | 
			
		||||
	actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	_, actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	common.Must(err)
 | 
			
		||||
 | 
			
		||||
	if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ func TestInvalidRequest(t *testing.T) {
 | 
			
		|||
	Validator := new(vless.MemoryValidator)
 | 
			
		||||
	Validator.Add(user)
 | 
			
		||||
 | 
			
		||||
	_, _, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	_, _, _, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Error("nil error")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ func TestMuxRequest(t *testing.T) {
 | 
			
		|||
	Validator := new(vless.MemoryValidator)
 | 
			
		||||
	Validator.Add(user)
 | 
			
		||||
 | 
			
		||||
	actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	_, actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator)
 | 
			
		||||
	common.Must(err)
 | 
			
		||||
 | 
			
		||||
	if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,6 +217,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
 | 
			
		|||
		Buffer: buf.MultiBuffer{first},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var vlessRoute byte
 | 
			
		||||
	var request *protocol.RequestHeader
 | 
			
		||||
	var requestAddons *encoding.Addons
 | 
			
		||||
	var err error
 | 
			
		||||
| 
						 | 
				
			
			@ -227,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 {
 | 
			
		||||
		request, requestAddons, isfb, err = encoding.DecodeRequestHeader(isfb, first, reader, h.validator)
 | 
			
		||||
		vlessRoute, request, requestAddons, isfb, err = encoding.DecodeRequestHeader(isfb, first, reader, h.validator)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -455,6 +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)
 | 
			
		||||
 | 
			
		||||
	account := request.User.Account.(*vless.MemoryAccount)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ func (v *MemoryValidator) Add(u *protocol.MemoryUser) error {
 | 
			
		|||
			return errors.New("User ", u.Email, " already exists.")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	v.users.Store(u.Account.(*MemoryAccount).ID.UUID(), u)
 | 
			
		||||
	v.users.Store([15]byte(u.Account.(*MemoryAccount).ID.Bytes()), u)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,13 +48,13 @@ func (v *MemoryValidator) Del(e string) error {
 | 
			
		|||
		return errors.New("User ", e, " not found.")
 | 
			
		||||
	}
 | 
			
		||||
	v.email.Delete(le)
 | 
			
		||||
	v.users.Delete(u.(*protocol.MemoryUser).Account.(*MemoryAccount).ID.UUID())
 | 
			
		||||
	v.users.Delete([15]byte(u.(*protocol.MemoryUser).Account.(*MemoryAccount).ID.Bytes()))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get a VLESS user with UUID, nil if user doesn't exist.
 | 
			
		||||
func (v *MemoryValidator) Get(id uuid.UUID) *protocol.MemoryUser {
 | 
			
		||||
	u, _ := v.users.Load(id)
 | 
			
		||||
	u, _ := v.users.Load([15]byte(id[:]))
 | 
			
		||||
	if u != nil {
 | 
			
		||||
		return u.(*protocol.MemoryUser)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue