shadowtls.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/common/dialer"
  7. C "github.com/sagernet/sing-box/constant"
  8. "github.com/sagernet/sing-box/log"
  9. "github.com/sagernet/sing-box/option"
  10. "github.com/sagernet/sing-shadowtls"
  11. "github.com/sagernet/sing/common"
  12. N "github.com/sagernet/sing/common/network"
  13. )
  14. type ShadowTLS struct {
  15. myInboundAdapter
  16. service *shadowtls.Service
  17. }
  18. func NewShadowTLS(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.ShadowTLSInboundOptions) (*ShadowTLS, error) {
  19. inbound := &ShadowTLS{
  20. myInboundAdapter: myInboundAdapter{
  21. protocol: C.TypeShadowTLS,
  22. network: []string{N.NetworkTCP},
  23. ctx: ctx,
  24. router: router,
  25. logger: logger,
  26. tag: tag,
  27. listenOptions: options.ListenOptions,
  28. },
  29. }
  30. if options.Version == 0 {
  31. options.Version = 1
  32. }
  33. var handshakeForServerName map[string]shadowtls.HandshakeConfig
  34. if options.Version > 1 {
  35. handshakeForServerName = make(map[string]shadowtls.HandshakeConfig)
  36. for serverName, serverOptions := range options.HandshakeForServerName {
  37. handshakeForServerName[serverName] = shadowtls.HandshakeConfig{
  38. Server: serverOptions.ServerOptions.Build(),
  39. Dialer: dialer.New(router, serverOptions.DialerOptions),
  40. }
  41. }
  42. }
  43. service, err := shadowtls.NewService(shadowtls.ServiceConfig{
  44. Version: options.Version,
  45. Password: options.Password,
  46. Users: common.Map(options.Users, func(it option.ShadowTLSUser) shadowtls.User {
  47. return (shadowtls.User)(it)
  48. }),
  49. Handshake: shadowtls.HandshakeConfig{
  50. Server: options.Handshake.ServerOptions.Build(),
  51. Dialer: dialer.New(router, options.Handshake.DialerOptions),
  52. },
  53. HandshakeForServerName: handshakeForServerName,
  54. StrictMode: options.StrictMode,
  55. Handler: inbound.upstreamContextHandler(),
  56. Logger: logger,
  57. })
  58. if err != nil {
  59. return nil, err
  60. }
  61. inbound.service = service
  62. inbound.connHandler = inbound
  63. return inbound, nil
  64. }
  65. func (h *ShadowTLS) NewConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  66. return h.service.NewConnection(adapter.WithContext(log.ContextWithNewID(ctx), &metadata), conn, adapter.UpstreamMetadata(metadata))
  67. }