filtering: imp code

This commit is contained in:
Ainar Garipov
2022-08-25 18:44:19 +03:00
parent 57c0b1203e
commit fa76ad2a3c
4 changed files with 48 additions and 27 deletions

View File

@@ -20,6 +20,11 @@ and this project adheres to
- Weaker cipher suites that use the CBC (cipher block chaining) mode of - Weaker cipher suites that use the CBC (cipher block chaining) mode of
operation have been disabled ([#2993]). operation have been disabled ([#2993]).
### Added
- A new HTTP API, `GET /control/blocked_services/services`, that lists all
available blocked services ([#4535]).
### Deprecated ### Deprecated
- Ports 784 and 8853 for DNS-over-QUIC in Docker images. Users who still serve - Ports 784 and 8853 for DNS-over-QUIC in Docker images. Users who still serve
@@ -34,6 +39,7 @@ and this project adheres to
- Unnecessary logging of non-critical statistics errors ([#4850]). - Unnecessary logging of non-critical statistics errors ([#4850]).
[#2993]: https://github.com/AdguardTeam/AdGuardHome/issues/2993 [#2993]: https://github.com/AdguardTeam/AdGuardHome/issues/2993
[#4535]: https://github.com/AdguardTeam/AdGuardHome/issues/4535
[#4745]: https://github.com/AdguardTeam/AdGuardHome/issues/4745 [#4745]: https://github.com/AdguardTeam/AdGuardHome/issues/4745
[#4850]: https://github.com/AdguardTeam/AdGuardHome/issues/4850 [#4850]: https://github.com/AdguardTeam/AdGuardHome/issues/4850
@@ -59,7 +65,7 @@ See also the [v0.107.11 GitHub milestone][ms-v0.107.11].
### Changed ### Changed
- DNS-over-QUIC connections now use keptalive. - DNS-over-QUIC connections now use keepalive.
### Fixed ### Fixed

View File

@@ -7,19 +7,21 @@ import (
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp" "github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
"github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/log"
"github.com/AdguardTeam/urlfilter/rules" "github.com/AdguardTeam/urlfilter/rules"
"golang.org/x/exp/slices"
) )
var serviceRules map[string][]*rules.NetworkRule // service name -> filtering rules // svc represents a single blocked service.
type svc struct { type svc struct {
name string name string
rules []string rules []string
} }
// servicesData contains raw blocked service data.
//
// Keep in sync with: // Keep in sync with:
// client/src/helpers/constants.js // - client/src/helpers/constants.js
// client/src/components/ui/Icons.js // - client/src/components/ui/Icons.js
var serviceRulesArray = []svc{{ var servicesData = []svc{{
name: "whatsapp", name: "whatsapp",
rules: []string{ rules: []string{
"||wa.me^", "||wa.me^",
@@ -365,21 +367,38 @@ var serviceRulesArray = []svc{{
}, },
}} }}
// convert array to map // 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() { func initBlockedServices() {
serviceRules = make(map[string][]*rules.NetworkRule) l := len(servicesData)
for _, s := range serviceRulesArray { serviceIDs = make([]string, l)
netRules := []*rules.NetworkRule{} serviceRules = make(map[string][]*rules.NetworkRule, l)
for i, s := range servicesData {
netRules := make([]*rules.NetworkRule, 0, len(s.rules))
for _, text := range s.rules { for _, text := range s.rules {
rule, err := rules.NewNetworkRule(text, BlockedSvcsListID) rule, err := rules.NewNetworkRule(text, BlockedSvcsListID)
if err != nil { if err != nil {
log.Error("rules.NewNetworkRule: %s rule: %s", err, text) log.Error("parsing blocked service %q rule %q: %s", s.name, text, err)
continue continue
} }
netRules = append(netRules, rule) netRules = append(netRules, rule)
} }
serviceIDs[i] = s.name
serviceRules[s.name] = netRules serviceRules[s.name] = netRules
} }
slices.Sort(serviceIDs)
log.Debug("filtering: initialized %d services", l)
} }
// BlockedSvcKnown - return TRUE if a blocked service name is known // BlockedSvcKnown - return TRUE if a blocked service name is known
@@ -412,15 +431,10 @@ func (d *DNSFilter) ApplyBlockedServices(setts *Settings, list []string, global
} }
func (d *DNSFilter) handleBlockedServicesAvailableServices(w http.ResponseWriter, r *http.Request) { func (d *DNSFilter) handleBlockedServicesAvailableServices(w http.ResponseWriter, r *http.Request) {
var list []string
for _, v := range serviceRulesArray {
list = append(list, s.name)
}
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(list) err := json.NewEncoder(w).Encode(serviceIDs)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusInternalServerError, "json.Encode: %s", err) aghhttp.Error(r, w, http.StatusInternalServerError, "encoding available services: %s", err)
return return
} }
@@ -434,7 +448,7 @@ func (d *DNSFilter) handleBlockedServicesList(w http.ResponseWriter, r *http.Req
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(list) err := json.NewEncoder(w).Encode(list)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusInternalServerError, "json.Encode: %s", err) aghhttp.Error(r, w, http.StatusInternalServerError, "encoding services: %s", err)
return return
} }

View File

@@ -296,9 +296,11 @@ func cloneRewrites(entries []*LegacyRewrite) (clone []*LegacyRewrite) {
return clone return clone
} }
// SetFilters - set new filters (synchronously or asynchronously) // SetFilters sets new filters, synchronously or asynchronously. When filters
// When filters are set asynchronously, the old filters continue working until the new filters are ready. // are set asynchronously, the old filters continue working until the new
// In this case the caller must ensure that the old filter files are intact. // filters are ready.
//
// In this case the caller must ensure that the old filter files are intact.
func (d *DNSFilter) SetFilters(blockFilters, allowFilters []Filter, async bool) error { func (d *DNSFilter) SetFilters(blockFilters, allowFilters []Filter, async bool) error {
if async { if async {
params := filtersInitializerParams{ params := filtersInitializerParams{

View File

@@ -130,10 +130,9 @@ func matchDomainWildcard(host, wildcard string) (ok bool) {
// //
// The sorting priority: // The sorting priority:
// //
// A and AAAA > CNAME // 1. A and AAAA > CNAME
// wildcard > exact // 2. wildcard > exact
// lower level wildcard > higher level wildcard // 3. lower level wildcard > higher level wildcard
//
type rewritesSorted []*LegacyRewrite type rewritesSorted []*LegacyRewrite
// Len implements the sort.Interface interface for legacyRewritesSorted. // Len implements the sort.Interface interface for legacyRewritesSorted.