|  | @@ -1,428 +0,0 @@
 | 
											
												
													
														|  | -package conf
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -import (
 |  | 
 | 
											
												
													
														|  | -	"encoding/json"
 |  | 
 | 
											
												
													
														|  | -	"io"
 |  | 
 | 
											
												
													
														|  | -	"strings"
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	"v2ray.com/core"
 |  | 
 | 
											
												
													
														|  | -	"v2ray.com/core/app/proxyman"
 |  | 
 | 
											
												
													
														|  | -	v2net "v2ray.com/core/common/net"
 |  | 
 | 
											
												
													
														|  | -	"v2ray.com/core/common/serial"
 |  | 
 | 
											
												
													
														|  | -	json_reader "v2ray.com/core/tools/conf/json"
 |  | 
 | 
											
												
													
														|  | -)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var (
 |  | 
 | 
											
												
													
														|  | -	inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{
 |  | 
 | 
											
												
													
														|  | -		"dokodemo-door": func() interface{} { return new(DokodemoConfig) },
 |  | 
 | 
											
												
													
														|  | -		"http":          func() interface{} { return new(HttpServerConfig) },
 |  | 
 | 
											
												
													
														|  | -		"shadowsocks":   func() interface{} { return new(ShadowsocksServerConfig) },
 |  | 
 | 
											
												
													
														|  | -		"socks":         func() interface{} { return new(SocksServerConfig) },
 |  | 
 | 
											
												
													
														|  | -		"vmess":         func() interface{} { return new(VMessInboundConfig) },
 |  | 
 | 
											
												
													
														|  | -	}, "protocol", "settings")
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	outboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{
 |  | 
 | 
											
												
													
														|  | -		"blackhole":   func() interface{} { return new(BlackholeConfig) },
 |  | 
 | 
											
												
													
														|  | -		"freedom":     func() interface{} { return new(FreedomConfig) },
 |  | 
 | 
											
												
													
														|  | -		"shadowsocks": func() interface{} { return new(ShadowsocksClientConfig) },
 |  | 
 | 
											
												
													
														|  | -		"vmess":       func() interface{} { return new(VMessOutboundConfig) },
 |  | 
 | 
											
												
													
														|  | -		"socks":       func() interface{} { return new(SocksClientConfig) },
 |  | 
 | 
											
												
													
														|  | -	}, "protocol", "settings")
 |  | 
 | 
											
												
													
														|  | -)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func toProtocolList(s []string) ([]proxyman.KnownProtocols, error) {
 |  | 
 | 
											
												
													
														|  | -	kp := make([]proxyman.KnownProtocols, 0, 8)
 |  | 
 | 
											
												
													
														|  | -	for _, p := range s {
 |  | 
 | 
											
												
													
														|  | -		switch strings.ToLower(p) {
 |  | 
 | 
											
												
													
														|  | -		case "http":
 |  | 
 | 
											
												
													
														|  | -			kp = append(kp, proxyman.KnownProtocols_HTTP)
 |  | 
 | 
											
												
													
														|  | -		case "https", "tls", "ssl":
 |  | 
 | 
											
												
													
														|  | -			kp = append(kp, proxyman.KnownProtocols_TLS)
 |  | 
 | 
											
												
													
														|  | -		default:
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("Unknown protocol: ", p)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	return kp, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type InboundConnectionConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Port           uint16          `json:"port"`
 |  | 
 | 
											
												
													
														|  | -	Listen         *Address        `json:"listen"`
 |  | 
 | 
											
												
													
														|  | -	Protocol       string          `json:"protocol"`
 |  | 
 | 
											
												
													
														|  | -	StreamSetting  *StreamConfig   `json:"streamSettings"`
 |  | 
 | 
											
												
													
														|  | -	Settings       json.RawMessage `json:"settings"`
 |  | 
 | 
											
												
													
														|  | -	Tag            string          `json:"tag"`
 |  | 
 | 
											
												
													
														|  | -	DomainOverride *StringList     `json:"domainOverride"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *InboundConnectionConfig) Build() (*proxyman.InboundHandlerConfig, error) {
 |  | 
 | 
											
												
													
														|  | -	receiverConfig := &proxyman.ReceiverConfig{
 |  | 
 | 
											
												
													
														|  | -		PortRange: &v2net.PortRange{
 |  | 
 | 
											
												
													
														|  | -			From: uint32(v.Port),
 |  | 
 | 
											
												
													
														|  | -			To:   uint32(v.Port),
 |  | 
 | 
											
												
													
														|  | -		},
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.Listen != nil {
 |  | 
 | 
											
												
													
														|  | -		if v.Listen.Family().IsDomain() {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("unable to listen on domain address: " + v.Listen.Domain())
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverConfig.Listen = v.Listen.Build()
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.StreamSetting != nil {
 |  | 
 | 
											
												
													
														|  | -		ts, err := v.StreamSetting.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverConfig.StreamSettings = ts
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.DomainOverride != nil {
 |  | 
 | 
											
												
													
														|  | -		kp, err := toProtocolList(*v.DomainOverride)
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("failed to parse inbound config").Base(err)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverConfig.DomainOverride = kp
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	jsonConfig, err := inboundConfigLoader.LoadWithID(v.Settings, v.Protocol)
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("failed to load inbound config.").Base(err)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if dokodemoConfig, ok := jsonConfig.(*DokodemoConfig); ok {
 |  | 
 | 
											
												
													
														|  | -		receiverConfig.ReceiveOriginalDestination = dokodemoConfig.Redirect
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	ts, err := jsonConfig.(Buildable).Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return &proxyman.InboundHandlerConfig{
 |  | 
 | 
											
												
													
														|  | -		Tag:              v.Tag,
 |  | 
 | 
											
												
													
														|  | -		ReceiverSettings: serial.ToTypedMessage(receiverConfig),
 |  | 
 | 
											
												
													
														|  | -		ProxySettings:    ts,
 |  | 
 | 
											
												
													
														|  | -	}, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type MuxConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Enabled     bool   `json:"enabled"`
 |  | 
 | 
											
												
													
														|  | -	Concurrency uint16 `json:"concurrency"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (c *MuxConfig) GetConcurrency() uint16 {
 |  | 
 | 
											
												
													
														|  | -	if c.Concurrency == 0 {
 |  | 
 | 
											
												
													
														|  | -		return 8
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	return c.Concurrency
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type OutboundConnectionConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Protocol      string          `json:"protocol"`
 |  | 
 | 
											
												
													
														|  | -	SendThrough   *Address        `json:"sendThrough"`
 |  | 
 | 
											
												
													
														|  | -	StreamSetting *StreamConfig   `json:"streamSettings"`
 |  | 
 | 
											
												
													
														|  | -	ProxySettings *ProxyConfig    `json:"proxySettings"`
 |  | 
 | 
											
												
													
														|  | -	Settings      json.RawMessage `json:"settings"`
 |  | 
 | 
											
												
													
														|  | -	Tag           string          `json:"tag"`
 |  | 
 | 
											
												
													
														|  | -	MuxSettings   *MuxConfig      `json:"mux"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *OutboundConnectionConfig) Build() (*proxyman.OutboundHandlerConfig, error) {
 |  | 
 | 
											
												
													
														|  | -	senderSettings := &proxyman.SenderConfig{}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.SendThrough != nil {
 |  | 
 | 
											
												
													
														|  | -		address := v.SendThrough
 |  | 
 | 
											
												
													
														|  | -		if address.Family().IsDomain() {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("invalid sendThrough address: " + address.String())
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.Via = address.Build()
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.StreamSetting != nil {
 |  | 
 | 
											
												
													
														|  | -		ss, err := v.StreamSetting.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.StreamSettings = ss
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.ProxySettings != nil {
 |  | 
 | 
											
												
													
														|  | -		ps, err := v.ProxySettings.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("invalid outbound proxy settings").Base(err)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.ProxySettings = ps
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.MuxSettings != nil && v.MuxSettings.Enabled {
 |  | 
 | 
											
												
													
														|  | -		senderSettings.MultiplexSettings = &proxyman.MultiplexingConfig{
 |  | 
 | 
											
												
													
														|  | -			Enabled:     true,
 |  | 
 | 
											
												
													
														|  | -			Concurrency: uint32(v.MuxSettings.GetConcurrency()),
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	rawConfig, err := outboundConfigLoader.LoadWithID(v.Settings, v.Protocol)
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("failed to parse outbound config").Base(err)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	ts, err := rawConfig.(Buildable).Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return &proxyman.OutboundHandlerConfig{
 |  | 
 | 
											
												
													
														|  | -		SenderSettings: serial.ToTypedMessage(senderSettings),
 |  | 
 | 
											
												
													
														|  | -		ProxySettings:  ts,
 |  | 
 | 
											
												
													
														|  | -		Tag:            v.Tag,
 |  | 
 | 
											
												
													
														|  | -	}, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type InboundDetourAllocationConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Strategy    string  `json:"strategy"`
 |  | 
 | 
											
												
													
														|  | -	Concurrency *uint32 `json:"concurrency"`
 |  | 
 | 
											
												
													
														|  | -	RefreshMin  *uint32 `json:"refresh"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *InboundDetourAllocationConfig) Build() (*proxyman.AllocationStrategy, error) {
 |  | 
 | 
											
												
													
														|  | -	config := new(proxyman.AllocationStrategy)
 |  | 
 | 
											
												
													
														|  | -	switch strings.ToLower(v.Strategy) {
 |  | 
 | 
											
												
													
														|  | -	case "always":
 |  | 
 | 
											
												
													
														|  | -		config.Type = proxyman.AllocationStrategy_Always
 |  | 
 | 
											
												
													
														|  | -	case "random":
 |  | 
 | 
											
												
													
														|  | -		config.Type = proxyman.AllocationStrategy_Random
 |  | 
 | 
											
												
													
														|  | -	case "external":
 |  | 
 | 
											
												
													
														|  | -		config.Type = proxyman.AllocationStrategy_External
 |  | 
 | 
											
												
													
														|  | -	default:
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("unknown allocation strategy: ", v.Strategy)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.Concurrency != nil {
 |  | 
 | 
											
												
													
														|  | -		config.Concurrency = &proxyman.AllocationStrategy_AllocationStrategyConcurrency{
 |  | 
 | 
											
												
													
														|  | -			Value: *v.Concurrency,
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.RefreshMin != nil {
 |  | 
 | 
											
												
													
														|  | -		config.Refresh = &proxyman.AllocationStrategy_AllocationStrategyRefresh{
 |  | 
 | 
											
												
													
														|  | -			Value: *v.RefreshMin,
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return config, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type InboundDetourConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Protocol       string                         `json:"protocol"`
 |  | 
 | 
											
												
													
														|  | -	PortRange      *PortRange                     `json:"port"`
 |  | 
 | 
											
												
													
														|  | -	ListenOn       *Address                       `json:"listen"`
 |  | 
 | 
											
												
													
														|  | -	Settings       json.RawMessage                `json:"settings"`
 |  | 
 | 
											
												
													
														|  | -	Tag            string                         `json:"tag"`
 |  | 
 | 
											
												
													
														|  | -	Allocation     *InboundDetourAllocationConfig `json:"allocate"`
 |  | 
 | 
											
												
													
														|  | -	StreamSetting  *StreamConfig                  `json:"streamSettings"`
 |  | 
 | 
											
												
													
														|  | -	DomainOverride *StringList                    `json:"domainOverride"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *InboundDetourConfig) Build() (*proxyman.InboundHandlerConfig, error) {
 |  | 
 | 
											
												
													
														|  | -	receiverSettings := &proxyman.ReceiverConfig{}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.PortRange == nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("port range not specified in InboundDetour.")
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	receiverSettings.PortRange = v.PortRange.Build()
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.ListenOn != nil {
 |  | 
 | 
											
												
													
														|  | -		if v.ListenOn.Family().IsDomain() {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("unable to listen on domain address: ", v.ListenOn.Domain())
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverSettings.Listen = v.ListenOn.Build()
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.Allocation != nil {
 |  | 
 | 
											
												
													
														|  | -		as, err := v.Allocation.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverSettings.AllocationStrategy = as
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.StreamSetting != nil {
 |  | 
 | 
											
												
													
														|  | -		ss, err := v.StreamSetting.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverSettings.StreamSettings = ss
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if v.DomainOverride != nil {
 |  | 
 | 
											
												
													
														|  | -		kp, err := toProtocolList(*v.DomainOverride)
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("failed to parse inbound detour config").Base(err)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		receiverSettings.DomainOverride = kp
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	rawConfig, err := inboundConfigLoader.LoadWithID(v.Settings, v.Protocol)
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("failed to load inbound detour config.").Base(err)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	if dokodemoConfig, ok := rawConfig.(*DokodemoConfig); ok {
 |  | 
 | 
											
												
													
														|  | -		receiverSettings.ReceiveOriginalDestination = dokodemoConfig.Redirect
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	ts, err := rawConfig.(Buildable).Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return &proxyman.InboundHandlerConfig{
 |  | 
 | 
											
												
													
														|  | -		Tag:              v.Tag,
 |  | 
 | 
											
												
													
														|  | -		ReceiverSettings: serial.ToTypedMessage(receiverSettings),
 |  | 
 | 
											
												
													
														|  | -		ProxySettings:    ts,
 |  | 
 | 
											
												
													
														|  | -	}, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type OutboundDetourConfig struct {
 |  | 
 | 
											
												
													
														|  | -	Protocol      string          `json:"protocol"`
 |  | 
 | 
											
												
													
														|  | -	SendThrough   *Address        `json:"sendThrough"`
 |  | 
 | 
											
												
													
														|  | -	Tag           string          `json:"tag"`
 |  | 
 | 
											
												
													
														|  | -	Settings      json.RawMessage `json:"settings"`
 |  | 
 | 
											
												
													
														|  | -	StreamSetting *StreamConfig   `json:"streamSettings"`
 |  | 
 | 
											
												
													
														|  | -	ProxySettings *ProxyConfig    `json:"proxySettings"`
 |  | 
 | 
											
												
													
														|  | -	MuxSettings   *MuxConfig      `json:"mux"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *OutboundDetourConfig) Build() (*proxyman.OutboundHandlerConfig, error) {
 |  | 
 | 
											
												
													
														|  | -	senderSettings := &proxyman.SenderConfig{}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.SendThrough != nil {
 |  | 
 | 
											
												
													
														|  | -		address := v.SendThrough
 |  | 
 | 
											
												
													
														|  | -		if address.Family().IsDomain() {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("unable to send through: " + address.String())
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.Via = address.Build()
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.StreamSetting != nil {
 |  | 
 | 
											
												
													
														|  | -		ss, err := v.StreamSetting.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.StreamSettings = ss
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.ProxySettings != nil {
 |  | 
 | 
											
												
													
														|  | -		ps, err := v.ProxySettings.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("invalid outbound detour proxy settings.").Base(err)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		senderSettings.ProxySettings = ps
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.MuxSettings != nil && v.MuxSettings.Enabled {
 |  | 
 | 
											
												
													
														|  | -		senderSettings.MultiplexSettings = &proxyman.MultiplexingConfig{
 |  | 
 | 
											
												
													
														|  | -			Enabled:     true,
 |  | 
 | 
											
												
													
														|  | -			Concurrency: uint32(v.MuxSettings.GetConcurrency()),
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	rawConfig, err := outboundConfigLoader.LoadWithID(v.Settings, v.Protocol)
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("failed to parse to outbound detour config.").Base(err)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	ts, err := rawConfig.(Buildable).Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return &proxyman.OutboundHandlerConfig{
 |  | 
 | 
											
												
													
														|  | -		SenderSettings: serial.ToTypedMessage(senderSettings),
 |  | 
 | 
											
												
													
														|  | -		Tag:            v.Tag,
 |  | 
 | 
											
												
													
														|  | -		ProxySettings:  ts,
 |  | 
 | 
											
												
													
														|  | -	}, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -type Config struct {
 |  | 
 | 
											
												
													
														|  | -	Port            uint16                    `json:"port"` // Port of this Point server.
 |  | 
 | 
											
												
													
														|  | -	LogConfig       *LogConfig                `json:"log"`
 |  | 
 | 
											
												
													
														|  | -	RouterConfig    *RouterConfig             `json:"routing"`
 |  | 
 | 
											
												
													
														|  | -	DNSConfig       *DnsConfig                `json:"dns"`
 |  | 
 | 
											
												
													
														|  | -	InboundConfig   *InboundConnectionConfig  `json:"inbound"`
 |  | 
 | 
											
												
													
														|  | -	OutboundConfig  *OutboundConnectionConfig `json:"outbound"`
 |  | 
 | 
											
												
													
														|  | -	InboundDetours  []InboundDetourConfig     `json:"inboundDetour"`
 |  | 
 | 
											
												
													
														|  | -	OutboundDetours []OutboundDetourConfig    `json:"outboundDetour"`
 |  | 
 | 
											
												
													
														|  | -	Transport       *TransportConfig          `json:"transport"`
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func (v *Config) Build() (*core.Config, error) {
 |  | 
 | 
											
												
													
														|  | -	config := new(core.Config)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.LogConfig != nil {
 |  | 
 | 
											
												
													
														|  | -		config.App = append(config.App, serial.ToTypedMessage(v.LogConfig.Build()))
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.Transport != nil {
 |  | 
 | 
											
												
													
														|  | -		ts, err := v.Transport.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		config.Transport = ts
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.RouterConfig != nil {
 |  | 
 | 
											
												
													
														|  | -		routerConfig, err := v.RouterConfig.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		config.App = append(config.App, serial.ToTypedMessage(routerConfig))
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.DNSConfig != nil {
 |  | 
 | 
											
												
													
														|  | -		config.App = append(config.App, serial.ToTypedMessage(v.DNSConfig.Build()))
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.InboundConfig == nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("no inbound config specified")
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.InboundConfig.Port == 0 && v.Port > 0 {
 |  | 
 | 
											
												
													
														|  | -		v.InboundConfig.Port = v.Port
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	ic, err := v.InboundConfig.Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	config.Inbound = append(config.Inbound, ic)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	for _, rawInboundConfig := range v.InboundDetours {
 |  | 
 | 
											
												
													
														|  | -		ic, err := rawInboundConfig.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		config.Inbound = append(config.Inbound, ic)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	if v.OutboundConfig == nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, newError("no outbound config specified")
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	oc, err := v.OutboundConfig.Build()
 |  | 
 | 
											
												
													
														|  | -	if err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -	config.Outbound = append(config.Outbound, oc)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	for _, rawOutboundConfig := range v.OutboundDetours {
 |  | 
 | 
											
												
													
														|  | -		oc, err := rawOutboundConfig.Build()
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		config.Outbound = append(config.Outbound, oc)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	return config, nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -func init() {
 |  | 
 | 
											
												
													
														|  | -	core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) {
 |  | 
 | 
											
												
													
														|  | -		jsonConfig := &Config{}
 |  | 
 | 
											
												
													
														|  | -		decoder := json.NewDecoder(&json_reader.Reader{
 |  | 
 | 
											
												
													
														|  | -			Reader: input,
 |  | 
 | 
											
												
													
														|  | -		})
 |  | 
 | 
											
												
													
														|  | -		err := decoder.Decode(jsonConfig)
 |  | 
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, newError("invalid V2Ray config").Base(err)
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -		return jsonConfig.Build()
 |  | 
 | 
											
												
													
														|  | -	})
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 |