config.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package command
  2. import (
  3. "strings"
  4. "github.com/xtls/xray-core/common/net"
  5. "github.com/xtls/xray-core/features/routing"
  6. )
  7. // routingContext is an wrapper of protobuf RoutingContext as implementation of routing.Context and routing.Route.
  8. type routingContext struct {
  9. *RoutingContext
  10. }
  11. func (c routingContext) GetSourceIPs() []net.IP {
  12. return mapBytesToIPs(c.RoutingContext.GetSourceIPs())
  13. }
  14. func (c routingContext) GetSourcePort() net.Port {
  15. return net.Port(c.RoutingContext.GetSourcePort())
  16. }
  17. func (c routingContext) GetTargetIPs() []net.IP {
  18. return mapBytesToIPs(c.RoutingContext.GetTargetIPs())
  19. }
  20. func (c routingContext) GetTargetPort() net.Port {
  21. return net.Port(c.RoutingContext.GetTargetPort())
  22. }
  23. func (c routingContext) GetLocalIPs() []net.IP {
  24. return mapBytesToIPs(c.RoutingContext.GetLocalIPs())
  25. }
  26. func (c routingContext) GetLocalPort() net.Port {
  27. return net.Port(c.RoutingContext.GetLocalPort())
  28. }
  29. func (c routingContext) GetVlessRoute() net.Port {
  30. return net.Port(c.RoutingContext.GetVlessRoute())
  31. }
  32. func (c routingContext) GetRuleTag() string {
  33. return ""
  34. }
  35. // GetSkipDNSResolve is a mock implementation here to match the interface,
  36. // SkipDNSResolve is set from dns module, no use if coming from a protobuf object?
  37. // TODO: please confirm @Vigilans
  38. func (c routingContext) GetSkipDNSResolve() bool {
  39. return false
  40. }
  41. func (c routingContext) GetError() error {
  42. return nil
  43. }
  44. // AsRoutingContext converts a protobuf RoutingContext into an implementation of routing.Context.
  45. func AsRoutingContext(r *RoutingContext) routing.Context {
  46. return routingContext{r}
  47. }
  48. // AsRoutingRoute converts a protobuf RoutingContext into an implementation of routing.Route.
  49. func AsRoutingRoute(r *RoutingContext) routing.Route {
  50. return routingContext{r}
  51. }
  52. var fieldMap = map[string]func(*RoutingContext, routing.Route){
  53. "inbound": func(s *RoutingContext, r routing.Route) { s.InboundTag = r.GetInboundTag() },
  54. "network": func(s *RoutingContext, r routing.Route) { s.Network = r.GetNetwork() },
  55. "ip_source": func(s *RoutingContext, r routing.Route) { s.SourceIPs = mapIPsToBytes(r.GetSourceIPs()) },
  56. "ip_target": func(s *RoutingContext, r routing.Route) { s.TargetIPs = mapIPsToBytes(r.GetTargetIPs()) },
  57. "ip_local": func(s *RoutingContext, r routing.Route) { s.LocalIPs = mapIPsToBytes(r.GetLocalIPs()) },
  58. "port_source": func(s *RoutingContext, r routing.Route) { s.SourcePort = uint32(r.GetSourcePort()) },
  59. "port_target": func(s *RoutingContext, r routing.Route) { s.TargetPort = uint32(r.GetTargetPort()) },
  60. "port_local": func(s *RoutingContext, r routing.Route) { s.LocalPort = uint32(r.GetLocalPort()) },
  61. "domain": func(s *RoutingContext, r routing.Route) { s.TargetDomain = r.GetTargetDomain() },
  62. "protocol": func(s *RoutingContext, r routing.Route) { s.Protocol = r.GetProtocol() },
  63. "user": func(s *RoutingContext, r routing.Route) { s.User = r.GetUser() },
  64. "attributes": func(s *RoutingContext, r routing.Route) { s.Attributes = r.GetAttributes() },
  65. "outbound_group": func(s *RoutingContext, r routing.Route) { s.OutboundGroupTags = r.GetOutboundGroupTags() },
  66. "outbound": func(s *RoutingContext, r routing.Route) { s.OutboundTag = r.GetOutboundTag() },
  67. }
  68. // AsProtobufMessage takes selectors of fields and returns a function to convert routing.Route to protobuf RoutingContext.
  69. func AsProtobufMessage(fieldSelectors []string) func(routing.Route) *RoutingContext {
  70. initializers := []func(*RoutingContext, routing.Route){}
  71. for field, init := range fieldMap {
  72. if len(fieldSelectors) == 0 { // If selectors not set, retrieve all fields
  73. initializers = append(initializers, init)
  74. continue
  75. }
  76. for _, selector := range fieldSelectors {
  77. if strings.HasPrefix(field, selector) {
  78. initializers = append(initializers, init)
  79. break
  80. }
  81. }
  82. }
  83. return func(ctx routing.Route) *RoutingContext {
  84. message := new(RoutingContext)
  85. for _, init := range initializers {
  86. init(message, ctx)
  87. }
  88. return message
  89. }
  90. }
  91. func mapBytesToIPs(bytes [][]byte) []net.IP {
  92. var ips []net.IP
  93. for _, rawIP := range bytes {
  94. ips = append(ips, net.IP(rawIP))
  95. }
  96. return ips
  97. }
  98. func mapIPsToBytes(ips []net.IP) [][]byte {
  99. var bytes [][]byte
  100. for _, ip := range ips {
  101. bytes = append(bytes, []byte(ip))
  102. }
  103. return bytes
  104. }