trying to add DNS

This commit is contained in:
Pascal Fischer 2023-10-09 14:58:48 +02:00
parent 91b45eab98
commit 7f958e9338
16 changed files with 101 additions and 50 deletions

View File

@ -42,15 +42,11 @@ func RunClientMobile(ctx context.Context, config *Config, statusRecorder *peer.S
return runClient(ctx, config, statusRecorder, mobileDependency) return runClient(ctx, config, statusRecorder, mobileDependency)
} }
func RunClientiOS(ctx context.Context, config *Config, statusRecorder *peer.Status, fileDescriptor int32, iFaceDiscover stdnet.ExternalIFaceDiscover, routeListener routemanager.RouteListener, dnsAddresses []string, dnsReadyListener dns.ReadyListener) error { func RunClientiOS(ctx context.Context, config *Config, statusRecorder *peer.Status, fileDescriptor int32, routeListener routemanager.RouteListener, dnsManager dns.IosDnsManager) error {
// func RunClientiOS(ctx context.Context, config *Config, statusRecorder *peer.Status, iFaceDiscover stdnet.ExternalIFaceDiscover, routeListener routemanager.RouteListener, dnsAddresses []string, dnsReadyListener dns.ReadyListener) error {
mobileDependency := MobileDependency{ mobileDependency := MobileDependency{
TunAdapter: nil, FileDescriptor: fileDescriptor,
FileDescriptor: fileDescriptor, RouteListener: routeListener,
IFaceDiscover: iFaceDiscover, DnsManager: dnsManager,
RouteListener: routeListener,
HostDNSAddresses: dnsAddresses,
DnsReadyListener: dnsReadyListener,
} }
return runClient(ctx, config, statusRecorder, mobileDependency) return runClient(ctx, config, statusRecorder, mobileDependency)
} }

View File

