Hunter0x7c7
2022-08-11 a82f9cb69f63aaeba40c024960deda7d75b9fece
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
59
60
61
62
63
64
65
66
//go:build !confonly
// +build !confonly
 
package dns
 
import (
    "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/common/strmatcher"
    "github.com/v2fly/v2ray-core/v5/common/uuid"
)
 
var typeMap = map[DomainMatchingType]strmatcher.Type{
    DomainMatchingType_Full:      strmatcher.Full,
    DomainMatchingType_Subdomain: strmatcher.Domain,
    DomainMatchingType_Keyword:   strmatcher.Substr,
    DomainMatchingType_Regex:     strmatcher.Regex,
}
 
// References:
// https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml
// https://unix.stackexchange.com/questions/92441/whats-the-difference-between-local-home-and-lan
var localTLDsAndDotlessDomains = []*NameServer_PriorityDomain{
    {Type: DomainMatchingType_Regex, Domain: "^[^.]+$"}, // This will only match domains without any dot
    {Type: DomainMatchingType_Subdomain, Domain: "local"},
    {Type: DomainMatchingType_Subdomain, Domain: "localdomain"},
    {Type: DomainMatchingType_Subdomain, Domain: "localhost"},
    {Type: DomainMatchingType_Subdomain, Domain: "lan"},
    {Type: DomainMatchingType_Subdomain, Domain: "home.arpa"},
    {Type: DomainMatchingType_Subdomain, Domain: "example"},
    {Type: DomainMatchingType_Subdomain, Domain: "invalid"},
    {Type: DomainMatchingType_Subdomain, Domain: "test"},
}
 
var localTLDsAndDotlessDomainsRule = &NameServer_OriginalRule{
    Rule: "geosite:private",
    Size: uint32(len(localTLDsAndDotlessDomains)),
}
 
func toStrMatcher(t DomainMatchingType, domain string) (strmatcher.Matcher, error) {
    strMType, f := typeMap[t]
    if !f {
        return nil, newError("unknown mapping type", t).AtWarning()
    }
    matcher, err := strMType.New(domain)
    if err != nil {
        return nil, newError("failed to create str matcher").Base(err)
    }
    return matcher, nil
}
 
func toNetIP(addrs []net.Address) ([]net.IP, error) {
    ips := make([]net.IP, 0, len(addrs))
    for _, addr := range addrs {
        if addr.Family().IsIP() {
            ips = append(ips, addr.IP())
        } else {
            return nil, newError("Failed to convert address", addr, "to Net IP.").AtWarning()
        }
    }
    return ips, nil
}
 
func generateRandomTag() string {
    id := uuid.New()
    return "v2ray.system." + id.String()
}