[management] Give the /api/setup owner account the single account mode domain (#8147)

This commit is contained in:
Mohammadreza Razavian
2026-10-21 20:46:33 +03:00
committed by GitHub
parent 4ca20f0c7a
commit 73829c8d96
4 changed files with 145 additions and 27 deletions
+25 -4
View File
@@ -10,6 +10,7 @@ import (
"github.com/netbirdio/netbird/management/server/account"
"github.com/netbirdio/netbird/management/server/idp"
"github.com/netbirdio/netbird/management/server/store"
"github.com/netbirdio/netbird/management/server/types"
"github.com/netbirdio/netbird/shared/auth"
"github.com/netbirdio/netbird/shared/management/status"
)
@@ -111,7 +112,9 @@ func (m *SetupService) SetupOwner(ctx context.Context, email, password, name str
Name: userData.Name,
}
accountID, err := m.accountManager.GetAccountIDByUserID(ctx, userAuth)
// Resolve through the same path as a first login so single account mode
// stamps the configured domain, private category and primary flag.
accountID, _, err := m.accountManager.GetAccountIDFromUserAuth(ctx, userAuth)
if err != nil {
err = fmt.Errorf("create account for setup user: %w", err)
if rollbackErr := m.rollbackSetup(ctx, userData.ID, "account provisioning failed", err, ""); rollbackErr != nil {
@@ -145,7 +148,7 @@ func (m *SetupService) rollbackSetup(ctx context.Context, userID, reason string,
}
if accountID != "" {
if err := m.rollbackSetupAccount(ctx, accountID); err != nil {
if err := m.rollbackSetupAccount(ctx, accountID, userID); err != nil {
rollbackErr := fmt.Errorf("roll back setup account %s: %w", accountID, err)
log.WithContext(ctx).Errorf("failed to roll back setup account %s for user %s after %s: original error: %v, rollback error: %v", accountID, userID, reason, origErr, rollbackErr)
return rollbackErr
@@ -186,8 +189,9 @@ func (m *SetupService) lookupSetupAccountIDForRollback(ctx context.Context, user
// rollbackSetupAccount removes only the setup-created account data from the
// store. It intentionally avoids accountManager.DeleteAccount because the normal
// account deletion path also deletes users from the IdP; embedded IdP cleanup is
// owned by instanceManager.RollbackSetup.
func (m *SetupService) rollbackSetupAccount(ctx context.Context, accountID string) error {
// owned by instanceManager.RollbackSetup. It keeps an account another user
// created or joined, which a concurrent first login can produce.
func (m *SetupService) rollbackSetupAccount(ctx context.Context, accountID, userID string) error {
if m.accountManager == nil {
return fmt.Errorf("account manager is required to roll back setup account")
}
@@ -205,6 +209,11 @@ func (m *SetupService) rollbackSetupAccount(ctx context.Context, accountID strin
return fmt.Errorf("get setup account for rollback: %w", err)
}
if !isSetupOnlyAccount(account, userID) {
log.WithContext(ctx).Warnf("keeping account %s on setup rollback: shared with another user", accountID)
return nil
}
if err := accountStore.DeleteAccount(ctx, account); err != nil {
if isNotFoundError(err) {
return nil
@@ -214,3 +223,15 @@ func (m *SetupService) rollbackSetupAccount(ctx context.Context, accountID strin
return nil
}
func isSetupOnlyAccount(account *types.Account, userID string) bool {
if account.CreatedBy != userID {
return false
}
for id := range account.Users {
if id != userID {
return false
}
}
return true
}