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