Files
AdGuardHome/filters/filter_module.go
Simon Zolin f85de51452 MITM proxy
2020-08-18 19:23:33 +03:00

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() {
}