summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorLoyalsoldier <[email protected]>2023-10-29 17:00:07 +0800
committerLoyalsoldier <[email protected]>2023-10-29 17:00:07 +0800
commitc5a7a88bdcc1a677207c1e30b5da8d88e357e5cc (patch)
tree3d572a96185e19f94beb350da6df9e5448b79677 /plugin
parent82bc6a9f3ccf028ff4c01849b4aee33a0c0bd94d (diff)
Fix: scan clash classical ruleset & surge ruleset
Diffstat (limited to 'plugin')
-rw-r--r--plugin/plaintext/common_in.go58
1 files changed, 47 insertions, 11 deletions
diff --git a/plugin/plaintext/common_in.go b/plugin/plaintext/common_in.go
index 0c146ae1..7b717aea 100644
--- a/plugin/plaintext/common_in.go
+++ b/plugin/plaintext/common_in.go
@@ -25,11 +25,11 @@ func (t *textIn) scanFile(reader io.Reader, entry *lib.Entry) error {
case typeTextIn:
err = t.scanFileForTextIn(reader, entry)
case typeClashRuleSetClassicalIn:
- err = t.scanFileForClashClassicalRuleSetInAndSurgeIn(reader, entry)
+ err = t.scanFileForClashClassicalRuleSetIn(reader, entry)
case typeClashRuleSetIPCIDRIn:
- err = t.scanFileForClashRuleSetIn(reader, entry)
+ err = t.scanFileForClashIPCIDRRuleSetIn(reader, entry)
case typeSurgeRuleSetIn:
- err = t.scanFileForClashClassicalRuleSetInAndSurgeIn(reader, entry)
+ err = t.scanFileForSurgeRuleSetIn(reader, entry)
default:
return lib.ErrNotSupportedFormat
}
@@ -62,21 +62,30 @@ func (t *textIn) scanFileForTextIn(reader io.Reader, entry *lib.Entry) error {
return nil
}
-func (t *textIn) scanFileForClashRuleSetIn(reader io.Reader, entry *lib.Entry) error {
+func (t *textIn) readClashRuleSetYAMLFile(reader io.Reader) ([]string, error) {
var payload struct {
Payload []string `yaml:"payload"`
}
data, err := io.ReadAll(reader)
if err != nil {
- return err
+ return nil, err
}
if err := yaml.Unmarshal(data, &payload); err != nil {
+ return nil, err
+ }
+
+ return payload.Payload, nil
+}
+
+func (t *textIn) scanFileForClashIPCIDRRuleSetIn(reader io.Reader, entry *lib.Entry) error {
+ payload, err := t.readClashRuleSetYAMLFile(reader)
+ if err != nil {
return err
}
- for _, cidrStr := range payload.Payload {
+ for _, cidrStr := range payload {
cidrStr = strings.TrimSpace(cidrStr)
if cidrStr == "" {
continue
@@ -89,7 +98,34 @@ func (t *textIn) scanFileForClashRuleSetIn(reader io.Reader, entry *lib.Entry) e
return nil
}
-func (t *textIn) scanFileForClashClassicalRuleSetInAndSurgeIn(reader io.Reader, entry *lib.Entry) error {
+func (t *textIn) scanFileForClashClassicalRuleSetIn(reader io.Reader, entry *lib.Entry) error {
+ payload, err := t.readClashRuleSetYAMLFile(reader)
+ if err != nil {
+ return err
+ }
+
+ for _, line := range payload {
+ line = strings.ToLower(strings.TrimSpace(line))
+ if line == "" {
+ continue
+ }
+
+ if strings.HasPrefix(line, "ip-cidr,") || strings.HasPrefix(line, "ip-cidr6,") {
+ _, line, _ = strings.Cut(line, ",")
+ line = strings.TrimSpace(line)
+ if line == "" {
+ continue
+ }
+ if err := entry.AddPrefix(line); err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
+func (t *textIn) scanFileForSurgeRuleSetIn(reader io.Reader, entry *lib.Entry) error {
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := strings.ToLower(strings.TrimSpace(scanner.Text()))
@@ -97,8 +133,10 @@ func (t *textIn) scanFileForClashClassicalRuleSetInAndSurgeIn(reader io.Reader,
continue
}
- switch {
- case strings.HasPrefix(line, "ip-cidr,"), strings.HasPrefix(line, "ip-cidr6,"):
+ if strings.HasPrefix(line, "ip-cidr,") || strings.HasPrefix(line, "ip-cidr6,") {
+ line, _, _ = strings.Cut(line, "#")
+ line, _, _ = strings.Cut(line, "//")
+ line, _, _ = strings.Cut(line, "/*")
_, line, _ = strings.Cut(line, ",")
line = strings.TrimSpace(line)
if line == "" {
@@ -107,8 +145,6 @@ func (t *textIn) scanFileForClashClassicalRuleSetInAndSurgeIn(reader io.Reader,
if err := entry.AddPrefix(line); err != nil {
return err
}
- default:
- continue
}
}
if err := scanner.Err(); err != nil {