diff options
| author | Loyalsoldier <[email protected]> | 2023-10-29 17:00:07 +0800 |
|---|---|---|
| committer | Loyalsoldier <[email protected]> | 2023-10-29 17:00:07 +0800 |
| commit | c5a7a88bdcc1a677207c1e30b5da8d88e357e5cc (patch) | |
| tree | 3d572a96185e19f94beb350da6df9e5448b79677 /plugin | |
| parent | 82bc6a9f3ccf028ff4c01849b4aee33a0c0bd94d (diff) | |
Fix: scan clash classical ruleset & surge ruleset
Diffstat (limited to 'plugin')
| -rw-r--r-- | plugin/plaintext/common_in.go | 58 |
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 { |
