From fa1b8aa148c55c065c99071fc8a9fc5e36bd373e Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 25 Jan 2021 17:11:48 +0100 Subject: [PATCH] Improve resolver API --- resolver/api.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ resolver/main.go | 15 ++++---------- resolver/resolver.go | 8 ++++---- resolver/scopes.go | 4 ---- 4 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 resolver/api.go diff --git a/resolver/api.go b/resolver/api.go new file mode 100644 index 00000000..69700c48 --- /dev/null +++ b/resolver/api.go @@ -0,0 +1,49 @@ +package resolver + +import ( + "github.com/safing/portbase/api" +) + +func registerAPI() error { + if err := api.RegisterEndpoint(api.Endpoint{ + Path: "dns/clear", + Read: api.PermitUser, + ActionFunc: clearNameCache, + Name: "Clear cached DNS records", + Description: "Deletes all saved DNS records from the database.", + }); err != nil { + return err + } + + if err := api.RegisterEndpoint(api.Endpoint{ + Path: "dns/resolvers", + Read: api.PermitAnyone, + StructFunc: exportDNSResolvers, + Name: "List DNS Resolvers", + Description: "List currently configured DNS resolvers and their status.", + }); err != nil { + return err + } + + return nil +} + +type resolverExport struct { + *Resolver + Failing bool +} + +func exportDNSResolvers(*api.Request) (interface{}, error) { + resolversLock.RLock() + defer resolversLock.RUnlock() + + export := make([]*resolverExport, 0, len(globalResolvers)) + for _, r := range globalResolvers { + export = append(export, &resolverExport{ + Resolver: r, + Failing: r.Conn.IsFailing(), + }) + } + + return export, nil +} diff --git a/resolver/main.go b/resolver/main.go index 343d5a50..bb1825c6 100644 --- a/resolver/main.go +++ b/resolver/main.go @@ -6,8 +6,6 @@ import ( "strings" "time" - "github.com/safing/portbase/api" - "github.com/safing/portbase/log" "github.com/safing/portbase/modules" "github.com/safing/portmaster/intel" @@ -31,6 +29,10 @@ func init() { func prep() error { intel.SetReverseResolver(ResolveIPAndValidate) + if err := registerAPI(); err != nil { + return err + } + if err := prepEnvResolver(); err != nil { return err } @@ -78,15 +80,6 @@ func start() error { return err } - // Register api endpoint to clear DNS cache. - if err := api.RegisterEndpoint(api.Endpoint{ - Path: "dns/clear/namecache", - Read: api.PermitUser, - ActionFunc: clearNameCache, - }); err != nil { - return err - } - // DEPRECATED: remove in v0.7 // cache clearing err = module.RegisterEventHook( diff --git a/resolver/resolver.go b/resolver/resolver.go index d7f21555..ad7f5741 100644 --- a/resolver/resolver.go +++ b/resolver/resolver.go @@ -41,6 +41,9 @@ type Resolver struct { // - `zeroip`: Answer only contains zeroip Server string + // Source describes from where the resolver configuration originated. + Source string + // Name is the name of the resolver as passed via // ?name=. Name string @@ -65,12 +68,9 @@ type Resolver struct { // Special Options VerifyDomain string Search []string - SkipFQDN string - - Source string // logic interface - Conn ResolverConn + Conn ResolverConn `json:"-"` } // IsBlockedUpstream returns true if the request has been blocked diff --git a/resolver/scopes.go b/resolver/scopes.go index 0943cf2b..f0102b17 100644 --- a/resolver/scopes.go +++ b/resolver/scopes.go @@ -208,10 +208,6 @@ func (q *Query) checkCompliance() error { } func (resolver *Resolver) checkCompliance(_ context.Context, q *Query) error { - if q.FQDN == resolver.SkipFQDN { - return errSkip - } - if noInsecureProtocols(q.SecurityLevel) { switch resolver.ServerType { case ServerTypeDNS: