From e092ab98312d0a23455f67384c1bed1a467eb449 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Nov 2021 16:28:26 +0100 Subject: [PATCH 1/8] Resolve hostname to localhost --- nameserver/module.go | 7 +++++++ nameserver/nameserver.go | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/nameserver/module.go b/nameserver/module.go index e85443fd..6ef47d71 100644 --- a/nameserver/module.go +++ b/nameserver/module.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net" + "os" "strconv" "github.com/safing/portbase/log" @@ -46,6 +47,12 @@ func start() error { return fmt.Errorf("failed to parse nameserver listen address: %w", err) } + hostname, err = os.Hostname() + if err != nil { + log.Warningf("nameserver: failed to get hostname: %s", err) + } + hostname += "." + // Start listener(s). if ip2 == nil { // Start a single listener. diff --git a/nameserver/nameserver.go b/nameserver/nameserver.go index 44a37b2f..6c09e601 100644 --- a/nameserver/nameserver.go +++ b/nameserver/nameserver.go @@ -19,6 +19,8 @@ import ( "github.com/miekg/dns" ) +var hostname string + func handleRequestAsWorker(w dns.ResponseWriter, query *dns.Msg) { err := module.RunWorker("dns request", func(ctx context.Context) error { return handleRequest(ctx, w, query) @@ -87,8 +89,8 @@ func handleRequest(ctx context.Context, w dns.ResponseWriter, request *dns.Msg) return reply(nsutil.Refused("unsupported qclass")) } - // Handle request for localhost. - if strings.HasSuffix(q.FQDN, "localhost.") { + // Handle request for localhost and the hostname. + if strings.HasSuffix(q.FQDN, "localhost.") || q.FQDN == hostname { tracer.Tracef("nameserver: returning localhost records") return reply(nsutil.Localhost()) } From 34de13a43666ec15b308a865b6b8301b644902d2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Nov 2021 16:28:54 +0100 Subject: [PATCH 2/8] Add OpenSuse connectivity domain --- netenv/online-status.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netenv/online-status.go b/netenv/online-status.go index ddad55e2..a1e452a3 100644 --- a/netenv/online-status.go +++ b/netenv/online-status.go @@ -74,7 +74,8 @@ var ( "connectivity-check.ubuntu.com.", // Ubuntu "nmcheck.gnome.org.", // Gnome DE "network-test.debian.org.", // Debian - "204.pop-os.org", // Pop OS + "204.pop-os.org.", // Pop OS + "conncheck.opensuse.org.", // OpenSUSE // There are probably a lot more domains for all the Linux Distro/DE Variants. Please raise issues and/or submit PRs! // https://github.com/solus-project/budgie-desktop/issues/807 // https://www.lguruprasad.in/blog/2015/07/21/enabling-captive-portal-detection-in-gnome-3-14-on-debian-jessie/ From ed31575cee129443910a6f503202541abc0362bc Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Nov 2021 16:31:27 +0100 Subject: [PATCH 3/8] Ignore un-parse-able RR records when serializing --- resolver/rrcache.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/resolver/rrcache.go b/resolver/rrcache.go index de62b4e6..f82b416b 100644 --- a/resolver/rrcache.go +++ b/resolver/rrcache.go @@ -135,20 +135,30 @@ func (rrCache *RRCache) ToNameRecord() *NameRecord { Resolver: rrCache.Resolver, } - // stringify RR entries - for _, entry := range rrCache.Answer { - new.Answer = append(new.Answer, entry.String()) - } - for _, entry := range rrCache.Ns { - new.Ns = append(new.Ns, entry.String()) - } - for _, entry := range rrCache.Extra { - new.Extra = append(new.Extra, entry.String()) - } + // Serialize RR entries to strings. + new.Answer = toNameRecordSection(rrCache.Answer) + new.Ns = toNameRecordSection(rrCache.Ns) + new.Extra = toNameRecordSection(rrCache.Extra) return new } +func toNameRecordSection(rrSection []dns.RR) []string { + serialized := make([]string, 0, len(rrSection)) + for _, entry := range rrSection { + // Ignore some RR types. + switch entry.Header().Rrtype { + case dns.TypeOPT: + // This record type cannot be unserialized again and only consists of + // additional metadata. + case dns.TypeNULL: + default: + serialized = append(serialized, entry.String()) + } + } + return serialized +} + // rcodeIsCacheable returns whether a record with the given RCode should be cached. func rcodeIsCacheable(rCode int) bool { switch rCode { From 0f08918bbdad470b8d7d9acf6f404acb3d41dc2b Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Nov 2021 16:31:46 +0100 Subject: [PATCH 4/8] Add nscd to system resolver detection --- process/profile.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/process/profile.go b/process/profile.go index e55873a2..a175b2e0 100644 --- a/process/profile.go +++ b/process/profile.go @@ -72,7 +72,9 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) { case "/lib/systemd/systemd-resolved", "/usr/lib/systemd/systemd-resolved", "/lib64/systemd/systemd-resolved", - "/usr/lib64/systemd/systemd-resolved": + "/usr/lib64/systemd/systemd-resolved", + "/usr/sbin/nscd", + "/usr/local/sbin/nscd": profileID = profile.SystemResolverProfileID } } From 46791ee34cd0a9dda5badc69b4e4860862b75cfd Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 Nov 2021 13:00:55 +0100 Subject: [PATCH 5/8] Improve api endpoint registration --- netenv/main.go | 8 ++++---- network/module.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/netenv/main.go b/netenv/main.go index c4454dca..baeaa7d5 100644 --- a/netenv/main.go +++ b/netenv/main.go @@ -22,6 +22,10 @@ func init() { } func prep() error { + if err := registerAPIEndpoints(); err != nil { + return err + } + if err := prepOnlineStatus(); err != nil { return err } @@ -30,10 +34,6 @@ func prep() error { } func start() error { - if err := registerAPIEndpoints(); err != nil { - return err - } - module.StartServiceWorker( "monitor network changes", 0, diff --git a/network/module.go b/network/module.go index 081d6725..23022dbc 100644 --- a/network/module.go +++ b/network/module.go @@ -11,7 +11,7 @@ var ( ) func init() { - module = modules.Register("network", nil, start, nil, "base", "processes") + module = modules.Register("network", prep, start, nil, "base", "processes") } // SetDefaultFirewallHandler sets the default firewall handler. From fe098f537141cd6456ba3671d498fe1d4b7d5b0e Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 Nov 2021 13:01:29 +0100 Subject: [PATCH 6/8] Add utf-8 charset to ui .json Mime Type --- ui/serve.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/serve.go b/ui/serve.go index 4a341f8f..05c3af90 100644 --- a/ui/serve.go +++ b/ui/serve.go @@ -205,7 +205,7 @@ var ( ".jpeg": "image/jpeg", ".jpg": "image/jpeg", ".js": "text/javascript; charset=utf-8", - ".json": "application/json", + ".json": "application/json; charset=utf-8", ".m3u": "audio/mpegurl", ".m4a": "audio/mpeg", ".md": "text/markdown; charset=utf-8", From 9185bf5bac85f3b6bcd5a585294e6f864a86583c Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 Nov 2021 13:01:49 +0100 Subject: [PATCH 7/8] Update dsd loading to new version --- intel/filterlists/decoder.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/intel/filterlists/decoder.go b/intel/filterlists/decoder.go index 3e9c54b0..c2be0f7e 100644 --- a/intel/filterlists/decoder.go +++ b/intel/filterlists/decoder.go @@ -83,14 +83,11 @@ func decodeFile(ctx context.Context, r io.Reader, ch chan<- *listEntry) error { // JSON, BSON or GenCode. So LoadAsFormat MUST return the value // passed as the third parameter. String or RAW encoding IS AN // error here. - val, err := dsd.LoadAsFormat(blob, format, &listEntry{}) + entry := &listEntry{} + err := dsd.LoadAsFormat(blob, format, entry) if err != nil { return fmt.Errorf("failed to decoded DSD encoded entity: %w", err) } - entry, ok := val.(*listEntry) - if !ok { - return fmt.Errorf("unsupported encoding format: %d (%c)", format, format) - } select { case ch <- entry: From 07c727c643707c67893d2121eb45597d0b8ed4c2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 24 Nov 2021 16:37:26 +0100 Subject: [PATCH 8/8] Improve system resolver paths for linux --- process/profile.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/process/profile.go b/process/profile.go index a175b2e0..0068d73a 100644 --- a/process/profile.go +++ b/process/profile.go @@ -73,8 +73,10 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) { "/usr/lib/systemd/systemd-resolved", "/lib64/systemd/systemd-resolved", "/usr/lib64/systemd/systemd-resolved", + "/usr/bin/nscd", "/usr/sbin/nscd", - "/usr/local/sbin/nscd": + "/usr/bin/dnsmasq", + "/usr/sbin/dnsmasq": profileID = profile.SystemResolverProfileID } }