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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package reverse
 
//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
 
import (
    "context"
 
    core "github.com/v2fly/v2ray-core/v5"
    "github.com/v2fly/v2ray-core/v5/common"
    "github.com/v2fly/v2ray-core/v5/common/errors"
    "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/features/outbound"
    "github.com/v2fly/v2ray-core/v5/features/routing"
)
 
const (
    internalDomain = "reverse.internal.v2fly.org"
)
 
func isDomain(dest net.Destination, domain string) bool {
    return dest.Address.Family().IsDomain() && dest.Address.Domain() == domain
}
 
func isInternalDomain(dest net.Destination) bool {
    return isDomain(dest, internalDomain)
}
 
func init() {
    common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
        r := new(Reverse)
        if err := core.RequireFeatures(ctx, func(d routing.Dispatcher, om outbound.Manager) error {
            return r.Init(ctx, config.(*Config), d, om)
        }); err != nil {
            return nil, err
        }
        return r, nil
    }))
}
 
type Reverse struct {
    bridges []*Bridge
    portals []*Portal
}
 
func (r *Reverse) Init(ctx context.Context, config *Config, d routing.Dispatcher, ohm outbound.Manager) error {
    for _, bConfig := range config.BridgeConfig {
        b, err := NewBridge(ctx, bConfig, d)
        if err != nil {
            return err
        }
        r.bridges = append(r.bridges, b)
    }
 
    for _, pConfig := range config.PortalConfig {
        p, err := NewPortal(ctx, pConfig, ohm)
        if err != nil {
            return err
        }
        r.portals = append(r.portals, p)
    }
 
    return nil
}
 
func (r *Reverse) Type() interface{} {
    return (*Reverse)(nil)
}
 
func (r *Reverse) Start() error {
    for _, b := range r.bridges {
        if err := b.Start(); err != nil {
            return err
        }
    }
 
    for _, p := range r.portals {
        if err := p.Start(); err != nil {
            return err
        }
    }
 
    return nil
}
 
func (r *Reverse) Close() error {
    var errs []error
    for _, b := range r.bridges {
        errs = append(errs, b.Close())
    }
 
    for _, p := range r.portals {
        errs = append(errs, p.Close())
    }
 
    return errors.Combine(errs...)
}