116 lines
2.8 KiB
Go
116 lines
2.8 KiB
Go
package filtering
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
|
|
"github.com/AdguardTeam/golibs/log"
|
|
"github.com/AdguardTeam/urlfilter/rules"
|
|
"golang.org/x/exp/slices"
|
|
)
|
|
|
|
// serviceRules maps a service ID to its filtering rules.
|
|
var serviceRules map[string][]*rules.NetworkRule
|
|
|
|
// serviceIDs contains service IDs sorted alphabetically.
|
|
var serviceIDs []string
|
|
|
|
// initBlockedServices initializes package-level blocked service data.
|
|
func initBlockedServices() {
|
|
l := len(blockedServices)
|
|
serviceIDs = make([]string, l)
|
|
serviceRules = make(map[string][]*rules.NetworkRule, l)
|
|
|
|
for i, s := range blockedServices {
|
|
netRules := make([]*rules.NetworkRule, 0, len(s.Rules))
|
|
for _, text := range s.Rules {
|
|
rule, err := rules.NewNetworkRule(text, BlockedSvcsListID)
|
|
if err != nil {
|
|
log.Error("parsing blocked service %q rule %q: %s", s.ID, text, err)
|
|
|
|
continue
|
|
}
|
|
|
|
netRules = append(netRules, rule)
|
|
}
|
|
|
|
serviceIDs[i] = s.ID
|
|
serviceRules[s.ID] = netRules
|
|
}
|
|
|
|
slices.Sort(serviceIDs)
|
|
|
|
log.Debug("filtering: initialized %d services", l)
|
|
}
|
|
|
|
// BlockedSvcKnown returns true if a blocked service ID is known.
|
|
func BlockedSvcKnown(s string) (ok bool) {
|
|
_, ok = serviceRules[s]
|
|
|
|
return ok
|
|
}
|
|
|
|
// ApplyBlockedServices - set blocked services settings for this DNS request
|
|
func (d *DNSFilter) ApplyBlockedServices(setts *Settings, list []string) {
|
|
setts.ServicesRules = []ServiceEntry{}
|
|
if list == nil {
|
|
d.confLock.RLock()
|
|
defer d.confLock.RUnlock()
|
|
|
|
list = d.Config.BlockedServices
|
|
}
|
|
|
|
for _, name := range list {
|
|
rules, ok := serviceRules[name]
|
|
if !ok {
|
|
log.Error("unknown service name: %s", name)
|
|
|
|
continue
|
|
}
|
|
|
|
setts.ServicesRules = append(setts.ServicesRules, ServiceEntry{
|
|
Name: name,
|
|
Rules: rules,
|
|
})
|
|
}
|
|
}
|
|
|
|
func (d *DNSFilter) handleBlockedServicesIDs(w http.ResponseWriter, r *http.Request) {
|
|
_ = aghhttp.WriteJSONResponse(w, r, serviceIDs)
|
|
}
|
|
|
|
func (d *DNSFilter) handleBlockedServicesAll(w http.ResponseWriter, r *http.Request) {
|
|
_ = aghhttp.WriteJSONResponse(w, r, struct {
|
|
BlockedServices []blockedService `json:"blocked_services"`
|
|
}{
|
|
BlockedServices: blockedServices,
|
|
})
|
|
}
|
|
|
|
func (d *DNSFilter) handleBlockedServicesList(w http.ResponseWriter, r *http.Request) {
|
|
d.confLock.RLock()
|
|
list := d.Config.BlockedServices
|
|
d.confLock.RUnlock()
|
|
|
|
_ = aghhttp.WriteJSONResponse(w, r, list)
|
|
}
|
|
|
|
func (d *DNSFilter) handleBlockedServicesSet(w http.ResponseWriter, r *http.Request) {
|
|
list := []string{}
|
|
err := json.NewDecoder(r.Body).Decode(&list)
|
|
if err != nil {
|
|
aghhttp.Error(r, w, http.StatusBadRequest, "json.Decode: %s", err)
|
|
|
|
return
|
|
}
|
|
|
|
d.confLock.Lock()
|
|
d.Config.BlockedServices = list
|
|
d.confLock.Unlock()
|
|
|
|
log.Debug("Updated blocked services list: %d", len(list))
|
|
|
|
d.Config.ConfigModified()
|
|
}
|