119 lines
2.6 KiB
Go
119 lines
2.6 KiB
Go
package filters
|
|
|
|
import (
|
|
"net/http"
|
|
"path/filepath"
|
|
)
|
|
|
|
// Filtering - module object
|
|
type Filtering struct {
|
|
dnsBlocklist Filters // DNS blocklist filters
|
|
dnsAllowlist Filters // DNS allowlist filters
|
|
Proxylist Filters // MITM Proxy filtering module
|
|
|
|
conf ModuleConf
|
|
}
|
|
|
|
// ModuleConf - module config
|
|
type ModuleConf struct {
|
|
Enabled bool
|
|
UpdateIntervalHours uint32 // 0: disabled
|
|
HTTPClient *http.Client
|
|
DataDir string
|
|
DNSBlocklist []Filter
|
|
DNSAllowlist []Filter
|
|
Proxylist []Filter
|
|
UserRules []string
|
|
|
|
// Called when the configuration is changed by HTTP request
|
|
ConfigModified func()
|
|
|
|
// Register an HTTP handler
|
|
HTTPRegister func(string, string, func(http.ResponseWriter, *http.Request))
|
|
}
|
|
|
|
// NewModule - create module
|
|
func NewModule(conf ModuleConf) *Filtering {
|
|
f := Filtering{}
|
|
f.conf = conf
|
|
|
|
fconf := Conf{}
|
|
fconf.FilterDir = filepath.Join(conf.DataDir, "filters_dnsblock")
|
|
fconf.List = conf.DNSBlocklist
|
|
fconf.UpdateIntervalHours = conf.UpdateIntervalHours
|
|
fconf.HTTPClient = conf.HTTPClient
|
|
f.dnsBlocklist = New(fconf)
|
|
|
|
fconf = Conf{}
|
|
fconf.FilterDir = filepath.Join(conf.DataDir, "filters_dnsallow")
|
|
fconf.List = conf.DNSAllowlist
|
|
fconf.UpdateIntervalHours = conf.UpdateIntervalHours
|
|
fconf.HTTPClient = conf.HTTPClient
|
|
f.dnsAllowlist = New(fconf)
|
|
|
|
fconf = Conf{}
|
|
fconf.FilterDir = filepath.Join(conf.DataDir, "filters_mitmproxy")
|
|
fconf.List = conf.Proxylist
|
|
fconf.UpdateIntervalHours = conf.UpdateIntervalHours
|
|
fconf.HTTPClient = conf.HTTPClient
|
|
f.Proxylist = New(fconf)
|
|
|
|
return &f
|
|
}
|
|
|
|
const (
|
|
DNSBlocklist = iota
|
|
DNSAllowlist
|
|
Proxylist
|
|
)
|
|
|
|
func stringArrayDup(a []string) []string {
|
|
a2 := make([]string, len(a))
|
|
copy(a2, a)
|
|
return a2
|
|
}
|
|
|
|
// WriteDiskConfig - write configuration data
|
|
func (f *Filtering) WriteDiskConfig(mc *ModuleConf) {
|
|
mc.Enabled = f.conf.Enabled
|
|
mc.UpdateIntervalHours = f.conf.UpdateIntervalHours
|
|
mc.UserRules = stringArrayDup(f.conf.UserRules)
|
|
|
|
c := Conf{}
|
|
f.dnsBlocklist.WriteDiskConfig(&c)
|
|
mc.DNSBlocklist = c.List
|
|
|
|
c = Conf{}
|
|
f.dnsAllowlist.WriteDiskConfig(&c)
|
|
mc.DNSAllowlist = c.List
|
|
|
|
c = Conf{}
|
|
f.Proxylist.WriteDiskConfig(&c)
|
|
mc.Proxylist = c.List
|
|
}
|
|
|
|
// GetList - get specific filter list
|
|
func (f *Filtering) GetList(t uint32) Filters {
|
|
switch t {
|
|
case DNSBlocklist:
|
|
return f.dnsBlocklist
|
|
case DNSAllowlist:
|
|
return f.dnsAllowlist
|
|
case Proxylist:
|
|
return f.Proxylist
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Start - start module
|
|
func (f *Filtering) Start() {
|
|
f.dnsBlocklist.Start()
|
|
f.dnsAllowlist.Start()
|
|
f.Proxylist.Start()
|
|
f.registerWebHandlers()
|
|
}
|
|
|
|
// Close - close the module
|
|
func (f *Filtering) Close() {
|
|
}
|