dns.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package libbox
  2. import (
  3. "context"
  4. "net/netip"
  5. "strings"
  6. "syscall"
  7. "github.com/sagernet/sing-box/adapter"
  8. C "github.com/sagernet/sing-box/constant"
  9. "github.com/sagernet/sing-box/dns"
  10. "github.com/sagernet/sing-box/option"
  11. "github.com/sagernet/sing/common"
  12. E "github.com/sagernet/sing/common/exceptions"
  13. M "github.com/sagernet/sing/common/metadata"
  14. "github.com/sagernet/sing/common/task"
  15. mDNS "github.com/miekg/dns"
  16. )
  17. type LocalDNSTransport interface {
  18. Raw() bool
  19. Lookup(ctx *ExchangeContext, network string, domain string) error
  20. Exchange(ctx *ExchangeContext, message []byte) error
  21. }
  22. var _ adapter.DNSTransport = (*platformTransport)(nil)
  23. type platformTransport struct {
  24. dns.TransportAdapter
  25. iif LocalDNSTransport
  26. }
  27. func newPlatformTransport(iif LocalDNSTransport, tag string, options option.LocalDNSServerOptions) *platformTransport {
  28. return &platformTransport{
  29. TransportAdapter: dns.NewTransportAdapterWithLocalOptions(C.DNSTypeLocal, tag, options),
  30. iif: iif,
  31. }
  32. }
  33. func (p *platformTransport) Start(stage adapter.StartStage) error {
  34. return nil
  35. }
  36. func (p *platformTransport) Close() error {
  37. return nil
  38. }
  39. func (p *platformTransport) Reset() {
  40. }
  41. func (p *platformTransport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
  42. response := &ExchangeContext{
  43. context: ctx,
  44. }
  45. if p.iif.Raw() {
  46. messageBytes, err := message.Pack()
  47. if err != nil {
  48. return nil, err
  49. }
  50. var responseMessage *mDNS.Msg
  51. var group task.Group
  52. group.Append0(func(ctx context.Context) error {
  53. err = p.iif.Exchange(response, messageBytes)
  54. if err != nil {
  55. return err
  56. }
  57. if response.error != nil {
  58. return response.error
  59. }
  60. responseMessage = &response.message
  61. return nil
  62. })
  63. err = group.Run(ctx)
  64. if err != nil {
  65. return nil, err
  66. }
  67. return responseMessage, nil
  68. } else {
  69. question := message.Question[0]
  70. var network string
  71. switch question.Qtype {
  72. case mDNS.TypeA:
  73. network = "ip4"
  74. case mDNS.TypeAAAA:
  75. network = "ip6"
  76. default:
  77. return nil, E.New("only IP queries are supported by current version of Android")
  78. }
  79. var responseAddrs []netip.Addr
  80. var group task.Group
  81. group.Append0(func(ctx context.Context) error {
  82. err := p.iif.Lookup(response, network, question.Name)
  83. if err != nil {
  84. return err
  85. }
  86. if response.error != nil {
  87. return response.error
  88. }
  89. responseAddrs = response.addresses
  90. return nil
  91. })
  92. err := group.Run(ctx)
  93. if err != nil {
  94. return nil, err
  95. }
  96. return dns.FixedResponse(message.Id, question, responseAddrs, C.DefaultDNSTTL), nil
  97. }
  98. }
  99. type Func interface {
  100. Invoke() error
  101. }
  102. type ExchangeContext struct {
  103. context context.Context
  104. message mDNS.Msg
  105. addresses []netip.Addr
  106. error error
  107. }
  108. func (c *ExchangeContext) OnCancel(callback Func) {
  109. go func() {
  110. <-c.context.Done()
  111. callback.Invoke()
  112. }()
  113. }
  114. func (c *ExchangeContext) Success(result string) {
  115. c.addresses = common.Map(common.Filter(strings.Split(result, "\n"), func(it string) bool {
  116. return !common.IsEmpty(it)
  117. }), func(it string) netip.Addr {
  118. return M.ParseSocksaddrHostPort(it, 0).Unwrap().Addr
  119. })
  120. }
  121. func (c *ExchangeContext) RawSuccess(result []byte) {
  122. err := c.message.Unpack(result)
  123. if err != nil {
  124. c.error = E.Cause(err, "parse response")
  125. }
  126. }
  127. func (c *ExchangeContext) ErrorCode(code int32) {
  128. c.error = dns.RcodeError(code)
  129. }
  130. func (c *ExchangeContext) ErrnoCode(code int32) {
  131. c.error = syscall.Errno(code)
  132. }