mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-04 19:55:09 -04:00
## Describe your changes Pull fresh TUN settings on Android rebuild instead of push The Android TUN rebuild consumed state pushed through notifications and a Java-side snapshot, and both sources were unreliable. The DNS search-domain notifier fired OnNetworkChanged with an empty string, which the rebuild handler treated as the new route list, so any search domain change rebuilt the TUN with zero routes and cut all tunnel traffic. The rebuild also reused the search domains cached at the last establish, so search domain updates never reached the TUN at runtime. Make the notification a pure trigger and let the Java side pull a fresh snapshot instead. Expose GetTunSettings on the Android SDK client: it returns the current TUN route ranges, derived on demand by the route manager from the client routes, the exit-node selection and the fake IP blocks, together with the DNS search domains. The route notifier keeps only its last-announced baseline to suppress triggers for unchanged syncs; the TUN route state is owned by the route manager. SearchDomains now locks the DNS server mutex since the pull arrives from a Java thread. Requires the matching android-client change that switches recreateTUN to the pull API. ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [x] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) - [ ] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added access to current TUN route ranges and DNS search domains. - TUN settings are returned in a mobile-friendly format for easier integration. - **Improvements** - Route changes are detected and synchronized more reliably. - Current routing information now reflects active routes, including supported fake-IP ranges. - Simplified network initialization for more consistent startup behavior. - **API Changes** - Removed the obsolete network-map retrieval method from the management client interface. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
139 lines
4.3 KiB
Go
139 lines
4.3 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/netbirdio/netbird/client/system"
|
|
"github.com/netbirdio/netbird/shared/management/domain"
|
|
"github.com/netbirdio/netbird/shared/management/proto"
|
|
)
|
|
|
|
// MockClient is a mock implementation of the Client interface for testing.
|
|
type MockClient struct {
|
|
CloseFunc func() error
|
|
SyncFunc func(ctx context.Context, sysInfo *system.Info, msgHandler func(msg *proto.SyncResponse) error) error
|
|
RegisterFunc func(setupKey string, jwtToken string, info *system.Info, sshKey []byte, dnsLabels domain.List) (*proto.LoginResponse, error)
|
|
LoginFunc func(info *system.Info, sshKey []byte, dnsLabels domain.List) (*proto.LoginResponse, error)
|
|
ExtendAuthSessionFunc func(info *system.Info, jwtToken string) (*proto.ExtendAuthSessionResponse, error)
|
|
GetDeviceAuthorizationFlowFunc func() (*proto.DeviceAuthorizationFlow, error)
|
|
GetPKCEAuthorizationFlowFunc func() (*proto.PKCEAuthorizationFlow, error)
|
|
GetServerURLFunc func() string
|
|
HealthCheckFunc func() error
|
|
SyncMetaFunc func(sysInfo *system.Info) error
|
|
LogoutFunc func() error
|
|
JobFunc func(ctx context.Context, msgHandler func(msg *proto.JobRequest) *proto.JobResponse) error
|
|
CreateExposeFunc func(ctx context.Context, req ExposeRequest) (*ExposeResponse, error)
|
|
RenewExposeFunc func(ctx context.Context, domain string) error
|
|
StopExposeFunc func(ctx context.Context, domain string) error
|
|
}
|
|
|
|
func (m *MockClient) IsHealthy() bool {
|
|
return true
|
|
}
|
|
|
|
func (m *MockClient) Close() error {
|
|
if m.CloseFunc == nil {
|
|
return nil
|
|
}
|
|
return m.CloseFunc()
|
|
}
|
|
|
|
func (m *MockClient) Sync(ctx context.Context, sysInfo *system.Info, msgHandler func(msg *proto.SyncResponse) error) error {
|
|
if m.SyncFunc == nil {
|
|
return nil
|
|
}
|
|
return m.SyncFunc(ctx, sysInfo, msgHandler)
|
|
}
|
|
|
|
func (m *MockClient) Job(ctx context.Context, msgHandler func(msg *proto.JobRequest) *proto.JobResponse) error {
|
|
if m.JobFunc == nil {
|
|
return nil
|
|
}
|
|
return m.JobFunc(ctx, msgHandler)
|
|
}
|
|
|
|
func (m *MockClient) Register(setupKey string, jwtToken string, info *system.Info, sshKey []byte, dnsLabels domain.List) (*proto.LoginResponse, error) {
|
|
if m.RegisterFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.RegisterFunc(setupKey, jwtToken, info, sshKey, dnsLabels)
|
|
}
|
|
|
|
func (m *MockClient) Login(info *system.Info, sshKey []byte, dnsLabels domain.List) (*proto.LoginResponse, error) {
|
|
if m.LoginFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.LoginFunc(info, sshKey, dnsLabels)
|
|
}
|
|
|
|
func (m *MockClient) ExtendAuthSession(info *system.Info, jwtToken string) (*proto.ExtendAuthSessionResponse, error) {
|
|
if m.ExtendAuthSessionFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.ExtendAuthSessionFunc(info, jwtToken)
|
|
}
|
|
|
|
func (m *MockClient) GetDeviceAuthorizationFlow() (*proto.DeviceAuthorizationFlow, error) {
|
|
if m.GetDeviceAuthorizationFlowFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.GetDeviceAuthorizationFlowFunc()
|
|
}
|
|
|
|
func (m *MockClient) GetPKCEAuthorizationFlow() (*proto.PKCEAuthorizationFlow, error) {
|
|
if m.GetPKCEAuthorizationFlowFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.GetPKCEAuthorizationFlowFunc()
|
|
}
|
|
|
|
func (m *MockClient) HealthCheck() error {
|
|
if m.HealthCheckFunc == nil {
|
|
return nil
|
|
}
|
|
return m.HealthCheckFunc()
|
|
}
|
|
|
|
// GetServerURL mock implementation of GetServerURL from mgm.Client interface
|
|
func (m *MockClient) GetServerURL() string {
|
|
if m.GetServerURLFunc == nil {
|
|
return ""
|
|
}
|
|
return m.GetServerURLFunc()
|
|
}
|
|
|
|
func (m *MockClient) SyncMeta(sysInfo *system.Info) error {
|
|
if m.SyncMetaFunc == nil {
|
|
return nil
|
|
}
|
|
return m.SyncMetaFunc(sysInfo)
|
|
}
|
|
|
|
func (m *MockClient) Logout() error {
|
|
if m.LogoutFunc == nil {
|
|
return nil
|
|
}
|
|
return m.LogoutFunc()
|
|
}
|
|
|
|
func (m *MockClient) CreateExpose(ctx context.Context, req ExposeRequest) (*ExposeResponse, error) {
|
|
if m.CreateExposeFunc == nil {
|
|
return nil, nil
|
|
}
|
|
return m.CreateExposeFunc(ctx, req)
|
|
}
|
|
|
|
func (m *MockClient) RenewExpose(ctx context.Context, domain string) error {
|
|
if m.RenewExposeFunc == nil {
|
|
return nil
|
|
}
|
|
return m.RenewExposeFunc(ctx, domain)
|
|
}
|
|
|
|
func (m *MockClient) StopExpose(ctx context.Context, domain string) error {
|
|
if m.StopExposeFunc == nil {
|
|
return nil
|
|
}
|
|
return m.StopExposeFunc(ctx, domain)
|
|
}
|