mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.3 KiB
101 lines
2.3 KiB
4 years ago
|
package conf
|
||
|
|
||
|
import (
|
||
|
"github.com/xtls/xray-core/v1/app/policy"
|
||
|
)
|
||
|
|
||
|
type Policy struct {
|
||
|
Handshake *uint32 `json:"handshake"`
|
||
|
ConnectionIdle *uint32 `json:"connIdle"`
|
||
|
UplinkOnly *uint32 `json:"uplinkOnly"`
|
||
|
DownlinkOnly *uint32 `json:"downlinkOnly"`
|
||
|
StatsUserUplink bool `json:"statsUserUplink"`
|
||
|
StatsUserDownlink bool `json:"statsUserDownlink"`
|
||
|
BufferSize *int32 `json:"bufferSize"`
|
||
|
}
|
||
|
|
||
|
func (t *Policy) Build() (*policy.Policy, error) {
|
||
|
config := new(policy.Policy_Timeout)
|
||
|
if t.Handshake != nil {
|
||
|
config.Handshake = &policy.Second{Value: *t.Handshake}
|
||
|
}
|
||
|
if t.ConnectionIdle != nil {
|
||
|
config.ConnectionIdle = &policy.Second{Value: *t.ConnectionIdle}
|
||
|
}
|
||
|
if t.UplinkOnly != nil {
|
||
|
config.UplinkOnly = &policy.Second{Value: *t.UplinkOnly}
|
||
|
}
|
||
|
if t.DownlinkOnly != nil {
|
||
|
config.DownlinkOnly = &policy.Second{Value: *t.DownlinkOnly}
|
||
|
}
|
||
|
|
||
|
p := &policy.Policy{
|
||
|
Timeout: config,
|
||
|
Stats: &policy.Policy_Stats{
|
||
|
UserUplink: t.StatsUserUplink,
|
||
|
UserDownlink: t.StatsUserDownlink,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
if t.BufferSize != nil {
|
||
|
bs := int32(-1)
|
||
|
if *t.BufferSize >= 0 {
|
||
|
bs = (*t.BufferSize) * 1024
|
||
|
}
|
||
|
p.Buffer = &policy.Policy_Buffer{
|
||
|
Connection: bs,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return p, nil
|
||
|
}
|
||
|
|
||
|
type SystemPolicy struct {
|
||
|
StatsInboundUplink bool `json:"statsInboundUplink"`
|
||
|
StatsInboundDownlink bool `json:"statsInboundDownlink"`
|
||
|
StatsOutboundUplink bool `json:"statsOutboundUplink"`
|
||
|
StatsOutboundDownlink bool `json:"statsOutboundDownlink"`
|
||
|
}
|
||
|
|
||
|
func (p *SystemPolicy) Build() (*policy.SystemPolicy, error) {
|
||
|
return &policy.SystemPolicy{
|
||
|
Stats: &policy.SystemPolicy_Stats{
|
||
|
InboundUplink: p.StatsInboundUplink,
|
||
|
InboundDownlink: p.StatsInboundDownlink,
|
||
|
OutboundUplink: p.StatsOutboundUplink,
|
||
|
OutboundDownlink: p.StatsOutboundDownlink,
|
||
|
},
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
type PolicyConfig struct {
|
||
|
Levels map[uint32]*Policy `json:"levels"`
|
||
|
System *SystemPolicy `json:"system"`
|
||
|
}
|
||
|
|
||
|
func (c *PolicyConfig) Build() (*policy.Config, error) {
|
||
|
levels := make(map[uint32]*policy.Policy)
|
||
|
for l, p := range c.Levels {
|
||
|
if p != nil {
|
||
|
pp, err := p.Build()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
levels[l] = pp
|
||
|
}
|
||
|
}
|
||
|
config := &policy.Config{
|
||
|
Level: levels,
|
||
|
}
|
||
|
|
||
|
if c.System != nil {
|
||
|
sc, err := c.System.Build()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
config.System = sc
|
||
|
}
|
||
|
|
||
|
return config, nil
|
||
|
}
|