1
0

tuic_settings.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. "github.com/mhsanaei/3x-ui/v3/internal/tuic"
  8. )
  9. func normalizeTuicSettings(inbound *model.Inbound) error {
  10. if inbound == nil || inbound.Protocol != model.TUIC || inbound.Settings == "" {
  11. return nil
  12. }
  13. var root map[string]json.RawMessage
  14. if err := json.Unmarshal([]byte(inbound.Settings), &root); err != nil {
  15. return fmt.Errorf("invalid TUIC settings: %w", err)
  16. }
  17. if err := normalizeTuicSettingsBlock(root); err != nil {
  18. return err
  19. }
  20. if rawServer, ok := root["server"]; ok && len(rawServer) > 0 {
  21. var server map[string]json.RawMessage
  22. if err := json.Unmarshal(rawServer, &server); err != nil {
  23. return fmt.Errorf("invalid TUIC server settings: %w", err)
  24. }
  25. if err := normalizeTuicSettingsBlock(server); err != nil {
  26. return err
  27. }
  28. encoded, err := json.Marshal(server)
  29. if err != nil {
  30. return fmt.Errorf("encode TUIC server settings: %w", err)
  31. }
  32. root["server"] = encoded
  33. }
  34. encoded, err := json.Marshal(root)
  35. if err != nil {
  36. return fmt.Errorf("encode TUIC settings: %w", err)
  37. }
  38. inbound.Settings = string(encoded)
  39. return nil
  40. }
  41. func normalizeTuicSettingsBlock(settings map[string]json.RawMessage) error {
  42. if raw, ok := settings["congestion_control"]; ok {
  43. var value string
  44. if err := json.Unmarshal(raw, &value); err != nil {
  45. return fmt.Errorf("TUIC congestion_control must be a string: %w", err)
  46. }
  47. normalized, err := tuic.NormalizeCongestionControl(value)
  48. if err != nil {
  49. return err
  50. }
  51. encoded, _ := json.Marshal(normalized)
  52. settings["congestion_control"] = encoded
  53. }
  54. if raw, ok := settings["log_level"]; ok {
  55. var value string
  56. if err := json.Unmarshal(raw, &value); err != nil {
  57. return fmt.Errorf("TUIC log_level must be a string: %w", err)
  58. }
  59. value = strings.ToLower(strings.TrimSpace(value))
  60. if value == "warning" {
  61. value = "warn"
  62. }
  63. if value == "" {
  64. value = "info"
  65. }
  66. switch value {
  67. case "debug", "info", "warn", "error":
  68. default:
  69. return fmt.Errorf("TUIC log_level %q is unsupported", value)
  70. }
  71. encoded, _ := json.Marshal(value)
  72. settings["log_level"] = encoded
  73. }
  74. if raw, ok := settings["udp_relay_mode"]; ok {
  75. var value string
  76. if err := json.Unmarshal(raw, &value); err != nil {
  77. return fmt.Errorf("TUIC udp_relay_mode must be a string: %w", err)
  78. }
  79. value = strings.ToLower(strings.TrimSpace(value))
  80. if value == "" {
  81. value = "native"
  82. }
  83. if value != "native" && value != "quic" {
  84. return fmt.Errorf("TUIC udp_relay_mode %q is unsupported", value)
  85. }
  86. encoded, _ := json.Marshal(value)
  87. settings["udp_relay_mode"] = encoded
  88. }
  89. if raw, ok := settings["max_udp_relay_packet_size"]; ok {
  90. var value int
  91. if err := json.Unmarshal(raw, &value); err != nil {
  92. return fmt.Errorf("TUIC max_udp_relay_packet_size must be an integer: %w", err)
  93. }
  94. if value > 65507 {
  95. return fmt.Errorf("TUIC max_udp_relay_packet_size must not exceed %d", 65245)
  96. }
  97. if value > 65245 {
  98. value = 65245
  99. }
  100. encoded, _ := json.Marshal(value)
  101. settings["max_udp_relay_packet_size"] = encoded
  102. }
  103. return nil
  104. }