|
|
@@ -20,14 +20,14 @@ type FieldRule struct {
|
|
|
|
|
|
func (this *FieldRule) Apply(dest v2net.Destination) bool {
|
|
|
address := dest.Address()
|
|
|
- if len(this.Domain) > 0 && address.IsDomain() {
|
|
|
- if !strings.Contains(address.Domain(), this.Domain) {
|
|
|
+ if len(this.Domain) > 0 {
|
|
|
+ if !address.IsDomain() || !strings.Contains(address.Domain(), this.Domain) {
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if this.IP != nil && (address.IsIPv4() || address.IsIPv6()) {
|
|
|
- if !this.IP.Contains(address.IP()) {
|
|
|
+ if this.IP != nil {
|
|
|
+ if !(address.IsIPv4() || address.IsIPv6()) || !this.IP.Contains(address.IP()) {
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
@@ -51,10 +51,10 @@ func (this *FieldRule) Apply(dest v2net.Destination) bool {
|
|
|
func (this *FieldRule) UnmarshalJSON(data []byte) error {
|
|
|
type RawFieldRule struct {
|
|
|
Rule
|
|
|
- Domain string `json:"domain"`
|
|
|
- IP string `json:"ip"`
|
|
|
- Port *v2netjson.PortRange
|
|
|
- Network *v2netjson.NetworkList
|
|
|
+ Domain string `json:"domain"`
|
|
|
+ IP string `json:"ip"`
|
|
|
+ Port *v2netjson.PortRange `json:"port"`
|
|
|
+ Network *v2netjson.NetworkList `json:"network"`
|
|
|
}
|
|
|
rawFieldRule := RawFieldRule{}
|
|
|
err := json.Unmarshal(data, &rawFieldRule)
|
|
|
@@ -63,17 +63,31 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
|
|
|
}
|
|
|
this.Type = rawFieldRule.Type
|
|
|
this.OutboundTag = rawFieldRule.OutboundTag
|
|
|
- this.Domain = rawFieldRule.Domain
|
|
|
- _, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
|
|
|
- if err != nil {
|
|
|
- return errors.New("Invalid IP range in router rule: " + err.Error())
|
|
|
+
|
|
|
+ hasField := false
|
|
|
+ if len(rawFieldRule.Domain) > 0 {
|
|
|
+ this.Domain = rawFieldRule.Domain
|
|
|
+ hasField = true
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(rawFieldRule.IP) > 0 {
|
|
|
+ _, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
|
|
|
+ if err != nil {
|
|
|
+ return errors.New("Invalid IP range in router rule: " + err.Error())
|
|
|
+ }
|
|
|
+ this.IP = ipNet
|
|
|
+ hasField = true
|
|
|
}
|
|
|
- this.IP = ipNet
|
|
|
if rawFieldRule.Port != nil {
|
|
|
this.Port = rawFieldRule.Port
|
|
|
+ hasField = true
|
|
|
}
|
|
|
if rawFieldRule.Network != nil {
|
|
|
this.Network = rawFieldRule.Network
|
|
|
+ hasField = true
|
|
|
+ }
|
|
|
+ if !hasField {
|
|
|
+ return errors.New("This rule has no effective fields.")
|
|
|
}
|
|
|
return nil
|
|
|
}
|