public override Task <Backup> Convert(byte[] data, string password = null) { var json = Encoding.UTF8.GetString(data); var sourceAccounts = JsonConvert.DeserializeObject <List <Account> >(json); var authenticators = sourceAccounts.Select(account => account.Convert()).ToList(); var categories = new List <Category>(); var bindings = new List <AuthenticatorCategory>(); // Convoluted loop because Authenticator.CleanSecret might have changed the secret somehow for (var i = 0; i < sourceAccounts.Count; i++) { var sourceAccount = sourceAccounts[i]; var auth = authenticators[i]; foreach (var tag in sourceAccount.Tags) { var category = categories.FirstOrDefault(c => c.Name == tag); if (category == null) { category = new Category(tag); categories.Add(category); } var binding = new AuthenticatorCategory(auth.Secret, category.Id); bindings.Add(binding); } } return(Task.FromResult(new Backup(authenticators, categories, bindings))); }
public async Task DeleteAsync(AuthenticatorCategory item) { var conn = await _database.GetConnection(); await conn.ExecuteAsync( "DELETE FROM authenticatorcategory WHERE authenticatorSecret = ? AND categoryId = ?", item.AuthenticatorSecret, item.CategoryId); }
public async Task UpdateAsync(AuthenticatorCategory item) { var conn = await _database.GetConnection(); await conn.ExecuteAsync( "UPDATE authenticatorcategory SET authenticatorSecret = ?, categoryId = ?, ranking = ? WHERE authenticatorSecret = ? AND categoryId = ?", item.AuthenticatorSecret, item.CategoryId, item.Ranking, item.AuthenticatorSecret, item.CategoryId); }
public Task CreateAsync(AuthenticatorCategory item) { if (_authenticatorCategories.Any(a => a.AuthenticatorSecret == item.AuthenticatorSecret && a.CategoryId == item.CategoryId)) { throw new EntityDuplicateException(); } _authenticatorCategories.Add(item.Clone()); return(Task.CompletedTask); }
public async Task AddToCategory(string authSecret, string categoryId) { var binding = new AuthenticatorCategory(authSecret, categoryId); await _connection.InsertAsync(binding); CategoryBindings.Add(binding); if (CategoryId == categoryId) { UpdateView(); } }
public override async Task <Backup> Convert(byte[] data, string password = null) { var json = Encoding.UTF8.GetString(data); var backup = JsonConvert.DeserializeObject <AegisBackup>(json); if (backup.Version != 1) { throw new NotSupportedException("Unsupported backup version"); } var authenticators = backup.Database.Entries.Select(entry => entry.Convert(_iconResolver)).ToList(); var categories = new List <Category>(); var bindings = new List <AuthenticatorCategory>(); var icons = new List <CustomIcon>(); for (var i = 0; i < backup.Database.Entries.Count; i++) { var entry = backup.Database.Entries[i]; var auth = authenticators[i]; if (!String.IsNullOrEmpty(entry.Group)) { var category = categories.FirstOrDefault(c => c.Name == entry.Group); if (category == null) { category = new Category(entry.Group); categories.Add(category); } var binding = new AuthenticatorCategory(auth.Secret, category.Id); bindings.Add(binding); } if (entry.Icon != null) { var newIcon = await _customIconDecoder.Decode(entry.Icon); var icon = icons.FirstOrDefault(ic => ic.Id == newIcon.Id); if (icon == null) { icon = newIcon; icons.Add(newIcon); } auth.Icon = CustomIcon.Prefix + icon.Id; } } return(new Backup(authenticators, categories, bindings, icons)); }
public async Task CreateAsync(AuthenticatorCategory item) { var conn = await _database.GetConnection(); var id = new ValueTuple <string, string>(item.AuthenticatorSecret, item.CategoryId); if (await GetAsync(id) != null) { throw new EntityDuplicateException(); } await conn.InsertAsync(item); }
public bool IsDuplicateCategoryBinding(AuthenticatorCategory binding) { foreach (var iterator in CategoryBindings) { if (binding.AuthenticatorSecret == iterator.AuthenticatorSecret && binding.CategoryId == iterator.CategoryId) { return(true); } } return(false); }
public bool IsDuplicateCategoryBinding(AuthenticatorCategory binding) { return(CategoryBindings.Any( ac => binding.AuthenticatorSecret == ac.AuthenticatorSecret && binding.CategoryId == ac.CategoryId)); }
public override async Task <Backup> Convert(byte[] data, string password = null) { var path = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Personal), "authplus.db" ); await File.WriteAllBytesAsync(path, data); var connStr = new SQLiteConnectionString(path, true, password); var connection = new SQLiteAsyncConnection(connStr); Backup backup; try { var sourceAccounts = await connection.QueryAsync <Account>("SELECT * FROM accounts"); var sourceCategories = await connection.QueryAsync <Category>("SELECT * FROM category"); var authenticators = sourceAccounts.Select(account => account.Convert(_iconResolver)).ToList(); var categories = sourceCategories.Select(category => category.Convert()).ToList(); var bindings = new List <AuthenticatorCategory>(); for (var i = 0; i < sourceAccounts.Count; ++i) { var sourceAccount = sourceAccounts[i]; if (sourceAccount.CategoryName == "All Accounts") { continue; } var category = categories.FirstOrDefault(c => c.Name == sourceAccount.CategoryName); if (category == null) { continue; } var auth = authenticators[i]; var binding = new AuthenticatorCategory { AuthenticatorSecret = auth.Secret, CategoryId = category.Id }; bindings.Add(binding); } backup = new Backup(authenticators, categories, bindings); } catch (SQLiteException) { throw new ArgumentException("Database cannot be opened"); } finally { await connection.CloseAsync(); File.Delete(path); } return(backup); }