config.go 3.6 KB

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