types.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package option
  2. import (
  3. "strings"
  4. C "github.com/sagernet/sing-box/constant"
  5. "github.com/sagernet/sing-dns"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. F "github.com/sagernet/sing/common/format"
  8. "github.com/sagernet/sing/common/json"
  9. N "github.com/sagernet/sing/common/network"
  10. mDNS "github.com/miekg/dns"
  11. )
  12. type NetworkList string
  13. func (v *NetworkList) UnmarshalJSON(content []byte) error {
  14. var networkList []string
  15. err := json.Unmarshal(content, &networkList)
  16. if err != nil {
  17. var networkItem string
  18. err = json.Unmarshal(content, &networkItem)
  19. if err != nil {
  20. return err
  21. }
  22. networkList = []string{networkItem}
  23. }
  24. for _, networkName := range networkList {
  25. switch networkName {
  26. case N.NetworkTCP, N.NetworkUDP:
  27. break
  28. default:
  29. return E.New("unknown network: " + networkName)
  30. }
  31. }
  32. *v = NetworkList(strings.Join(networkList, "\n"))
  33. return nil
  34. }
  35. func (v NetworkList) Build() []string {
  36. if v == "" {
  37. return []string{N.NetworkTCP, N.NetworkUDP}
  38. }
  39. return strings.Split(string(v), "\n")
  40. }
  41. type DomainStrategy dns.DomainStrategy
  42. func (s DomainStrategy) String() string {
  43. switch dns.DomainStrategy(s) {
  44. case dns.DomainStrategyAsIS:
  45. return ""
  46. case dns.DomainStrategyPreferIPv4:
  47. return "prefer_ipv4"
  48. case dns.DomainStrategyPreferIPv6:
  49. return "prefer_ipv6"
  50. case dns.DomainStrategyUseIPv4:
  51. return "ipv4_only"
  52. case dns.DomainStrategyUseIPv6:
  53. return "ipv6_only"
  54. default:
  55. panic(E.New("unknown domain strategy: ", s))
  56. }
  57. }
  58. func (s DomainStrategy) MarshalJSON() ([]byte, error) {
  59. var value string
  60. switch dns.DomainStrategy(s) {
  61. case dns.DomainStrategyAsIS:
  62. value = ""
  63. // value = "as_is"
  64. case dns.DomainStrategyPreferIPv4:
  65. value = "prefer_ipv4"
  66. case dns.DomainStrategyPreferIPv6:
  67. value = "prefer_ipv6"
  68. case dns.DomainStrategyUseIPv4:
  69. value = "ipv4_only"
  70. case dns.DomainStrategyUseIPv6:
  71. value = "ipv6_only"
  72. default:
  73. return nil, E.New("unknown domain strategy: ", s)
  74. }
  75. return json.Marshal(value)
  76. }
  77. func (s *DomainStrategy) UnmarshalJSON(bytes []byte) error {
  78. var value string
  79. err := json.Unmarshal(bytes, &value)
  80. if err != nil {
  81. return err
  82. }
  83. switch value {
  84. case "", "as_is":
  85. *s = DomainStrategy(dns.DomainStrategyAsIS)
  86. case "prefer_ipv4":
  87. *s = DomainStrategy(dns.DomainStrategyPreferIPv4)
  88. case "prefer_ipv6":
  89. *s = DomainStrategy(dns.DomainStrategyPreferIPv6)
  90. case "ipv4_only":
  91. *s = DomainStrategy(dns.DomainStrategyUseIPv4)
  92. case "ipv6_only":
  93. *s = DomainStrategy(dns.DomainStrategyUseIPv6)
  94. default:
  95. return E.New("unknown domain strategy: ", value)
  96. }
  97. return nil
  98. }
  99. type DNSQueryType uint16
  100. func (t DNSQueryType) String() string {
  101. typeName, loaded := mDNS.TypeToString[uint16(t)]
  102. if loaded {
  103. return typeName
  104. }
  105. return F.ToString(uint16(t))
  106. }
  107. func (t DNSQueryType) MarshalJSON() ([]byte, error) {
  108. typeName, loaded := mDNS.TypeToString[uint16(t)]
  109. if loaded {
  110. return json.Marshal(typeName)
  111. }
  112. return json.Marshal(uint16(t))
  113. }
  114. func (t *DNSQueryType) UnmarshalJSON(bytes []byte) error {
  115. var valueNumber uint16
  116. err := json.Unmarshal(bytes, &valueNumber)
  117. if err == nil {
  118. *t = DNSQueryType(valueNumber)
  119. return nil
  120. }
  121. var valueString string
  122. err = json.Unmarshal(bytes, &valueString)
  123. if err == nil {
  124. queryType, loaded := mDNS.StringToType[valueString]
  125. if loaded {
  126. *t = DNSQueryType(queryType)
  127. return nil
  128. }
  129. }
  130. return E.New("unknown DNS query type: ", string(bytes))
  131. }
  132. func DNSQueryTypeToString(queryType uint16) string {
  133. typeName, loaded := mDNS.TypeToString[queryType]
  134. if loaded {
  135. return typeName
  136. }
  137. return F.ToString(queryType)
  138. }
  139. type NetworkStrategy C.NetworkStrategy
  140. func (n NetworkStrategy) MarshalJSON() ([]byte, error) {
  141. return json.Marshal(C.NetworkStrategy(n).String())
  142. }
  143. func (n *NetworkStrategy) UnmarshalJSON(content []byte) error {
  144. var value string
  145. err := json.Unmarshal(content, &value)
  146. if err != nil {
  147. return err
  148. }
  149. strategy, loaded := C.StringToNetworkStrategy[value]
  150. if !loaded {
  151. return E.New("unknown network strategy: ", value)
  152. }
  153. *n = NetworkStrategy(strategy)
  154. return nil
  155. }