Skip to content

Commit

Permalink
Fix: scan clash classical ruleset & surge ruleset
Browse files Browse the repository at this point in the history
  • Loading branch information
Loyalsoldier committed Oct 29, 2023
1 parent 82bc6a9 commit c5a7a88
Showing 1 changed file with 47 additions and 11 deletions.
58 changes: 47 additions & 11 deletions plugin/plaintext/common_in.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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
Expand All @@ -89,16 +98,45 @@ 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()))
if line == "" {
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 == "" {
Expand All @@ -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 {
Expand Down

0 comments on commit c5a7a88

Please sign in to comment.