diff --git a/client/cmd/login.go b/client/cmd/login.go index 5af8c1775..71153906c 100644 --- a/client/cmd/login.go +++ b/client/cmd/login.go @@ -60,7 +60,7 @@ var loginCmd = &cobra.Command{ return fmt.Errorf("get config file: %v", err) } - config, _ = internal.UpdateOldManagementPort(ctx, config, configPath) + config, _ = internal.UpdateOldManagementURL(ctx, config, configPath) err = foregroundLogin(ctx, cmd, config, setupKey) if err != nil { diff --git a/client/cmd/up.go b/client/cmd/up.go index ebfcb2b9d..e895b2f22 100644 --- a/client/cmd/up.go +++ b/client/cmd/up.go @@ -95,7 +95,7 @@ func runInForegroundMode(ctx context.Context, cmd *cobra.Command) error { return fmt.Errorf("get config file: %v", err) } - config, _ = internal.UpdateOldManagementPort(ctx, config, configPath) + config, _ = internal.UpdateOldManagementURL(ctx, config, configPath) err = foregroundLogin(ctx, cmd, config, setupKey) if err != nil { diff --git a/client/internal/config.go b/client/internal/config.go index 8f433a041..fdc6385f4 100644 --- a/client/internal/config.go +++ b/client/internal/config.go @@ -1,6 +1,7 @@ package internal import ( + "context" "fmt" "net/url" "os" @@ -12,16 +13,19 @@ import ( "github.com/netbirdio/netbird/client/ssh" "github.com/netbirdio/netbird/iface" + mgm "github.com/netbirdio/netbird/management/client" "github.com/netbirdio/netbird/util" ) const ( - // ManagementLegacyPort is the port that was used before by the Management gRPC server. + // managementLegacyPortString is the port that was used before by the Management gRPC server. // It is used for backward compatibility now. // NB: hardcoded from github.com/netbirdio/netbird/management/cmd to avoid import - ManagementLegacyPort = 33073 + managementLegacyPortString = "33073" // DefaultManagementURL points to the NetBird's cloud management endpoint - DefaultManagementURL = "https://api.wiretrustee.com:443" + DefaultManagementURL = "https://api.netbird.io:443" + // oldDefaultManagementURL points to the NetBird's old cloud management endpoint + oldDefaultManagementURL = "https://api.wiretrustee.com:443" // DefaultAdminURL points to NetBird's cloud management console DefaultAdminURL = "https://app.netbird.io:443" ) @@ -302,3 +306,86 @@ func configFileIsExists(path string) bool { _, err := os.Stat(path) return !os.IsNotExist(err) } + +// UpdateOldManagementURL checks whether client can switch to the new Management URL with port 443 and the management domain. +// If it can switch, then it updates the config and returns a new one. Otherwise, it returns the provided config. +// The check is performed only for the NetBird's managed version. +func UpdateOldManagementURL(ctx context.Context, config *Config, configPath string) (*Config, error) { + + defaultManagementURL, err := parseURL("Management URL", DefaultManagementURL) + if err != nil { + return nil, err + } + + parsedOldDefaultManagementURL, err := parseURL("Management URL", oldDefaultManagementURL) + if err != nil { + return nil, err + } + + if config.ManagementURL.Hostname() != defaultManagementURL.Hostname() && + config.ManagementURL.Hostname() != parsedOldDefaultManagementURL.Hostname() { + // only do the check for the NetBird's managed version + return config, nil + } + + var mgmTlsEnabled bool + if config.ManagementURL.Scheme == "https" { + mgmTlsEnabled = true + } + + if !mgmTlsEnabled { + // only do the check for HTTPs scheme (the hosted version of the Management service is always HTTPs) + return config, nil + } + + if config.ManagementURL.Port() != managementLegacyPortString && + config.ManagementURL.Hostname() == defaultManagementURL.Hostname() { + return config, nil + } + + newURL, err := parseURL("Management URL", fmt.Sprintf("%s://%s:%d", + config.ManagementURL.Scheme, defaultManagementURL.Hostname(), 443)) + if err != nil { + return nil, err + } + // here we check whether we could switch from the legacy 33073 port to the new 443 + log.Infof("attempting to switch from the legacy Management URL %s to the new one %s", + config.ManagementURL.String(), newURL.String()) + key, err := wgtypes.ParseKey(config.PrivateKey) + if err != nil { + log.Infof("couldn't switch to the new Management %s", newURL.String()) + return config, err + } + + client, err := mgm.NewClient(ctx, newURL.Host, key, mgmTlsEnabled) + if err != nil { + log.Infof("couldn't switch to the new Management %s", newURL.String()) + return config, err + } + defer func() { + err = client.Close() + if err != nil { + log.Warnf("failed to close the Management service client %v", err) + } + }() + + // gRPC check + _, err = client.GetServerPublicKey() + if err != nil { + log.Infof("couldn't switch to the new Management %s", newURL.String()) + return nil, err + } + + // everything is alright => update the config + newConfig, err := UpdateConfig(ConfigInput{ + ManagementURL: newURL.String(), + ConfigPath: configPath, + }) + if err != nil { + log.Infof("couldn't switch to the new Management %s", newURL.String()) + return config, fmt.Errorf("failed updating config file: %v", err) + } + log.Infof("successfully switched to the new Management URL: %s", newURL.String()) + + return newConfig, nil +} diff --git a/client/internal/config_test.go b/client/internal/config_test.go index eeec9b516..7453c8fdf 100644 --- a/client/internal/config_test.go +++ b/client/internal/config_test.go @@ -1,12 +1,14 @@ package internal import ( + "context" "errors" "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/netbirdio/netbird/util" ) @@ -120,3 +122,60 @@ func TestHiddenPreSharedKey(t *testing.T) { }) } } + +func TestUpdateOldManagementURL(t *testing.T) { + tests := []struct { + name string + previousManagementURL string + expectedManagementURL string + fileShouldNotChange bool + }{ + { + name: "Update old management URL with legacy port", + previousManagementURL: "https://api.wiretrustee.com:33073", + expectedManagementURL: DefaultManagementURL, + }, + { + name: "Update old management URL", + previousManagementURL: oldDefaultManagementURL, + expectedManagementURL: DefaultManagementURL, + }, + { + name: "No update needed when management URL is up to date", + previousManagementURL: DefaultManagementURL, + expectedManagementURL: DefaultManagementURL, + fileShouldNotChange: true, + }, + { + name: "No update needed when not using cloud management", + previousManagementURL: "https://netbird.example.com:33073", + expectedManagementURL: "https://netbird.example.com:33073", + fileShouldNotChange: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir := t.TempDir() + configPath := filepath.Join(tempDir, "config.json") + config, err := UpdateOrCreateConfig(ConfigInput{ + ManagementURL: tt.previousManagementURL, + ConfigPath: configPath, + }) + require.NoError(t, err, "failed to create testing config") + previousStats, err := os.Stat(configPath) + require.NoError(t, err, "failed to create testing config stats") + resultConfig, err := UpdateOldManagementURL(context.TODO(), config, configPath) + require.NoError(t, err, "got error when updating old management url") + require.Equal(t, tt.expectedManagementURL, resultConfig.ManagementURL.String()) + newStats, err := os.Stat(configPath) + require.NoError(t, err, "failed to create testing config stats") + switch tt.fileShouldNotChange { + case true: + require.Equal(t, previousStats.ModTime(), newStats.ModTime(), "file should not change") + case false: + require.NotEqual(t, previousStats.ModTime(), newStats.ModTime(), "file should have changed") + } + }) + } +} diff --git a/client/internal/connect.go b/client/internal/connect.go index d8784c0c8..6c654ec49 100644 --- a/client/internal/connect.go +++ b/client/internal/connect.go @@ -283,83 +283,6 @@ func loginToManagement(ctx context.Context, client mgm.Client, pubSSHKey []byte) return loginResp, nil } -// UpdateOldManagementPort checks whether client can switch to the new Management port 443. -// If it can switch, then it updates the config and returns a new one. Otherwise, it returns the provided config. -// The check is performed only for the NetBird's managed version. -func UpdateOldManagementPort(ctx context.Context, config *Config, configPath string) (*Config, error) { - - defaultManagementURL, err := parseURL("Management URL", DefaultManagementURL) - if err != nil { - return nil, err - } - - if config.ManagementURL.Hostname() != defaultManagementURL.Hostname() { - // only do the check for the NetBird's managed version - return config, nil - } - - var mgmTlsEnabled bool - if config.ManagementURL.Scheme == "https" { - mgmTlsEnabled = true - } - - if !mgmTlsEnabled { - // only do the check for HTTPs scheme (the hosted version of the Management service is always HTTPs) - return config, nil - } - - if mgmTlsEnabled && config.ManagementURL.Port() == fmt.Sprintf("%d", ManagementLegacyPort) { - - newURL, err := parseURL("Management URL", fmt.Sprintf("%s://%s:%d", - config.ManagementURL.Scheme, config.ManagementURL.Hostname(), 443)) - if err != nil { - return nil, err - } - // here we check whether we could switch from the legacy 33073 port to the new 443 - log.Infof("attempting to switch from the legacy Management URL %s to the new one %s", - config.ManagementURL.String(), newURL.String()) - key, err := wgtypes.ParseKey(config.PrivateKey) - if err != nil { - log.Infof("couldn't switch to the new Management %s", newURL.String()) - return config, err - } - - client, err := mgm.NewClient(ctx, newURL.Host, key, mgmTlsEnabled) - if err != nil { - log.Infof("couldn't switch to the new Management %s", newURL.String()) - return config, err - } - defer func() { - err = client.Close() - if err != nil { - log.Warnf("failed to close the Management service client %v", err) - } - }() - - // gRPC check - _, err = client.GetServerPublicKey() - if err != nil { - log.Infof("couldn't switch to the new Management %s", newURL.String()) - return nil, err - } - - // everything is alright => update the config - newConfig, err := UpdateConfig(ConfigInput{ - ManagementURL: newURL.String(), - ConfigPath: configPath, - }) - if err != nil { - log.Infof("couldn't switch to the new Management %s", newURL.String()) - return config, fmt.Errorf("failed updating config file: %v", err) - } - log.Infof("successfully switched to the new Management URL: %s", newURL.String()) - - return newConfig, nil - } - - return config, nil -} - func statusRecorderToMgmConnStateNotifier(statusRecorder *peer.Status) mgm.ConnStateNotifier { var sri interface{} = statusRecorder mgmNotifier, _ := sri.(mgm.ConnStateNotifier) diff --git a/client/server/server.go b/client/server/server.go index b9c7b0a5e..59a2effa3 100644 --- a/client/server/server.go +++ b/client/server/server.go @@ -94,7 +94,7 @@ func (s *Server) Start() error { } // if configuration exists, we just start connections. - config, _ = internal.UpdateOldManagementPort(ctx, config, s.latestConfigInput.ConfigPath) + config, _ = internal.UpdateOldManagementURL(ctx, config, s.latestConfigInput.ConfigPath) s.config = config @@ -197,7 +197,7 @@ func (s *Server) Login(callerCtx context.Context, msg *proto.LoginRequest) (*pro } if msg.ManagementUrl == "" { - config, _ = internal.UpdateOldManagementPort(ctx, config, s.latestConfigInput.ConfigPath) + config, _ = internal.UpdateOldManagementURL(ctx, config, s.latestConfigInput.ConfigPath) s.config = config s.latestConfigInput.ManagementURL = config.ManagementURL.String() } diff --git a/client/ui/client_ui.go b/client/ui/client_ui.go index 1dc0bb374..77728d720 100644 --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -563,8 +563,8 @@ func (s *serviceClient) getSrvClient(timeout time.Duration) (proto.DaemonService // getSrvConfig from the service to show it in the settings window. func (s *serviceClient) getSrvConfig() { - s.managementURL = "https://api.wiretrustee.com:33073" - s.adminURL = "https://app.netbird.io" + s.managementURL = internal.DefaultManagementURL + s.adminURL = internal.DefaultAdminURL conn, err := s.getSrvClient(failFastTimeout) if err != nil {