v2fly/infra/conf/v5cfg/inbound.go

86 lines
2.6 KiB
Go

package v5cfg
import (
"context"
"path/filepath"
"github.com/golang/protobuf/proto"
core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/app/proxyman"
"github.com/v2fly/v2ray-core/v5/common/serial"
"github.com/v2fly/v2ray-core/v5/proxy/dokodemo"
"github.com/v2fly/v2ray-core/v5/transport/internet"
)
func (c InboundConfig) BuildV5(ctx context.Context) (proto.Message, error) {
receiverSettings := &proxyman.ReceiverConfig{}
if c.ListenOn == nil {
// Listen on anyip, must set PortRange
if c.PortRange == nil {
return nil, newError("Listen on AnyIP but no Port(s) set in InboundDetour.")
}
receiverSettings.PortRange = c.PortRange.Build()
} else {
// Listen on specific IP or Unix Domain Socket
receiverSettings.Listen = c.ListenOn.Build()
listenDS := c.ListenOn.Family().IsDomain() && (filepath.IsAbs(c.ListenOn.Domain()) || c.ListenOn.Domain()[0] == '@')
listenIP := c.ListenOn.Family().IsIP() || (c.ListenOn.Family().IsDomain() && c.ListenOn.Domain() == "localhost")
switch {
case listenIP:
// Listen on specific IP, must set PortRange
if c.PortRange == nil {
return nil, newError("Listen on specific ip without port in InboundDetour.")
}
// Listen on IP:Port
receiverSettings.PortRange = c.PortRange.Build()
case listenDS:
if c.PortRange != nil {
// Listen on Unix Domain Socket, PortRange should be nil
receiverSettings.PortRange = nil
}
default:
return nil, newError("unable to listen on domain address: ", c.ListenOn.Domain())
}
}
if c.StreamSetting != nil {
ss, err := c.StreamSetting.BuildV5(ctx)
if err != nil {
return nil, err
}
receiverSettings.StreamSettings = ss.(*internet.StreamConfig)
}
if c.SniffingConfig != nil {
s, err := c.SniffingConfig.Build()
if err != nil {
return nil, newError("failed to build sniffing config").Base(err)
}
receiverSettings.SniffingSettings = s
}
if c.Settings == nil {
c.Settings = []byte("{}")
}
inboundConfigPack, err := loadHeterogeneousConfigFromRawJSON("inbound", c.Protocol, c.Settings)
if err != nil {
return nil, newError("unable to load inbound protocol config").Base(err)
}
if content, ok := inboundConfigPack.(*dokodemo.SimplifiedConfig); ok {
receiverSettings.ReceiveOriginalDestination = content.FollowRedirect
}
if content, ok := inboundConfigPack.(*dokodemo.Config); ok {
receiverSettings.ReceiveOriginalDestination = content.FollowRedirect
}
return &core.InboundHandlerConfig{
Tag: c.Tag,
ReceiverSettings: serial.ToTypedMessage(receiverSettings),
ProxySettings: serial.ToTypedMessage(inboundConfigPack),
}, nil
}