This commit is contained in:
TheXamlGuy
2024-05-04 15:13:46 +01:00
parent 800aede07b
commit 7cbca0783f
36 changed files with 378 additions and 159 deletions
+18 -9
View File
@@ -1,12 +1,21 @@
using Toolkit.Foundation;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Bitvault;
public class AllNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IVaultNavigationViewModel;
public partial class AllNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IVaultNavigationViewModel
{
[ObservableProperty]
private bool selected;
[RelayCommand]
public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("All")));
}
+12 -3
View File
@@ -1,12 +1,21 @@
using Toolkit.Foundation;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Bitvault;
public class ArchiveNavigationViewModel(IServiceProvider provider,
public partial class ArchiveNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IVaultNavigationViewModel;
IVaultNavigationViewModel
{
[ObservableProperty]
private bool selected;
[RelayCommand]
public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Archive")));
}
+11
View File
@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace Bitvault;
public record Category
{
[Key]
public int Id { get; set; }
public string? Name { get; set; }
}
-89
View File
@@ -1,89 +0,0 @@
//using Microsoft.EntityFrameworkCore;
//using Microsoft.Extensions.Hosting;
//using Toolkit.Foundation;
//namespace Bitvault;
//public class CreateVaultStorageHandler(IHostEnvironment environment,
// IKeyGenerator generator,
// IKeyDeriver deriver,
// IEncryptor encryptor,
// IDecryptor decryptor,
// IDbContextFactory<VaultDbContext> dbContextFactory,
// IWritableConfiguration<VaultConfiguration> writer) : IHandler<Create<VaultStorage>, bool>
//{
// public async Task<bool> Handle(Create<VaultStorage> args, CancellationToken cancellationToken)
// {
// if (args.Value is VaultStorage vault)
// {
// if (vault.Name is { Length: > 0 } name && vault.Password is { Length: > 0 } password)
// {
// byte[] salt = generator.Generate(16);
// byte[] key = generator.Generate(32);
// byte[] derivedKey = deriver.DeriveKey(password, salt);
// byte[] encryptedKey = encryptor.Encrypt(key, derivedKey);
// byte[] decryptedKey = decryptor.Decrypt(encryptedKey, derivedKey);
// Array.Clear(encryptedKey, 0, encryptedKey.Length);
// using VaultDbContext context = dbContextFactory.CreateDbContext();
// context.Database.SetConnectionString($"Data Source={Path.Combine(environment.ContentRootPath, name)}.vault;Mode=ReadWriteCreate;Password={Convert.ToBase64String(decryptedKey)}");
// try
// {
// await context.Database.EnsureCreatedAsync(cancellationToken);
// writer.Write(args =>
// {
// var f = args.Name;
// });
// }
// catch
// {
// }
// Array.Clear(decryptedKey, 0, decryptedKey.Length);
// // Derive the key for encryption
// //byte[] encryptionKey = deriver.DeriveKey(password, salt);
// //// Derive the key for decryption
// //byte[] decryptionKey = deriver.DeriveKey(password, salt);
// //// Compare keys to ensure they're the same
// //bool areKeysEqual = encryptionKey.SequenceEqual(decryptionKey);
// ////byte[] derivedKey = deriver.DeriveKey(password, salt);
// //string? encrypted = encryptor.Encrypt(password, derivedKey);
// //var storedSalt = Convert.ToBase64String(salt);
// //byte[] derivedKey2 = deriver.DeriveKey(password, salt);
// //var d = decryptor.Decrypt(encrypted, derivedKey2);
// // Generate a hash
// //string hash = hasher.HashPassword(password);
// //string[] parts = hash.Split(':');
// //// Store the salt only
// //string storedSalt = parts[0];
// //// Use the hash as the password
// //string storedHash = parts[1];
// //context.Database.SetConnectionString($"Data Source={Path.Combine(environment.ContentRootPath, name)}.vault;Mode=ReadWriteCreate;Password={storedHash}");
// //await context.Database.EnsureCreatedAsync();
// return true;
// }
// }
// return false;
// }
//}
+13
View File
@@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace Bitvault;
public record Document
{
public byte[]? Blob { get; set; }
public DocumentType Type { get; set; }
[Key]
public int Id { get; set; }
}
+7
View File
@@ -0,0 +1,7 @@
namespace Bitvault;
public enum DocumentType
{
Form,
File
}
+6
View File
@@ -0,0 +1,6 @@
namespace Bitvault;
public record Form
{
public ICollection<FormEntry>? Entries { get; set;}
}
+3
View File
@@ -0,0 +1,3 @@
namespace Bitvault;
public record FormEntry;
+12
View File
@@ -0,0 +1,12 @@
namespace Bitvault;
public record FormField : FormEntry
{
public string? Name { get; set; }
public string? Description { get; set; }
public object? Value { get; set; }
public FormFieldType Type { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
namespace Bitvault;
public enum FormFieldType
{
Attachments,
Date,
Masked,
Note,
Number,
Options,
Password,
Phone,
Text,
Time,
Url
}
+8
View File
@@ -0,0 +1,8 @@
namespace Bitvault;
public record FormGroup : FormEntry
{
public string? Name { get; set; }
public ICollection<FormField>? Fields { get; set; }
}
+11 -1
View File
@@ -8,4 +8,14 @@ public record Locker
public int Id { get; set; }
public string? Name { get; set; }
}
public string? Description { get; set; }
public int State { get; set; }
public ICollection<Tag>? Tags { get; }
public Category? Category { get; }
public ICollection<Document>? Documents { get; }
}
+6 -2
View File
@@ -7,5 +7,9 @@ public class LockerNavigationViewModel(IServiceProvider provider,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
IDisposer disposer,
IContentTemplate template) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer)
{
public IContentTemplate Template { get; set; } = template;
}
@@ -3,7 +3,7 @@ using Toolkit.Foundation;
namespace Bitvault;
public class VaultNavigationViewModelHandler(IPublisher publisher,
public class MainViewModelHandler(IPublisher publisher,
IVaultHostCollection vaults) :
INotificationHandler<Enumerate<IMainNavigationViewModel>>
{
+39 -4
View File
@@ -2,11 +2,33 @@
namespace Bitvault;
public partial class ManageNavigationViewModel :
ObservableViewModel,
IMainNavigationViewModel
public partial class ManageNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel;
public partial class VaultCommandViewModel : ObservableCollectionViewModel
{
public ManageNavigationViewModel(IServiceProvider provider,
public VaultCommandViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Add<SearchVaultCommandViewModel>();
Add<CreateLockerCommandViewModel>();
}
}
public partial class SearchVaultCommandViewModel :
ObservableCollectionViewModel
{
public SearchVaultCommandViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
@@ -14,4 +36,17 @@ public partial class ManageNavigationViewModel :
IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
}
}
public partial class CreateLockerCommandViewModel :
ObservableCollectionViewModel
{
public CreateLockerCommandViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
}
}
+12 -3
View File
@@ -1,12 +1,21 @@
using Toolkit.Foundation;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Bitvault;
public class StarredNavigationViewModel(IServiceProvider provider,
public partial class StarredNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IVaultNavigationViewModel;
IVaultNavigationViewModel
{
[ObservableProperty]
private bool selected;
[RelayCommand]
public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Starred")));
}
+11
View File
@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace Bitvault;
public class Tag
{
[Key]
public int Id { get; set; }
public string? Name { get; set; }
}
+3
View File
@@ -0,0 +1,3 @@
namespace Bitvault;
public record VaultCategory(string Name);
+16 -3
View File
@@ -2,12 +2,25 @@
namespace Bitvault;
public class VaultDbContext: DbContext
public class VaultDbContext(DbContextOptions<VaultDbContext> options) :
DbContext(options)
{
public DbSet<Category> Categories { get; set; }
public DbSet<Document> Documents { get; set; }
public DbSet<Locker> Lockers { get; set; }
public VaultDbContext(DbContextOptions<VaultDbContext> options): base(options)
{
public DbSet<Tag> Tags { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Locker>()
.HasMany(x => x.Tags)
.WithOne();
modelBuilder.Entity<Locker>()
.HasMany(x => x.Documents)
.WithOne();
}
}
+9 -5
View File
@@ -2,10 +2,14 @@
namespace Bitvault;
public class VaultViewModel(IServiceProvider provider,
[Notification(nameof(VaultViewModel))]
public partial class VaultViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
IDisposer disposer,
IContentTemplate template) : ObservableCollectionViewModel<LockerNavigationViewModel>(provider, factory, mediator, publisher, subscriber, disposer)
{
public IContentTemplate Template { get; set; } = template;
}
+21
View File
@@ -0,0 +1,21 @@
using Toolkit.Foundation;
namespace Bitvault;
public class VaultViewModelHandler(IServiceFactory factory,
IPublisher publisher) :
INotificationHandler<Enumerate<LockerNavigationViewModel>>
{
public async Task Handle(Enumerate<LockerNavigationViewModel> args,
CancellationToken cancellationToken = default)
{
for (int i = 0; i < 5000; i++)
{
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
{
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel),
nameof(VaultViewModel), cancellationToken);
}
}
}
}