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  }