From 1799ef47cedcfed8c979e145783fff7c9d1944cc Mon Sep 17 00:00:00 2001 From: radhitya Date: Sun, 5 Jul 2026 14:05:24 +0700 Subject: foreward upstream, in memory cache, udp listener, handler, cli flags --- internal/blocklist/blocklist.go | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 internal/blocklist/blocklist.go (limited to 'internal/blocklist/blocklist.go') diff --git a/internal/blocklist/blocklist.go b/internal/blocklist/blocklist.go new file mode 100644 index 0000000..34a456d --- /dev/null +++ b/internal/blocklist/blocklist.go @@ -0,0 +1,53 @@ +package blocklist + +import ( + "bufio" + "os" + "strings" +) + +type Blocklist struct { + domains map[string]struct{} +} + +func Load(path string) (*Blocklist, error) { + bl := &Blocklist{domains: make(map[string]struct{})} + f, err := os.Open(path) + if err != nil { + if os.IsNotExist(err) { + return bl, nil + } + return nil, err + } + defer f.Close() + + sc := bufio.NewScanner(f) + for sc.Scan() { + line := strings.TrimSpace(sc.Text()) + if line == "" || line[0] == '#' { + continue + } + line = strings.ToLower(line) + line = strings.TrimSuffix(line, ".") + bl.domains[line] = struct{}{} + } + return bl, sc.Err() +} + +func (bl *Blocklist) Blocked(qname string) bool { + qname = strings.ToLower(qname) + qname = strings.TrimSuffix(qname, ".") + + if _, ok := bl.domains[qname]; ok { + return true + } + + for i := 0; i < len(qname); i++ { + if qname[i] == '.' { + if _, ok := bl.domains[qname[i+1:]]; ok { + return true + } + } + } + return false +} -- cgit v1.2.3