gogcli/internal/googleauth/identity_migration.go
2026-04-28 04:01:06 +01:00

85 lines
2.1 KiB
Go

package googleauth
import (
"fmt"
"strings"
"github.com/steipete/gogcli/internal/config"
"github.com/steipete/gogcli/internal/secrets"
)
func MigrateStoredSubjectIdentity(store secrets.Store, client string, identity Identity) (string, error) {
subject := strings.TrimSpace(identity.Subject)
newEmail := normalizeEmail(identity.Email)
if subject == "" || newEmail == "" {
return "", nil
}
tokens, err := store.ListTokens()
if err != nil {
return "", fmt.Errorf("list tokens for subject identity migration: %w", err)
}
for _, tok := range tokens {
if tok.Client != client || strings.TrimSpace(tok.Subject) != subject {
continue
}
oldEmail := normalizeEmail(tok.Email)
if oldEmail == "" || oldEmail == newEmail {
return "", nil
}
if err := store.DeleteToken(client, oldEmail); err != nil {
return "", fmt.Errorf("delete stale token for %s: %w", oldEmail, err)
}
if defaultEmail, getErr := store.GetDefaultAccount(client); getErr == nil && normalizeEmail(defaultEmail) == oldEmail {
if setErr := store.SetDefaultAccount(client, newEmail); setErr != nil {
return "", fmt.Errorf("set migrated default account: %w", setErr)
}
}
if err := migrateStoredSubjectConfig(oldEmail, newEmail); err != nil {
return "", err
}
return oldEmail, nil
}
return "", nil
}
func migrateStoredSubjectConfig(oldEmail string, newEmail string) error {
if err := config.UpdateConfig(func(cfg *config.File) error {
for alias, target := range cfg.AccountAliases {
if strings.EqualFold(target, oldEmail) {
cfg.AccountAliases[alias] = newEmail
}
}
if cfg.AccountClients != nil {
if client, ok := cfg.AccountClients[oldEmail]; ok {
cfg.AccountClients[newEmail] = client
delete(cfg.AccountClients, oldEmail)
}
if client, ok := cfg.AccountClients[strings.ToLower(oldEmail)]; ok {
cfg.AccountClients[newEmail] = client
delete(cfg.AccountClients, strings.ToLower(oldEmail))
}
}
return nil
}); err != nil {
return fmt.Errorf("update config for subject identity migration: %w", err)
}
return nil
}
func normalizeEmail(email string) string {
return strings.ToLower(strings.TrimSpace(email))
}