@ -39,7 +39,7 @@ func (f *fileConfigurator) supportCustomPort() bool {
return false return false
} }
func (f *fileConfigurator) applyDNSConfig(config hostDNSConfig) error { func (f *fileConfigurator) applyDNSConfig(config HostDNSConfig) error {
backupFileExist := false backupFileExist := false
_, err := os.Stat(fileDefaultResolvConfBackupLocation) _, err := os.Stat(fileDefaultResolvConfBackupLocation)
if err == nil { if err == nil {

View File

@ -8,12 +8,12 @@ import (
) )
type hostManager interface { type hostManager interface {
applyDNSConfig(config hostDNSConfig) error applyDNSConfig(config HostDNSConfig) error
restoreHostDNS() error restoreHostDNS() error
supportCustomPort() bool supportCustomPort() bool
} }
type hostDNSConfig struct { type HostDNSConfig struct {
domains []domainConfig domains []domainConfig
routeAll bool routeAll bool
serverIP string serverIP string
@ -27,12 +27,12 @@ type domainConfig struct {
} }
type mockHostConfigurator struct { type mockHostConfigurator struct {
applyDNSConfigFunc func(config hostDNSConfig) error applyDNSConfigFunc func(config HostDNSConfig) error
restoreHostDNSFunc func() error restoreHostDNSFunc func() error
supportCustomPortFunc func() bool supportCustomPortFunc func() bool
} }
func (m *mockHostConfigurator) applyDNSConfig(config hostDNSConfig) error { func (m *mockHostConfigurator) applyDNSConfig(config HostDNSConfig) error {
if m.applyDNSConfigFunc != nil { if m.applyDNSConfigFunc != nil {
return m.applyDNSConfigFunc(config) return m.applyDNSConfigFunc(config)
} }
@ -55,14 +55,14 @@ func (m *mockHostConfigurator) supportCustomPort() bool {
func newNoopHostMocker() hostManager { func newNoopHostMocker() hostManager {
return &mockHostConfigurator{ return &mockHostConfigurator{
applyDNSConfigFunc: func(config hostDNSConfig) error { return nil }, applyDNSConfigFunc: func(config HostDNSConfig) error { return nil },
restoreHostDNSFunc: func() error { return nil }, restoreHostDNSFunc: func() error { return nil },
supportCustomPortFunc: func() bool { return true }, supportCustomPortFunc: func() bool { return true },
} }
} }
func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) hostDNSConfig { func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) HostDNSConfig {
config := hostDNSConfig{ config := HostDNSConfig{
routeAll: false, routeAll: false,
serverIP: ip, serverIP: ip,
serverPort: port, serverPort: port,

View File

@ -7,7 +7,7 @@ func newHostManager(wgInterface WGIface) (hostManager, error) {
return &androidHostManager{}, nil return &androidHostManager{}, nil
} }
func (a androidHostManager) applyDNSConfig(config hostDNSConfig) error { func (a androidHostManager) applyDNSConfig(config HostDNSConfig) error {
return nil return nil
} }

View File

@ -1,3 +1,5 @@
//go:build !ios
package dns package dns
import ( import (
@ -42,7 +44,7 @@ func (s *systemConfigurator) supportCustomPort() bool {
return true return true
} }
func (s *systemConfigurator) applyDNSConfig(config hostDNSConfig) error { func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig) error {
var err error var err error
if config.routeAll { if config.routeAll {

View File

@ -0,0 +1,25 @@
package dns
type iosHostManager struct {
dnsManager IosDnsManager
config HostDNSConfig
}
func newHostManager(wgInterface WGIface, dnsManager IosDnsManager) (hostManager, error) {
return &iosHostManager{
dnsManager: dnsManager,
}, nil
}
func (a iosHostManager) applyDNSConfig(config HostDNSConfig) error {
a.dnsManager.applyDns("bla")
return nil
}
func (a iosHostManager) restoreHostDNS() error {
return nil
}
func (a iosHostManager) supportCustomPort() bool {
return false
}

View File

@ -45,7 +45,7 @@ func (s *registryConfigurator) supportCustomPort() bool {
return false return false
} }
func (r *registryConfigurator) applyDNSConfig(config hostDNSConfig) error { func (r *registryConfigurator) applyDNSConfig(config HostDNSConfig) error {
var err error var err error
if config.routeAll { if config.routeAll {
err = r.addDNSSetupForAll(config.serverIP) err = r.addDNSSetupForAll(config.serverIP)

View File

@ -93,7 +93,7 @@ func (n *networkManagerDbusConfigurator) supportCustomPort() bool {
return false return false
} }
func (n *networkManagerDbusConfigurator) applyDNSConfig(config hostDNSConfig) error { func (n *networkManagerDbusConfigurator) applyDNSConfig(config HostDNSConfig) error {
connSettings, configVersion, err := n.getAppliedConnectionSettings() connSettings, configVersion, err := n.getAppliedConnectionSettings()
if err != nil { if err != nil {
return fmt.Errorf("got an error while retrieving the applied connection settings, error: %s", err) return fmt.Errorf("got an error while retrieving the applied connection settings, error: %s", err)

View File

@ -27,7 +27,7 @@ func (r *resolvconf) supportCustomPort() bool {
return false return false
} }
func (r *resolvconf) applyDNSConfig(config hostDNSConfig) error { func (r *resolvconf) applyDNSConfig(config HostDNSConfig) error {
var err error var err error
if !config.routeAll { if !config.routeAll {
err = r.restoreHostDNS() err = r.restoreHostDNS()

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"net/netip" "net/netip"
"runtime"
"sync" "sync"
"github.com/miekg/dns" "github.com/miekg/dns"
@ -18,9 +19,14 @@ type ReadyListener interface {
OnReady() OnReady()
} }
// IosDnsManager is a dns manager interface for iosß
type IosDnsManager interface {
applyDns(string)
}
// Server is a dns server interface // Server is a dns server interface
type Server interface { type Server interface {
Initialize() error Initialize(manager IosDnsManager) error
Stop() Stop()
DnsIP() string DnsIP() string
UpdateDNSServer(serial uint64, update nbdns.Config) error UpdateDNSServer(serial uint64, update nbdns.Config) error
@ -41,7 +47,7 @@ type DefaultServer struct {
hostManager hostManager hostManager hostManager
updateSerial uint64 updateSerial uint64
previousConfigHash uint64 previousConfigHash uint64
currentConfig hostDNSConfig currentConfig HostDNSConfig
// permanent related properties // permanent related properties
permanent bool permanent bool
@ -108,7 +114,7 @@ func newDefaultServer(ctx context.Context, wgInterface WGIface, dnsService servi
} }
// Initialize instantiate host manager and the dns service // Initialize instantiate host manager and the dns service
func (s *DefaultServer) Initialize() (err error) { func (s *DefaultServer) Initialize(manager IosDnsManager) (err error) {
s.mux.Lock() s.mux.Lock()
defer s.mux.Unlock() defer s.mux.Unlock()
@ -123,7 +129,11 @@ func (s *DefaultServer) Initialize() (err error) {
} }
} }
s.hostManager, err = newHostManager(s.wgInterface) if runtime.GOOS == "ios" {
s.hostManager, err = newHostManager(nil, manager)
} else {
s.hostManager, err = newHostManager(s.wgInterface, nil)
}
return return
} }

View File

@ -527,7 +527,7 @@ func TestDNSServerUpstreamDeactivateCallback(t *testing.T) {
registeredMap: make(registrationMap), registeredMap: make(registrationMap),
}, },
hostManager: hostManager, hostManager: hostManager,
currentConfig: hostDNSConfig{ currentConfig: HostDNSConfig{
domains: []domainConfig{ domains: []domainConfig{
{false, "domain0", false}, {false, "domain0", false},
{false, "domain1", false}, {false, "domain1", false},
@ -537,7 +537,7 @@ func TestDNSServerUpstreamDeactivateCallback(t *testing.T) {
} }
var domainsUpdate string var domainsUpdate string
hostManager.applyDNSConfigFunc = func(config hostDNSConfig) error { hostManager.applyDNSConfigFunc = func(config HostDNSConfig) error {
domains := []string{} domains := []string{}
for _, item := range config.domains { for _, item := range config.domains {
if item.disabled { if item.disabled {

View File

@ -81,7 +81,7 @@ func (s *systemdDbusConfigurator) supportCustomPort() bool {
return true return true
} }
func (s *systemdDbusConfigurator) applyDNSConfig(config hostDNSConfig) error { func (s *systemdDbusConfigurator) applyDNSConfig(config HostDNSConfig) error {
parsedIP, err := netip.ParseAddr(config.serverIP) parsedIP, err := netip.ParseAddr(config.serverIP)
if err != nil { if err != nil {
return fmt.Errorf("unable to parse ip address, error: %s", err) return fmt.Errorf("unable to parse ip address, error: %s", err)

View File

@ -271,7 +271,11 @@ func (e *Engine) Start() error {
e.acl = acl e.acl = acl
} }
err = e.dnsServer.Initialize() if runtime.GOOS == "ios" {
err = e.dnsServer.Initialize(e.mobileDep.DnsManager)
} else {
err = e.dnsServer.Initialize(nil)
}
if err != nil { if err != nil {
e.close() e.close()
return err return err

View File

@ -14,5 +14,6 @@ type MobileDependency struct {
RouteListener routemanager.RouteListener RouteListener routemanager.RouteListener
HostDNSAddresses []string HostDNSAddresses []string
DnsReadyListener dns.ReadyListener DnsReadyListener dns.ReadyListener
DnsManager dns.IosDnsManager
FileDescriptor int32 FileDescriptor int32
} }

View File

@ -10,10 +10,8 @@ import (
"github.com/netbirdio/netbird/client/internal/dns" "github.com/netbirdio/netbird/client/internal/dns"
"github.com/netbirdio/netbird/client/internal/peer" "github.com/netbirdio/netbird/client/internal/peer"
"github.com/netbirdio/netbird/client/internal/routemanager" "github.com/netbirdio/netbird/client/internal/routemanager"
"github.com/netbirdio/netbird/client/internal/stdnet"
"github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/client/system"
"github.com/netbirdio/netbird/formatter" "github.com/netbirdio/netbird/formatter"
"github.com/netbirdio/netbird/iface"
) )
// ConnectionListener export internal Listener for mobile // ConnectionListener export internal Listener for mobile
@ -21,24 +19,14 @@ type ConnectionListener interface {
peer.Listener peer.Listener
} }
// TunAdapter export internal TunAdapter for mobile
type TunAdapter interface {
iface.TunAdapter
}
// IFaceDiscover export internal IFaceDiscover for mobile
type IFaceDiscover interface {
stdnet.ExternalIFaceDiscover
}
// RouteListener export internal RouteListener for mobile // RouteListener export internal RouteListener for mobile
type RouteListener interface { type RouteListener interface {
routemanager.RouteListener routemanager.RouteListener
} }
// DnsReadyListener export internal dns ReadyListener for mobile // DnsManager export internal dns Manager for mobile
type DnsReadyListener interface { type DnsManager interface {
dns.ReadyListener dns.IosDnsManager
} }
// CustomLogger export internal CustomLogger for mobile // CustomLogger export internal CustomLogger for mobile
@ -55,29 +43,29 @@ func init() {
// Client struct manage the life circle of background service // Client struct manage the life circle of background service
type Client struct { type Client struct {
cfgFile string cfgFile string
iFaceDiscover IFaceDiscover
recorder *peer.Status recorder *peer.Status
ctxCancel context.CancelFunc ctxCancel context.CancelFunc
ctxCancelLock *sync.Mutex ctxCancelLock *sync.Mutex
deviceName string deviceName string
routeListener routemanager.RouteListener routeListener routemanager.RouteListener
onHostDnsFn func([]string) onHostDnsFn func([]string)
dnsManager dns.IosDnsManager
} }
// NewClient instantiate a new Client // NewClient instantiate a new Client
func NewClient(cfgFile, deviceName string, iFaceDiscover IFaceDiscover, routeListener RouteListener) *Client { func NewClient(cfgFile, deviceName string, routeListener RouteListener, dnsManager DnsManager) *Client {
return &Client{ return &Client{
cfgFile: cfgFile, cfgFile: cfgFile,
deviceName: deviceName, deviceName: deviceName,
iFaceDiscover: iFaceDiscover,
recorder: peer.NewRecorder(""), recorder: peer.NewRecorder(""),
ctxCancelLock: &sync.Mutex{}, ctxCancelLock: &sync.Mutex{},
routeListener: routeListener, routeListener: routeListener,
dnsManager: dnsManager,
} }
} }
// Run start the internal client. It is a blocker function // Run start the internal client. It is a blocker function
func (c *Client) Run(fd int32, dns *DNSList, dnsReadyListener DnsReadyListener) error { func (c *Client) Run(fd int32) error {
log.Infof("Starting NetBird client") log.Infof("Starting NetBird client")
cfg, err := internal.UpdateOrCreateConfig(internal.ConfigInput{ cfg, err := internal.UpdateOrCreateConfig(internal.ConfigInput{
ConfigPath: c.cfgFile, ConfigPath: c.cfgFile,
@ -106,7 +94,32 @@ func (c *Client) Run(fd int32, dns *DNSList, dnsReadyListener DnsReadyListener)
// todo do not throw error in case of cancelled context // todo do not throw error in case of cancelled context
ctx = internal.CtxInitState(ctx) ctx = internal.CtxInitState(ctx)
c.onHostDnsFn = func([]string) {} c.onHostDnsFn = func([]string) {}
return internal.RunClientiOS(ctx, cfg, c.recorder, fd, c.iFaceDiscover, c.routeListener, dns.items, dnsReadyListener) return internal.RunClientiOS(ctx, cfg, c.recorder, fd, c.routeListener, c.dnsManager)
}
func (c *Client) Auth(urlOpener URLOpener) error {
cfg, err := internal.UpdateOrCreateConfig(internal.ConfigInput{
ConfigPath: c.cfgFile,
})
if err != nil {
return err
}
c.recorder.UpdateManagementAddress(cfg.ManagementURL.String())
var ctx context.Context
//nolint
ctxWithValues := context.WithValue(context.Background(), system.DeviceNameCtxKey, c.deviceName)
c.ctxCancelLock.Lock()
ctx, c.ctxCancel = context.WithCancel(ctxWithValues)
defer c.ctxCancel()
c.ctxCancelLock.Unlock()
auth := NewAuthWithConfig(ctx, cfg)
err = auth.login(urlOpener)
if err != nil {
return err
}
} }
// Stop the internal client and free the resources // Stop the internal client and free the resources

View File

@ -189,7 +189,7 @@ func (a *Auth) login(urlOpener URLOpener) error {
} }
func (a *Auth) foregroundGetTokenInfo(urlOpener URLOpener) (*auth.TokenInfo, error) { func (a *Auth) foregroundGetTokenInfo(urlOpener URLOpener) (*auth.TokenInfo, error) {
oAuthFlow, err := auth.NewOAuthFlow(a.ctx, a.config) oAuthFlow, err := auth.NewOAuthFlow(a.ctx, a.config, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }