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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 8
0
        public bool IsDuplicateCategoryBinding(AuthenticatorCategory binding)
        {
            foreach (var iterator in CategoryBindings)
            {
                if (binding.AuthenticatorSecret == iterator.AuthenticatorSecret &&
                    binding.CategoryId == iterator.CategoryId)
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 9
0
 public bool IsDuplicateCategoryBinding(AuthenticatorCategory binding)
 {
     return(CategoryBindings.Any(
                ac => binding.AuthenticatorSecret == ac.AuthenticatorSecret &&
                binding.CategoryId == ac.CategoryId));
 }
Esempio n. 10
0
        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);
        }