using AudibleApi.Authorization; namespace AudibleUtilities; /// /// Alignment and conversion helpers for identity tokens in AccountsSettings.json. /// Preference changes alone do not convert; conversion is explicit via . /// public static class AccountTokenStorage { /// /// Compare persisted encryption metadata for all account identities to . /// public static TokenStorageAlignment GetAccountsAlignment(TokenStorageMethod method, string? accountsSettingsFile = null) { var path = accountsSettingsFile ?? AudibleApiStorage.AccountsSettingsFile; if (!File.Exists(path)) return TokenStorageAlignment.NoApplicableTokens; using var persister = new AccountsSettingsPersister(path); var alignments = new List(); foreach (var account in persister.AccountsSettings.Accounts) { if (account.IdentityTokens is null) continue; alignments.Add(IdentityTokenConversion.GetAlignment(account.IdentityTokens, method)); } return CombineAlignments(alignments); } /// /// Convert every identity in the accounts settings file to . /// All-or-nothing: failure leaves the original file unchanged. /// public static IdentityTokenConversionResult ConvertAllAccounts(TokenStorageMethod method, string? accountsSettingsFile = null) { var path = accountsSettingsFile ?? AudibleApiStorage.AccountsSettingsFile; return IdentityTokenConversion.ConvertAllIdentitiesInFile(path, method); } private static TokenStorageAlignment CombineAlignments(IReadOnlyList alignments) { if (alignments.Count == 0) return TokenStorageAlignment.NoApplicableTokens; if (alignments.Any(a => a == TokenStorageAlignment.Indeterminate)) return TokenStorageAlignment.Indeterminate; if (alignments.All(a => a is TokenStorageAlignment.AllMatch or TokenStorageAlignment.NoApplicableTokens)) { return alignments.Any(a => a == TokenStorageAlignment.AllMatch) ? TokenStorageAlignment.AllMatch : TokenStorageAlignment.NoApplicableTokens; } return TokenStorageAlignment.SomeMismatch; } }