config.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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) GetRuleTag() string {
  24. return ""
  25. }
  26. // GetSkipDNSResolve is a mock implementation here to match the interface,
  27. // SkipDNSResolve is set from dns module, no use if coming from a protobuf object?
  28. // TODO: please confirm @Vigilans
  29. func (c routingContext) GetSkipDNSResolve() bool {
  30. return false
  31. }
  32. // AsRoutingContext converts a protobuf RoutingContext into an implementation of routing.Context.
  33. func AsRoutingContext(r *RoutingContext) routing.Context {
  34. return routingContext{r}
  35. }
  36. // AsRoutingRoute converts a protobuf RoutingContext into an implementation of routing.Route.
  37. func AsRoutingRoute(r *RoutingContext) routing.Route {
  38. return routingContext{r}
  39. }
  40. var fieldMap = map[string]func(*RoutingContext, routing.Route){
  41. "inbound": func(s *RoutingContext, r routing.Route) { s.InboundTag = r.GetInboundTag() },
  42. "network": func(s *RoutingContext, r routing.Route) { s.Network = r.GetNetwork() },
  43. "ip_source": func(s *RoutingContext, r routing.Route) { s.SourceIPs = mapIPsToBytes(r.GetSourceIPs()) },
  44. "ip_target": func(s *RoutingContext, r routing.Route) { s.TargetIPs = mapIPsToBytes(r.GetTargetIPs()) },
  45. "port_source": func(s *RoutingContext, r routing.Route) { s.SourcePort = uint32(r.GetSourcePort()) },
  46. "port_target": func(s *RoutingContext, r routing.Route) { s.TargetPort = uint32(r.GetTargetPort()) },
  47. "domain": func(s *RoutingContext, r routing.Route) { s.TargetDomain = r.GetTargetDomain() },
  48. "protocol": func(s *RoutingContext, r routing.Route) { s.Protocol = r.GetProtocol() },
  49. "user": func(s *RoutingContext, r routing.Route) { s.User = r.GetUser() },
  50. "attributes": func(s *RoutingContext, r routing.Route) { s.Attributes = r.GetAttributes() },
  51. "outbound_group": func(s *RoutingContext, r routing.Route) { s.OutboundGroupTags = r.GetOutboundGroupTags() },
  52. "outbound": func(s *RoutingContext, r routing.Route) { s.OutboundTag = r.GetOutboundTag() },
  53. }
  54. // AsProtobufMessage takes selectors of fields and returns a function to convert routing.Route to protobuf RoutingContext.
  55. func AsProtobufMessage(fieldSelectors []string) func(routing.Route) *RoutingContext {
  56. initializers := []func(*RoutingContext, routing.Route){}
  57. for field, init := range fieldMap {
  58. if len(fieldSelectors) == 0 { // If selectors not set, retrieve all fields
  59. initializers = append(initializers, init)
  60. continue
  61. }
  62. for _, selector := range fieldSelectors {
  63. if strings.HasPrefix(field, selector) {
  64. initializers = append(initializers, init)
  65. break
  66. }
  67. }
  68. }
  69. return func(ctx routing.Route) *RoutingContext {
  70. message := new(RoutingContext)
  71. for _, init := range initializers {
  72. init(message, ctx)
  73. }
  74. return message
  75. }
  76. }
  77. func mapBytesToIPs(bytes [][]byte) []net.IP {
  78. var ips []net.IP
  79. for _, rawIP := range bytes {
  80. ips = append(ips, net.IP(rawIP))
  81. }
  82. return ips
  83. }
  84. func mapIPsToBytes(ips []net.IP) [][]byte {
  85. var bytes [][]byte
  86. for _, ip := range ips {
  87. bytes = append(bytes, []byte(ip))
  88. }
  89. return bytes
  90. }