From 01437d0a0afc3533baba26e1f36e66e32ae86ac9 Mon Sep 17 00:00:00 2001 From: radhitya Date: Sun, 5 Jul 2026 18:37:52 +0700 Subject: finalize the blocklist feature --- internal/blocklist/blocklist.go | 52 ++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) (limited to 'internal/blocklist/blocklist.go') diff --git a/internal/blocklist/blocklist.go b/internal/blocklist/blocklist.go index 34a456d..84d758c 100644 --- a/internal/blocklist/blocklist.go +++ b/internal/blocklist/blocklist.go @@ -24,30 +24,50 @@ func Load(path string) (*Blocklist, error) { sc := bufio.NewScanner(f) for sc.Scan() { line := strings.TrimSpace(sc.Text()) - if line == "" || line[0] == '#' { + if line == "" || line[0] == '#' || line[0] == '!' { continue } - line = strings.ToLower(line) - line = strings.TrimSuffix(line, ".") - bl.domains[line] = struct{}{} + domain := parseLine(line) + if domain != "" && !strings.HasPrefix(domain, "*.") { + bl.domains[strings.ToLower(domain)] = struct {}{} + } } return bl, sc.Err() } -func (bl *Blocklist) Blocked(qname string) bool { - qname = strings.ToLower(qname) - qname = strings.TrimSuffix(qname, ".") +func parseLine(line string) string { + line = strings.TrimSpace(line) - if _, ok := bl.domains[qname]; ok { - return true + // 1. Hosts: "0.0.0.0 domain" "127.0.0.1 domain # comment" + if strings.HasPrefix(line, "0.0.0.0 ") { + line = line[8:] + } else if strings.HasPrefix(line, "127.0.0.1 ") { + line = line[10:] + } else if strings.HasPrefix(line, "||") { + // 2. AdGuard / uBlock: "||domain^$attr" + line = line[2:] + // Cut at ^ or $ + if idx := strings.IndexAny(line, "^$"); idx >= 0 { + line = line[:idx] + } } - for i := 0; i < len(qname); i++ { - if qname[i] == '.' { - if _, ok := bl.domains[qname[i+1:]]; ok { - return true - } - } + if idx := strings.IndexAny(line, " \t#"); idx >= 0 { + line = line[:idx] + } + + line = strings.TrimSpace(line) + line = strings.TrimSuffix(line, ".") + + if strings.ContainsAny(line, "/:\\?") { + return "" } - return false + return line +} + +func (bl *Blocklist) Blocked(qname string) bool { + qname = strings.ToLower(qname) + qname = strings.TrimSuffix(qname, ".") + _, ok := bl.domains[qname] + return ok } -- cgit v1.2.3