Skip to content

Commit 2b84dd3

Browse files
committed
fix: regex in logic rules
#2150
1 parent 6a620ba commit 2b84dd3

File tree

3 files changed

+25
-30
lines changed

3 files changed

+25
-30
lines changed

rules/common/base.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package common
22

33
import (
44
"errors"
5+
"strings"
56

67
C "github.com/metacubex/mihomo/constant"
78

@@ -33,4 +34,22 @@ func ParseParams(params []string) (isSrc bool, noResolve bool) {
3334
return
3435
}
3536

37+
func ParseRulePayload(ruleRaw string) (string, string, []string) {
38+
item := strings.Split(ruleRaw, ",")
39+
if len(item) == 1 {
40+
return "", item[0], nil
41+
} else if len(item) == 2 {
42+
return item[0], item[1], nil
43+
} else if len(item) > 2 {
44+
// keep in sync with config/config.go [parseRules]
45+
if item[0] == "NOT" || item[0] == "OR" || item[0] == "AND" || item[0] == "SUB-RULE" || item[0] == "DOMAIN-REGEX" || item[0] == "PROCESS-NAME-REGEX" || item[0] == "PROCESS-PATH-REGEX" {
46+
return item[0], strings.Join(item[1:], ","), nil
47+
} else {
48+
return item[0], item[1], item[2:]
49+
}
50+
}
51+
52+
return "", "", nil
53+
}
54+
3655
type ParseRuleFunc func(tp, payload, target string, params []string, subRules map[string][]C.Rule) (C.Rule, error)

rules/logic/logic.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,21 +78,14 @@ func (r Range) containRange(preStart, preEnd int) bool {
7878
}
7979

8080
func (logic *Logic) payloadToRule(subPayload string, parseRule common.ParseRuleFunc) (C.Rule, error) {
81-
splitStr := strings.SplitN(subPayload, ",", 2)
82-
if len(splitStr) < 2 {
83-
return nil, fmt.Errorf("[%s] format is error", subPayload)
84-
}
85-
86-
tp := splitStr[0]
87-
payload := splitStr[1]
81+
tp, payload, param := common.ParseRulePayload(subPayload)
8882
switch tp {
8983
case "MATCH", "SUB-RULE":
9084
return nil, fmt.Errorf("unsupported rule type [%s] on logic rule", tp)
91-
case "NOT", "OR", "AND":
92-
return parseRule(tp, payload, "", nil, nil)
85+
case "":
86+
return nil, fmt.Errorf("[%s] format is error", subPayload)
9387
}
94-
param := strings.Split(payload, ",")
95-
return parseRule(tp, param[0], "", param[1:], nil)
88+
return parseRule(tp, payload, "", param, nil)
9689
}
9790

9891
func (logic *Logic) format(payload string) ([]Range, error) {

rules/provider/classical_strategy.go

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package provider
22

33
import (
44
"fmt"
5-
"strings"
65

76
C "github.com/metacubex/mihomo/constant"
87
P "github.com/metacubex/mihomo/constant/provider"
98
"github.com/metacubex/mihomo/log"
9+
"github.com/metacubex/mihomo/rules/common"
1010
)
1111

1212
type classicalStrategy struct {
@@ -39,7 +39,7 @@ func (c *classicalStrategy) Reset() {
3939
}
4040

4141
func (c *classicalStrategy) Insert(rule string) {
42-
ruleType, rule, params := ruleParse(rule)
42+
ruleType, rule, params := common.ParseRulePayload(rule)
4343
r, err := c.parse(ruleType, rule, "", params)
4444
if err != nil {
4545
log.Warnln("parse classical rule error: %s", err.Error())
@@ -51,23 +51,6 @@ func (c *classicalStrategy) Insert(rule string) {
5151

5252
func (c *classicalStrategy) FinishInsert() {}
5353

54-
func ruleParse(ruleRaw string) (string, string, []string) {
55-
item := strings.Split(ruleRaw, ",")
56-
if len(item) == 1 {
57-
return "", item[0], nil
58-
} else if len(item) == 2 {
59-
return item[0], item[1], nil
60-
} else if len(item) > 2 {
61-
if item[0] == "NOT" || item[0] == "OR" || item[0] == "AND" || item[0] == "SUB-RULE" || item[0] == "DOMAIN-REGEX" || item[0] == "PROCESS-NAME-REGEX" || item[0] == "PROCESS-PATH-REGEX" {
62-
return item[0], strings.Join(item[1:], ","), nil
63-
} else {
64-
return item[0], item[1], item[2:]
65-
}
66-
}
67-
68-
return "", "", nil
69-
}
70-
7154
func NewClassicalStrategy(parse func(tp, payload, target string, params []string, subRules map[string][]C.Rule) (parsed C.Rule, parseErr error)) *classicalStrategy {
7255
return &classicalStrategy{rules: []C.Rule{}, parse: func(tp, payload, target string, params []string) (parsed C.Rule, parseErr error) {
7356
switch tp {

0 commit comments

Comments
 (0)