diff --git a/client/internal/connect.go b/client/internal/connect.go index aaf09a338..c5fdf4274 100644 --- a/client/internal/connect.go +++ b/client/internal/connect.go @@ -42,15 +42,11 @@ func RunClientMobile(ctx context.Context, config *Config, statusRecorder *peer.S 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, 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 { mobileDependency := MobileDependency{ - TunAdapter: nil, - FileDescriptor: fileDescriptor, - IFaceDiscover: iFaceDiscover, - RouteListener: routeListener, - HostDNSAddresses: dnsAddresses, - DnsReadyListener: dnsReadyListener, + FileDescriptor: fileDescriptor, + RouteListener: routeListener, + DnsManager: dnsManager, } return runClient(ctx, config, statusRecorder, mobileDependency) } diff --git a/client/internal/dns/file_linux.go b/client/internal/dns/file_linux.go index 0172e3413..fb59ba63b 100644 --- a/client/internal/dns/file_linux.go +++ b/client/internal/dns/file_linux.go @@ -39,7 +39,7 @@ func (f *fileConfigurator) supportCustomPort() bool { return false } -func (f *fileConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (f *fileConfigurator) applyDNSConfig(config HostDNSConfig) error { backupFileExist := false _, err := os.Stat(fileDefaultResolvConfBackupLocation) if err == nil { diff --git a/client/internal/dns/host.go b/client/internal/dns/host.go index 743ececdc..16c6c032d 100644 --- a/client/internal/dns/host.go +++ b/client/internal/dns/host.go @@ -8,12 +8,12 @@ import ( ) type hostManager interface { - applyDNSConfig(config hostDNSConfig) error + applyDNSConfig(config HostDNSConfig) error restoreHostDNS() error supportCustomPort() bool } -type hostDNSConfig struct { +type HostDNSConfig struct { domains []domainConfig routeAll bool serverIP string @@ -27,12 +27,12 @@ type domainConfig struct { } type mockHostConfigurator struct { - applyDNSConfigFunc func(config hostDNSConfig) error + applyDNSConfigFunc func(config HostDNSConfig) error restoreHostDNSFunc func() error supportCustomPortFunc func() bool } -func (m *mockHostConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (m *mockHostConfigurator) applyDNSConfig(config HostDNSConfig) error { if m.applyDNSConfigFunc != nil { return m.applyDNSConfigFunc(config) } @@ -55,14 +55,14 @@ func (m *mockHostConfigurator) supportCustomPort() bool { func newNoopHostMocker() hostManager { return &mockHostConfigurator{ - applyDNSConfigFunc: func(config hostDNSConfig) error { return nil }, + applyDNSConfigFunc: func(config HostDNSConfig) error { return nil }, restoreHostDNSFunc: func() error { return nil }, supportCustomPortFunc: func() bool { return true }, } } -func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) hostDNSConfig { - config := hostDNSConfig{ +func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) HostDNSConfig { + config := HostDNSConfig{ routeAll: false, serverIP: ip, serverPort: port, diff --git a/client/internal/dns/host_android.go b/client/internal/dns/host_android.go index 4ab7b32d8..169cc7c47 100644 --- a/client/internal/dns/host_android.go +++ b/client/internal/dns/host_android.go @@ -7,7 +7,7 @@ func newHostManager(wgInterface WGIface) (hostManager, error) { return &androidHostManager{}, nil } -func (a androidHostManager) applyDNSConfig(config hostDNSConfig) error { +func (a androidHostManager) applyDNSConfig(config HostDNSConfig) error { return nil } diff --git a/client/internal/dns/host_darwin.go b/client/internal/dns/host_darwin.go index f02c32c22..c0a213611 100644 --- a/client/internal/dns/host_darwin.go +++ b/client/internal/dns/host_darwin.go @@ -1,3 +1,5 @@ +//go:build !ios + package dns import ( @@ -42,7 +44,7 @@ func (s *systemConfigurator) supportCustomPort() bool { return true } -func (s *systemConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig) error { var err error if config.routeAll { diff --git a/client/internal/dns/host_ios.go b/client/internal/dns/host_ios.go new file mode 100644 index 000000000..3dd93fa07 --- /dev/null +++ b/client/internal/dns/host_ios.go @@ -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 +} diff --git a/client/internal/dns/host_windows.go b/client/internal/dns/host_windows.go index cea806bd2..ffb35ef6b 100644 --- a/client/internal/dns/host_windows.go +++ b/client/internal/dns/host_windows.go @@ -45,7 +45,7 @@ func (s *registryConfigurator) supportCustomPort() bool { return false } -func (r *registryConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (r *registryConfigurator) applyDNSConfig(config HostDNSConfig) error { var err error if config.routeAll { err = r.addDNSSetupForAll(config.serverIP) diff --git a/client/internal/dns/network_manager_linux.go b/client/internal/dns/network_manager_linux.go index 0b7ae7d4c..805bd5390 100644 --- a/client/internal/dns/network_manager_linux.go +++ b/client/internal/dns/network_manager_linux.go @@ -93,7 +93,7 @@ func (n *networkManagerDbusConfigurator) supportCustomPort() bool { return false } -func (n *networkManagerDbusConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (n *networkManagerDbusConfigurator) applyDNSConfig(config HostDNSConfig) error { connSettings, configVersion, err := n.getAppliedConnectionSettings() if err != nil { return fmt.Errorf("got an error while retrieving the applied connection settings, error: %s", err) diff --git a/client/internal/dns/resolvconf_linux.go b/client/internal/dns/resolvconf_linux.go index b358d3bd5..17e4c0196 100644 --- a/client/internal/dns/resolvconf_linux.go +++ b/client/internal/dns/resolvconf_linux.go @@ -27,7 +27,7 @@ func (r *resolvconf) supportCustomPort() bool { return false } -func (r *resolvconf) applyDNSConfig(config hostDNSConfig) error { +func (r *resolvconf) applyDNSConfig(config HostDNSConfig) error { var err error if !config.routeAll { err = r.restoreHostDNS() diff --git a/client/internal/dns/server.go b/client/internal/dns/server.go index 31946c13e..389d882ad 100644 --- a/client/internal/dns/server.go +++ b/client/internal/dns/server.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/netip" + "runtime" "sync" "github.com/miekg/dns" @@ -18,9 +19,14 @@ type ReadyListener interface { OnReady() } +// IosDnsManager is a dns manager interface for iosß +type IosDnsManager interface { + applyDns(string) +} + // Server is a dns server interface type Server interface { - Initialize() error + Initialize(manager IosDnsManager) error Stop() DnsIP() string UpdateDNSServer(serial uint64, update nbdns.Config) error @@ -41,7 +47,7 @@ type DefaultServer struct { hostManager hostManager updateSerial uint64 previousConfigHash uint64 - currentConfig hostDNSConfig + currentConfig HostDNSConfig // permanent related properties permanent bool @@ -108,7 +114,7 @@ func newDefaultServer(ctx context.Context, wgInterface WGIface, dnsService servi } // 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() 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 } diff --git a/client/internal/dns/server_test.go b/client/internal/dns/server_test.go index 119ac684c..c23b31249 100644 --- a/client/internal/dns/server_test.go +++ b/client/internal/dns/server_test.go @@ -527,7 +527,7 @@ func TestDNSServerUpstreamDeactivateCallback(t *testing.T) { registeredMap: make(registrationMap), }, hostManager: hostManager, - currentConfig: hostDNSConfig{ + currentConfig: HostDNSConfig{ domains: []domainConfig{ {false, "domain0", false}, {false, "domain1", false}, @@ -537,7 +537,7 @@ func TestDNSServerUpstreamDeactivateCallback(t *testing.T) { } var domainsUpdate string - hostManager.applyDNSConfigFunc = func(config hostDNSConfig) error { + hostManager.applyDNSConfigFunc = func(config HostDNSConfig) error { domains := []string{} for _, item := range config.domains { if item.disabled { diff --git a/client/internal/dns/systemd_linux.go b/client/internal/dns/systemd_linux.go index 0358b0251..354ade2e4 100644 --- a/client/internal/dns/systemd_linux.go +++ b/client/internal/dns/systemd_linux.go @@ -81,7 +81,7 @@ func (s *systemdDbusConfigurator) supportCustomPort() bool { return true } -func (s *systemdDbusConfigurator) applyDNSConfig(config hostDNSConfig) error { +func (s *systemdDbusConfigurator) applyDNSConfig(config HostDNSConfig) error { parsedIP, err := netip.ParseAddr(config.serverIP) if err != nil { return fmt.Errorf("unable to parse ip address, error: %s", err) diff --git a/client/internal/engine.go b/client/internal/engine.go index 0868eece1..585e9a5a5 100644 --- a/client/internal/engine.go +++ b/client/internal/engine.go @@ -271,7 +271,11 @@ func (e *Engine) Start() error { 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 { e.close() return err diff --git a/client/internal/mobile_dependency.go b/client/internal/mobile_dependency.go index 0b02a63ec..fc01a9de3 100644 --- a/client/internal/mobile_dependency.go +++ b/client/internal/mobile_dependency.go @@ -14,5 +14,6 @@ type MobileDependency struct { RouteListener routemanager.RouteListener HostDNSAddresses []string DnsReadyListener dns.ReadyListener + DnsManager dns.IosDnsManager FileDescriptor int32 } diff --git a/client/ios/netbird/client.go b/client/ios/netbird/client.go index 18779312c..f21c658f1 100644 --- a/client/ios/netbird/client.go +++ b/client/ios/netbird/client.go @@ -10,10 +10,8 @@ import ( "github.com/netbirdio/netbird/client/internal/dns" "github.com/netbirdio/netbird/client/internal/peer" "github.com/netbirdio/netbird/client/internal/routemanager" - "github.com/netbirdio/netbird/client/internal/stdnet" "github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/formatter" - "github.com/netbirdio/netbird/iface" ) // ConnectionListener export internal Listener for mobile @@ -21,24 +19,14 @@ type ConnectionListener interface { 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 type RouteListener interface { routemanager.RouteListener } -// DnsReadyListener export internal dns ReadyListener for mobile -type DnsReadyListener interface { - dns.ReadyListener +// DnsManager export internal dns Manager for mobile +type DnsManager interface { + dns.IosDnsManager } // CustomLogger export internal CustomLogger for mobile @@ -55,29 +43,29 @@ func init() { // Client struct manage the life circle of background service type Client struct { cfgFile string - iFaceDiscover IFaceDiscover recorder *peer.Status ctxCancel context.CancelFunc ctxCancelLock *sync.Mutex deviceName string routeListener routemanager.RouteListener onHostDnsFn func([]string) + dnsManager dns.IosDnsManager } // 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{ cfgFile: cfgFile, deviceName: deviceName, - iFaceDiscover: iFaceDiscover, recorder: peer.NewRecorder(""), ctxCancelLock: &sync.Mutex{}, routeListener: routeListener, + dnsManager: dnsManager, } } // 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") cfg, err := internal.UpdateOrCreateConfig(internal.ConfigInput{ 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 ctx = internal.CtxInitState(ctx) 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 diff --git a/client/ios/netbird/login.go b/client/ios/netbird/login.go index da893ba5e..3aaa24af2 100644 --- a/client/ios/netbird/login.go +++ b/client/ios/netbird/login.go @@ -189,7 +189,7 @@ func (a *Auth) login(urlOpener URLOpener) 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 { return nil, err }