瀏覽代碼

Add invert rule item

世界 3 年之前
父節點
當前提交
ce4b7231e2
共有 4 個文件被更改,包括 14 次插入7 次删除
  1. 1 0
      option/dns.go
  2. 2 0
      option/route.go
  3. 6 4
      route/rule.go
  4. 5 3
      route/rule_dns.go

+ 1 - 0
option/dns.go

@@ -107,6 +107,7 @@ type DefaultDNSRule struct {
 	User          Listable[string] `json:"user,omitempty"`
 	UserID        Listable[int32]  `json:"user_id,omitempty"`
 	Outbound      Listable[string] `json:"outbound,omitempty"`
+	Invert        bool             `json:"invert,omitempty"`
 	Server        string           `json:"server,omitempty"`
 }
 

+ 2 - 0
option/route.go

@@ -107,6 +107,7 @@ type DefaultRule struct {
 	PackageName   Listable[string] `json:"package_name,omitempty"`
 	User          Listable[string] `json:"user,omitempty"`
 	UserID        Listable[int32]  `json:"user_id,omitempty"`
+	Invert        bool             `json:"invert,omitempty"`
 	Outbound      string           `json:"outbound,omitempty"`
 }
 
@@ -137,6 +138,7 @@ func (r DefaultRule) Equals(other DefaultRule) bool {
 		common.ComparableSliceEquals(r.PackageName, other.PackageName) &&
 		common.ComparableSliceEquals(r.User, other.User) &&
 		common.ComparableSliceEquals(r.UserID, other.UserID) &&
+		r.Invert == other.Invert &&
 		r.Outbound == other.Outbound
 }
 

+ 6 - 4
route/rule.go

@@ -45,6 +45,7 @@ type DefaultRule struct {
 	sourceAddressItems      []RuleItem
 	destinationAddressItems []RuleItem
 	allItems                []RuleItem
+	invert                  bool
 	outbound                string
 }
 
@@ -59,6 +60,7 @@ type RuleItem interface {
 
 func NewDefaultRule(router adapter.Router, logger log.ContextLogger, options option.DefaultRule) (*DefaultRule, error) {
 	rule := &DefaultRule{
+		invert:   options.Invert,
 		outbound: options.Outbound,
 	}
 	if len(options.Inbound) > 0 {
@@ -213,7 +215,7 @@ func (r *DefaultRule) UpdateGeosite() error {
 func (r *DefaultRule) Match(metadata *adapter.InboundContext) bool {
 	for _, item := range r.items {
 		if !item.Match(metadata) {
-			return false
+			return r.invert
 		}
 	}
 
@@ -226,7 +228,7 @@ func (r *DefaultRule) Match(metadata *adapter.InboundContext) bool {
 			}
 		}
 		if !sourceAddressMatch {
-			return false
+			return r.invert
 		}
 	}
 
@@ -239,11 +241,11 @@ func (r *DefaultRule) Match(metadata *adapter.InboundContext) bool {
 			}
 		}
 		if !destinationAddressMatch {
-			return false
+			return r.invert
 		}
 	}
 
-	return true
+	return !r.invert
 }
 
 func (r *DefaultRule) Outbound() string {

+ 5 - 3
route/rule_dns.go

@@ -44,6 +44,7 @@ type DefaultDNSRule struct {
 	items        []RuleItem
 	addressItems []RuleItem
 	allItems     []RuleItem
+	invert       bool
 	outbound     string
 }
 
@@ -53,6 +54,7 @@ func (r *DefaultDNSRule) Type() string {
 
 func NewDefaultDNSRule(router adapter.Router, logger log.ContextLogger, options option.DefaultDNSRule) (*DefaultDNSRule, error) {
 	rule := &DefaultDNSRule{
+		invert:   true,
 		outbound: options.Server,
 	}
 	if len(options.Inbound) > 0 {
@@ -189,7 +191,7 @@ func (r *DefaultDNSRule) UpdateGeosite() error {
 func (r *DefaultDNSRule) Match(metadata *adapter.InboundContext) bool {
 	for _, item := range r.items {
 		if !item.Match(metadata) {
-			return false
+			return r.invert
 		}
 	}
 	if len(r.addressItems) > 0 {
@@ -201,10 +203,10 @@ func (r *DefaultDNSRule) Match(metadata *adapter.InboundContext) bool {
 			}
 		}
 		if !addressMatch {
-			return false
+			return r.invert
 		}
 	}
-	return true
+	return !r.invert
 }
 
 func (r *DefaultDNSRule) Outbound() string {