Hunter0x7c7
2022-08-11 b8230139fb40edea387617b6accd8371e37eda58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package v4
 
import (
    "net"
    "strings"
 
    "github.com/golang/protobuf/proto"
 
    v2net "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/common/protocol"
    "github.com/v2fly/v2ray-core/v5/proxy/freedom"
)
 
type FreedomConfig struct {
    DomainStrategy string  `json:"domainStrategy"`
    Timeout        *uint32 `json:"timeout"`
    Redirect       string  `json:"redirect"`
    UserLevel      uint32  `json:"userLevel"`
}
 
// Build implements Buildable
func (c *FreedomConfig) Build() (proto.Message, error) {
    config := new(freedom.Config)
    config.DomainStrategy = freedom.Config_AS_IS
    switch strings.ToLower(c.DomainStrategy) {
    case "useip", "use_ip", "use-ip":
        config.DomainStrategy = freedom.Config_USE_IP
    case "useip4", "useipv4", "use_ip4", "use_ipv4", "use_ip_v4", "use-ip4", "use-ipv4", "use-ip-v4":
        config.DomainStrategy = freedom.Config_USE_IP4
    case "useip6", "useipv6", "use_ip6", "use_ipv6", "use_ip_v6", "use-ip6", "use-ipv6", "use-ip-v6":
        config.DomainStrategy = freedom.Config_USE_IP6
    }
 
    if c.Timeout != nil {
        config.Timeout = *c.Timeout
    }
    config.UserLevel = c.UserLevel
    if len(c.Redirect) > 0 {
        host, portStr, err := net.SplitHostPort(c.Redirect)
        if err != nil {
            return nil, newError("invalid redirect address: ", c.Redirect, ": ", err).Base(err)
        }
        port, err := v2net.PortFromString(portStr)
        if err != nil {
            return nil, newError("invalid redirect port: ", c.Redirect, ": ", err).Base(err)
        }
        config.DestinationOverride = &freedom.DestinationOverride{
            Server: &protocol.ServerEndpoint{
                Port: uint32(port),
            },
        }
 
        if len(host) > 0 {
            config.DestinationOverride.Server.Address = v2net.NewIPOrDomain(v2net.ParseAddress(host))
        }
    }
    return config, nil
}