config.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package internet
  2. import (
  3. "context"
  4. "github.com/v2fly/v2ray-core/v4/common"
  5. "github.com/v2fly/v2ray-core/v4/common/serial"
  6. "github.com/v2fly/v2ray-core/v4/features"
  7. )
  8. type ConfigCreator func() interface{}
  9. var (
  10. globalTransportConfigCreatorCache = make(map[string]ConfigCreator)
  11. globalTransportSettings []*TransportConfig
  12. )
  13. const unknownProtocol = "unknown"
  14. func transportProtocolToString(protocol TransportProtocol) string {
  15. switch protocol {
  16. case TransportProtocol_TCP:
  17. return "tcp"
  18. case TransportProtocol_UDP:
  19. return "udp"
  20. case TransportProtocol_HTTP:
  21. return "http"
  22. case TransportProtocol_MKCP:
  23. return "mkcp"
  24. case TransportProtocol_WebSocket:
  25. return "websocket"
  26. case TransportProtocol_DomainSocket:
  27. return "domainsocket"
  28. default:
  29. return unknownProtocol
  30. }
  31. }
  32. func RegisterProtocolConfigCreator(name string, creator ConfigCreator) error {
  33. if _, found := globalTransportConfigCreatorCache[name]; found {
  34. return newError("protocol ", name, " is already registered").AtError()
  35. }
  36. globalTransportConfigCreatorCache[name] = creator
  37. common.RegisterConfig(creator(), func(ctx context.Context, config interface{}) (interface{}, error) {
  38. return nil, newError("transport config should use CreateTransportConfig instead")
  39. })
  40. return nil
  41. }
  42. func CreateTransportConfig(name string) (interface{}, error) {
  43. creator, ok := globalTransportConfigCreatorCache[name]
  44. if !ok {
  45. return nil, newError("unknown transport protocol: ", name)
  46. }
  47. return creator(), nil
  48. }
  49. func (c *TransportConfig) GetTypedSettings() (interface{}, error) {
  50. return serial.GetInstanceOf(c.Settings)
  51. }
  52. func (c *TransportConfig) GetUnifiedProtocolName() string {
  53. if len(c.ProtocolName) > 0 {
  54. return c.ProtocolName
  55. }
  56. return transportProtocolToString(c.Protocol)
  57. }
  58. func (c *StreamConfig) GetEffectiveProtocol() string {
  59. if c == nil {
  60. return "tcp"
  61. }
  62. if len(c.ProtocolName) > 0 {
  63. return c.ProtocolName
  64. }
  65. return transportProtocolToString(c.Protocol)
  66. }
  67. func (c *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) {
  68. protocol := c.GetEffectiveProtocol()
  69. return c.GetTransportSettingsFor(protocol)
  70. }
  71. func (c *StreamConfig) GetTransportSettingsFor(protocol string) (interface{}, error) {
  72. if c != nil {
  73. for _, settings := range c.TransportSettings {
  74. if settings.GetUnifiedProtocolName() == protocol {
  75. return settings.GetTypedSettings()
  76. }
  77. }
  78. }
  79. for _, settings := range globalTransportSettings {
  80. if settings.GetUnifiedProtocolName() == protocol {
  81. return settings.GetTypedSettings()
  82. }
  83. }
  84. return CreateTransportConfig(protocol)
  85. }
  86. func (c *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) {
  87. for _, settings := range c.SecuritySettings {
  88. if serial.V2Type(settings) == c.SecurityType {
  89. return serial.GetInstanceOf(settings)
  90. }
  91. }
  92. return serial.GetInstance(c.SecurityType)
  93. }
  94. func (c *StreamConfig) HasSecuritySettings() bool {
  95. return len(c.SecurityType) > 0
  96. }
  97. func ApplyGlobalTransportSettings(settings []*TransportConfig) error {
  98. features.PrintDeprecatedFeatureWarning("global transport settings")
  99. globalTransportSettings = settings
  100. return nil
  101. }
  102. func (c *ProxyConfig) HasTag() bool {
  103. return c != nil && len(c.Tag) > 0
  104. }
  105. func (m SocketConfig_TProxyMode) IsEnabled() bool {
  106. return m != SocketConfig_Off
  107. }