From dec69e959da69ea4eac7e1975575e9e541a9ad15 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Tue, 16 Jul 2024 20:47:00 +0200 Subject: [PATCH] Add AliasVault.SmtpService project, refactor solution structure (#104) --- .gitignore | 4 +- CONTRIBUTING.md | 4 +- aliasvault.sln | 15 ++- docker-compose.yml | 4 +- .../Controllers/AuthController.cs | 4 +- .../Controllers/VaultController.cs | 6 +- .../Jwt/TimeValidationJwtBearerEvents.cs | 3 +- .../AliasVault.Client.csproj} | 6 +- .../App.razor | 0 .../Auth/Components/InputTextField.razor | 0 .../Auth/Components/Logo.razor | 0 .../Auth/Layout/MainLayout.razor | 2 +- .../Auth/Layout/MainLayout.razor.css | 0 .../Auth/Pages/Base/LoginBase.cs | 4 +- .../Auth/Pages/Login.razor | 4 +- .../Auth/Pages/Logout.razor | 0 .../Auth/Pages/Register.razor | 4 +- .../Auth/Pages/Unlock.razor | 4 +- .../Dockerfile | 18 ++-- .../GlobalUsings.cs | 8 +- .../Components/Alerts/AlertMessageError.razor | 0 .../Alerts/AlertMessageSuccess.razor | 0 .../Alerts/GlobalNotificationDisplay.razor | 0 .../Alerts/ServerValidationErrors.razor | 0 .../Attachments/AttachmentUploader.razor | 0 .../Attachments/AttachmentViewer.razor | 0 .../Credentials/CredentialCard.razor | 0 .../Credentials/DisplayFavicon.razor | 0 .../Main/Components/Email/RecentEmails.razor | 2 +- .../Components/Forms/CopyPasteFormRow.razor | 2 +- .../Main/Components/Forms/EditFormRow.razor | 0 .../Main/Components/Layout/Breadcrumb.razor | 0 .../Components/Layout/LayoutPageTitle.razor | 0 .../Loading/FullScreenLoadingIndicator.razor | 0 .../FullScreenLoadingIndicator.razor.css | 0 .../Components/Loading/LoadingIndicator.razor | 0 .../Loading/SmallLoadingIndicator.razor | 0 .../Main/Components/RedirectToLogin.razor | 0 .../Main/Layout/DbStatusIndicator.razor | 0 .../Main/Layout/DbStatusIndicator.razor.css | 0 .../Main/Layout/EmptyLayout.razor | 0 .../Main/Layout/Footer.razor | 0 .../Main/Layout/Footer.razor.css | 0 .../Main/Layout/MainLayout.razor | 0 .../Main/Layout/TopMenu.razor | 2 +- .../Main/Layout/TopMenu.razor.css | 0 .../Main/Models/BreadcrumbItem.cs | 2 +- .../Main/Models/CredentialEdit.cs | 4 +- .../Main/Models/CredentialListEntry.cs | 2 +- .../StringDateFormatAttribute.cs | 2 +- .../Main/Models/Spamok/AttachmentApiModel.cs | 2 +- .../Models/Spamok/Base/EmailApiModelBase.cs | 2 +- .../Main/Models/Spamok/EmailApiModel.cs | 4 +- .../Main/Models/Spamok/MailboxApiModel.cs | 2 +- .../Models/Spamok/MailboxEmailApiModel.cs | 4 +- .../Main/Pages/Credentials/AddEdit.razor | 0 .../Main/Pages/Credentials/Delete.razor | 0 .../Main/Pages/Credentials/Home.razor | 0 .../Main/Pages/Credentials/View.razor | 0 .../Main/Pages/Home.razor | 0 .../Main/Pages/MainBase.cs | 6 +- .../Main/Pages/Settings/Vault.razor | 0 .../Pages/Sync/StatusMessages/Creating.razor | 0 .../StatusMessages/ErrorVaultDecrypt.razor | 0 .../StatusMessages/PendingMigrations.razor | 0 .../VaultDecryptionProgress.razor | 0 .../Main/Pages/Sync/Sync.razor | 2 +- .../Main/Pages/Test/Test1.razor | 0 .../Main/Pages/Test/Test2.razor | 0 .../Program.cs | 4 +- .../Properties/launchSettings.json | 0 .../Providers/AuthStateProvider.cs | 4 +- .../Auth/AliasVaultApiHandlerService.cs | 2 +- .../Services/Auth/AuthService.cs | 2 +- .../Services/ClipboardCopyService.cs | 2 +- .../Services/CredentialService.cs | 4 +- .../Services/Database/DbService.cs | 4 +- .../Services/Database/DbServiceState.cs | 2 +- .../Services/GlobalLoadingService.cs | 2 +- .../Services/GlobalNotificationService.cs | 2 +- .../_Imports.razor | 28 +++--- .../entrypoint.sh | 0 .../nginx.conf | 0 .../package-lock.json | 4 +- .../package.json | 2 +- .../postcss.config.js | 0 .../tailwind.config.js | 0 .../tailwind.css | 0 .../wwwroot/appsettings.json | 0 .../wwwroot/css/app.css | 0 .../wwwroot/css/tailwind.css | 34 +------ .../wwwroot/favicon.png | Bin .../wwwroot/horizontal-logo-cropped.png | Bin .../wwwroot/icon-trimmed.png | Bin .../wwwroot/img/avatar.webp | Bin .../wwwroot/img/service-placeholder.webp | Bin .../wwwroot/index.template.html | 2 +- .../wwwroot/js/cryptoInterop.js | 0 .../wwwroot/js/dark-mode.js | 0 .../wwwroot/js/utilities.js | 0 .../AliasVault.SmtpService.csproj | 21 ++++ .../Certificates/.gitignore | 1 + .../Certificates/README.md | 6 ++ src/Services/AliasVault.SmtpService/Config.cs | 25 +++++ .../AliasVault.SmtpService/Dockerfile | 23 +++++ .../AliasVault.SmtpService/Program.cs | 94 ++++++++++++++++++ .../Properties/launchSettings.json | 15 +++ src/Services/AliasVault.SmtpService/Worker.cs | 22 ++++ .../appsettings.Development.json | 8 ++ .../AliasVault.SmtpService/appsettings.json | 14 +++ .../AliasVault.E2ETests.csproj | 2 +- .../Common/PlaywrightTest.cs | 11 +- ... => WebApplicationClientFactoryFixture.cs} | 4 +- .../AliasVault.E2ETests.Client.Server.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 0 .../README.md | 4 +- src/Utilities/Cryptography/Encryption.cs | 10 +- 118 files changed, 351 insertions(+), 139 deletions(-) rename src/{AliasVault.WebApp/AliasVault.WebApp.csproj => AliasVault.Client/AliasVault.Client.csproj} (95%) rename src/{AliasVault.WebApp => AliasVault.Client}/App.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Components/InputTextField.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Components/Logo.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Layout/MainLayout.razor (87%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Layout/MainLayout.razor.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Pages/Base/LoginBase.cs (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Pages/Login.razor (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Pages/Logout.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Pages/Register.razor (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Auth/Pages/Unlock.razor (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Dockerfile (73%) rename src/{AliasVault.WebApp => AliasVault.Client}/GlobalUsings.cs (77%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Alerts/AlertMessageError.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Alerts/AlertMessageSuccess.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Alerts/GlobalNotificationDisplay.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Alerts/ServerValidationErrors.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Attachments/AttachmentUploader.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Attachments/AttachmentViewer.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Credentials/CredentialCard.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Credentials/DisplayFavicon.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Email/RecentEmails.razor (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Forms/CopyPasteFormRow.razor (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Forms/EditFormRow.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Layout/Breadcrumb.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Layout/LayoutPageTitle.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Loading/FullScreenLoadingIndicator.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Loading/FullScreenLoadingIndicator.razor.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Loading/LoadingIndicator.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/Loading/SmallLoadingIndicator.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Components/RedirectToLogin.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/DbStatusIndicator.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/DbStatusIndicator.razor.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/EmptyLayout.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/Footer.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/Footer.razor.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/MainLayout.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/TopMenu.razor (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Layout/TopMenu.razor.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/BreadcrumbItem.cs (94%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/CredentialEdit.cs (96%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/CredentialListEntry.cs (96%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/FormValidation/StringDateFormatAttribute.cs (96%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/Spamok/AttachmentApiModel.cs (96%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/Spamok/Base/EmailApiModelBase.cs (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/Spamok/EmailApiModel.cs (90%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/Spamok/MailboxApiModel.cs (95%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Models/Spamok/MailboxEmailApiModel.cs (87%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Credentials/AddEdit.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Credentials/Delete.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Credentials/Home.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Credentials/View.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Home.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/MainBase.cs (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Settings/Vault.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Sync/StatusMessages/Creating.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Sync/StatusMessages/ErrorVaultDecrypt.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Sync/StatusMessages/PendingMigrations.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Sync/StatusMessages/VaultDecryptionProgress.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Sync/Sync.razor (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Test/Test1.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Main/Pages/Test/Test2.razor (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Program.cs (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Properties/launchSettings.json (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/Providers/AuthStateProvider.cs (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/Auth/AliasVaultApiHandlerService.cs (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/Auth/AuthService.cs (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/ClipboardCopyService.cs (96%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/CredentialService.cs (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/Database/DbService.cs (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/Database/DbServiceState.cs (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/GlobalLoadingService.cs (97%) rename src/{AliasVault.WebApp => AliasVault.Client}/Services/GlobalNotificationService.cs (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/_Imports.razor (50%) rename src/{AliasVault.WebApp => AliasVault.Client}/entrypoint.sh (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/nginx.conf (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/package-lock.json (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/package.json (92%) rename src/{AliasVault.WebApp => AliasVault.Client}/postcss.config.js (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/tailwind.config.js (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/tailwind.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/appsettings.json (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/css/app.css (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/css/tailwind.css (99%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/favicon.png (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/horizontal-logo-cropped.png (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/icon-trimmed.png (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/img/avatar.webp (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/img/service-placeholder.webp (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/index.template.html (98%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/js/cryptoInterop.js (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/js/dark-mode.js (100%) rename src/{AliasVault.WebApp => AliasVault.Client}/wwwroot/js/utilities.js (100%) create mode 100644 src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj create mode 100644 src/Services/AliasVault.SmtpService/Certificates/.gitignore create mode 100644 src/Services/AliasVault.SmtpService/Certificates/README.md create mode 100644 src/Services/AliasVault.SmtpService/Config.cs create mode 100644 src/Services/AliasVault.SmtpService/Dockerfile create mode 100644 src/Services/AliasVault.SmtpService/Program.cs create mode 100644 src/Services/AliasVault.SmtpService/Properties/launchSettings.json create mode 100644 src/Services/AliasVault.SmtpService/Worker.cs create mode 100644 src/Services/AliasVault.SmtpService/appsettings.Development.json create mode 100644 src/Services/AliasVault.SmtpService/appsettings.json rename src/Tests/AliasVault.E2ETests/Infrastructure/{WebApplicationWasmFactoryFixture.cs => WebApplicationClientFactoryFixture.cs} (89%) rename src/Tests/Server/{AliasVault.E2ETests.WebApp.Server/AliasVault.E2ETests.WebApp.Server.csproj => AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj} (81%) rename src/Tests/Server/{AliasVault.E2ETests.WebApp.Server => AliasVault.E2ETests.Client.Server}/Program.cs (92%) rename src/Tests/Server/{AliasVault.E2ETests.WebApp.Server => AliasVault.E2ETests.Client.Server}/Properties/launchSettings.json (100%) rename src/Tests/Server/{AliasVault.E2ETests.WebApp.Server => AliasVault.E2ETests.Client.Server}/README.md (62%) diff --git a/.gitignore b/.gitignore index 97215b611..5369ec659 100644 --- a/.gitignore +++ b/.gitignore @@ -373,9 +373,9 @@ FodyWeavers.xsd # AliasVault specific # index.html is generated by the build process from index.template.html and therefore should be ignored -src/AliasVault.WebApp/wwwroot/index.html +src/AliasVault.Client/wwwroot/index.html # appsettings.Development.json is generated by the build process from appsettings.Development.template.json and therefore should be ignored -src/AliasVault.WebApp/wwwroot/appsettings.Development.json +src/AliasVault.Client/wwwroot/appsettings.Development.json # appsettings.Development.json is added manually if needed, it should not be committed. src/Tests/AliasVault.E2ETests/appsettings.Development.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 96af43765..f3e133b0e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,8 +69,8 @@ dotnet tool install --global Microsoft.Playwright.CLI pwsh src/Tests/AliasVault.E2ETests/bin/Debug/net8.0/playwright.ps1 install ``` -### 7. Create AliasVault.WebApp appsettings.Development.json -The WASM app supports a development specific appsettings.json file. This appsettings file is optional but can override various options to make debugging easier. +### 7. Create AliasVault.Client appsettings.Development.json +The WASM client app supports a development specific appsettings.json file. This appsettings file is optional but can override various options to make debugging easier. 1. Copy `wwwroot/appsettings.json` to `wwwroot/appsettings.Development.json` diff --git a/aliasvault.sln b/aliasvault.sln index 34575fa73..067939259 100644 --- a/aliasvault.sln +++ b/aliasvault.sln @@ -15,7 +15,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cryptography", "src\Utiliti EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Api", "src\AliasVault.Api\AliasVault.Api.csproj", "{B797C533-260E-4DA2-83B1-0EE4BCFE08DB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.WebApp", "src\AliasVault.WebApp\AliasVault.WebApp.csproj", "{25248E01-5A4B-4F95-A63C-BEA01499A1C2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Client", "src\AliasVault.Client\AliasVault.Client.csproj", "{25248E01-5A4B-4F95-A63C-BEA01499A1C2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Shared", "src\AliasVault.Shared\AliasVault.Shared.csproj", "{15EFE0D0-F41B-47D7-86B7-8F840335CB82}" EndProject @@ -29,11 +29,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasServerDb", "src\Databa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasClientDb", "src\Databases\AliasClientDb\AliasClientDb.csproj", "{FE10F294-817F-477E-A24F-8597A15AF0B5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.E2ETests.WebApp.Server", "src\Tests\Server\AliasVault.E2ETests.WebApp.Server\AliasVault.E2ETests.WebApp.Server.csproj", "{DD1F496F-CF10-47D1-A57F-5FA256479332}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.E2ETests.Client.Server", "src\Tests\Server\AliasVault.E2ETests.Client.Server\AliasVault.E2ETests.Client.Server.csproj", "{DD1F496F-CF10-47D1-A57F-5FA256479332}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{607945F3-9896-4544-99EC-F3496CF4D36B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsvImportExport", "src\Utilities\CsvImportExport\CsvImportExport.csproj", "{A9C9A606-C87E-4298-AB32-09B1884D7487}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CsvImportExport", "src\Utilities\CsvImportExport\CsvImportExport.csproj", "{A9C9A606-C87E-4298-AB32-09B1884D7487}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{8A477241-B96C-4174-968D-D40CB77F1ECD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.SmtpService", "src\Services\AliasVault.SmtpService\AliasVault.SmtpService.csproj", "{B095A174-E528-4D38-BEC1-D1D38B3B30C0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -89,6 +93,10 @@ Global {A9C9A606-C87E-4298-AB32-09B1884D7487}.Debug|Any CPU.Build.0 = Debug|Any CPU {A9C9A606-C87E-4298-AB32-09B1884D7487}.Release|Any CPU.ActiveCfg = Release|Any CPU {A9C9A606-C87E-4298-AB32-09B1884D7487}.Release|Any CPU.Build.0 = Release|Any CPU + {B095A174-E528-4D38-BEC1-D1D38B3B30C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B095A174-E528-4D38-BEC1-D1D38B3B30C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B095A174-E528-4D38-BEC1-D1D38B3B30C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B095A174-E528-4D38-BEC1-D1D38B3B30C0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -103,6 +111,7 @@ Global {DD1F496F-CF10-47D1-A57F-5FA256479332} = {607945F3-9896-4544-99EC-F3496CF4D36B} {607945F3-9896-4544-99EC-F3496CF4D36B} = {29DE523D-EEF2-41E9-AC12-F20D8D02BEBB} {A9C9A606-C87E-4298-AB32-09B1884D7487} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8} + {B095A174-E528-4D38-BEC1-D1D38B3B30C0} = {8A477241-B96C-4174-968D-D40CB77F1ECD} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FEE82475-C009-4762-8113-A6563D9DC49E} diff --git a/docker-compose.yml b/docker-compose.yml index 90f7b5425..f37491ea9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,9 @@ services: wasm: - image: aliasvault + image: aliasvault-client build: context: . - dockerfile: src/AliasVault.WebApp/Dockerfile + dockerfile: src/AliasVault.Client/Dockerfile ports: - "80:8080" restart: always diff --git a/src/AliasVault.Api/Controllers/AuthController.cs b/src/AliasVault.Api/Controllers/AuthController.cs index 305d296f3..1714ce74b 100644 --- a/src/AliasVault.Api/Controllers/AuthController.cs +++ b/src/AliasVault.Api/Controllers/AuthController.cs @@ -40,7 +40,7 @@ public class AuthController(AliasServerDbContext context, UserManager /// Error message for invalid email or password. /// - public static readonly string[] InvalidEmailOrPasswordError = { "Invalid email or password. Please try again." }; + public static readonly string[] InvalidEmailOrPasswordError = ["Invalid email or password. Please try again."]; /// /// Login endpoint used to process login attempt using credentials. @@ -79,7 +79,7 @@ public class AuthController(AliasServerDbContext context, UserManager private readonly RetentionPolicy _retentionPolicy = new() { - Rules = new List - { + Rules = + [ new DailyRetentionRule { DaysToKeep = 3 }, new WeeklyRetentionRule { WeeksToKeep = 1 }, new MonthlyRetentionRule { MonthsToKeep = 1 }, new VersionRetentionRule { VersionsToKeep = 3 }, - }, + ], }; /// diff --git a/src/AliasVault.Api/Jwt/TimeValidationJwtBearerEvents.cs b/src/AliasVault.Api/Jwt/TimeValidationJwtBearerEvents.cs index 7e5c22310..17271ea71 100644 --- a/src/AliasVault.Api/Jwt/TimeValidationJwtBearerEvents.cs +++ b/src/AliasVault.Api/Jwt/TimeValidationJwtBearerEvents.cs @@ -25,8 +25,7 @@ public class TimeValidationJwtBearerEvents(ITimeProvider timeProvider) : JwtBear /// Async task. public override Task TokenValidated(TokenValidatedContext context) { - var jwtToken = context.SecurityToken as JsonWebToken; - if (jwtToken != null) + if (context.SecurityToken is JsonWebToken jwtToken) { var now = timeProvider.UtcNow; if (jwtToken.ValidTo < now) diff --git a/src/AliasVault.WebApp/AliasVault.WebApp.csproj b/src/AliasVault.Client/AliasVault.Client.csproj similarity index 95% rename from src/AliasVault.WebApp/AliasVault.WebApp.csproj rename to src/AliasVault.Client/AliasVault.Client.csproj index ef9c92a49..6b73051f7 100644 --- a/src/AliasVault.WebApp/AliasVault.WebApp.csproj +++ b/src/AliasVault.Client/AliasVault.Client.csproj @@ -1,6 +1,6 @@  - AliasVault.WebApp + AliasVault.Client net8.0 enable enable @@ -10,14 +10,14 @@ - bin\Debug\net8.0\AliasVault.WebApp.xml + bin\Debug\net8.0\AliasVault.Client.xml true dev true - bin\Release\net8.0\AliasVault.WebApp.xml + bin\Release\net8.0\AliasVault.Client.xml true True $([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss")) diff --git a/src/AliasVault.WebApp/App.razor b/src/AliasVault.Client/App.razor similarity index 100% rename from src/AliasVault.WebApp/App.razor rename to src/AliasVault.Client/App.razor diff --git a/src/AliasVault.WebApp/Auth/Components/InputTextField.razor b/src/AliasVault.Client/Auth/Components/InputTextField.razor similarity index 100% rename from src/AliasVault.WebApp/Auth/Components/InputTextField.razor rename to src/AliasVault.Client/Auth/Components/InputTextField.razor diff --git a/src/AliasVault.WebApp/Auth/Components/Logo.razor b/src/AliasVault.Client/Auth/Components/Logo.razor similarity index 100% rename from src/AliasVault.WebApp/Auth/Components/Logo.razor rename to src/AliasVault.Client/Auth/Components/Logo.razor diff --git a/src/AliasVault.WebApp/Auth/Layout/MainLayout.razor b/src/AliasVault.Client/Auth/Layout/MainLayout.razor similarity index 87% rename from src/AliasVault.WebApp/Auth/Layout/MainLayout.razor rename to src/AliasVault.Client/Auth/Layout/MainLayout.razor index 431820484..0856eb1f7 100644 --- a/src/AliasVault.WebApp/Auth/Layout/MainLayout.razor +++ b/src/AliasVault.Client/Auth/Layout/MainLayout.razor @@ -1,5 +1,5 @@ @inherits LayoutComponentBase -@using AliasVault.WebApp.Auth.Components +@using AliasVault.Client.Auth.Components
diff --git a/src/AliasVault.WebApp/Auth/Layout/MainLayout.razor.css b/src/AliasVault.Client/Auth/Layout/MainLayout.razor.css similarity index 100% rename from src/AliasVault.WebApp/Auth/Layout/MainLayout.razor.css rename to src/AliasVault.Client/Auth/Layout/MainLayout.razor.css diff --git a/src/AliasVault.WebApp/Auth/Pages/Base/LoginBase.cs b/src/AliasVault.Client/Auth/Pages/Base/LoginBase.cs similarity index 98% rename from src/AliasVault.WebApp/Auth/Pages/Base/LoginBase.cs rename to src/AliasVault.Client/Auth/Pages/Base/LoginBase.cs index b5a9074c5..9643175a4 100644 --- a/src/AliasVault.WebApp/Auth/Pages/Base/LoginBase.cs +++ b/src/AliasVault.Client/Auth/Pages/Base/LoginBase.cs @@ -5,13 +5,13 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Auth.Pages.Base; +namespace AliasVault.Client.Auth.Pages.Base; using System.Net.Http.Json; using System.Text.Json; +using AliasVault.Client.Services.Auth; using AliasVault.Shared.Models.WebApi; using AliasVault.Shared.Models.WebApi.Auth; -using AliasVault.WebApp.Services.Auth; using Blazored.LocalStorage; using Cryptography; using Microsoft.AspNetCore.Components; diff --git a/src/AliasVault.WebApp/Auth/Pages/Login.razor b/src/AliasVault.Client/Auth/Pages/Login.razor similarity index 97% rename from src/AliasVault.WebApp/Auth/Pages/Login.razor rename to src/AliasVault.Client/Auth/Pages/Login.razor index 14d0bef17..32983110f 100644 --- a/src/AliasVault.WebApp/Auth/Pages/Login.razor +++ b/src/AliasVault.Client/Auth/Pages/Login.razor @@ -1,9 +1,9 @@ @page "/user/login" -@inherits AliasVault.WebApp.Auth.Pages.Base.LoginBase +@inherits AliasVault.Client.Auth.Pages.Base.LoginBase @layout Auth.Layout.MainLayout @attribute [AllowAnonymous] @using AliasVault.Shared.Models -@using AliasVault.WebApp.Auth.Components +@using AliasVault.Client.Auth.Components

Sign in to AliasVault diff --git a/src/AliasVault.WebApp/Auth/Pages/Logout.razor b/src/AliasVault.Client/Auth/Pages/Logout.razor similarity index 100% rename from src/AliasVault.WebApp/Auth/Pages/Logout.razor rename to src/AliasVault.Client/Auth/Pages/Logout.razor diff --git a/src/AliasVault.WebApp/Auth/Pages/Register.razor b/src/AliasVault.Client/Auth/Pages/Register.razor similarity index 98% rename from src/AliasVault.WebApp/Auth/Pages/Register.razor rename to src/AliasVault.Client/Auth/Pages/Register.razor index 7f79ba377..b24c2636c 100644 --- a/src/AliasVault.WebApp/Auth/Pages/Register.razor +++ b/src/AliasVault.Client/Auth/Pages/Register.razor @@ -7,8 +7,8 @@ @inject AuthService AuthService @using System.Text.Json @using AliasVault.Shared.Models -@using AliasVault.WebApp.Auth.Components -@using AliasVault.WebApp.Auth.Pages.Base +@using AliasVault.Client.Auth.Components +@using AliasVault.Client.Auth.Pages.Base @using Cryptography @using SecureRemotePassword diff --git a/src/AliasVault.WebApp/Auth/Pages/Unlock.razor b/src/AliasVault.Client/Auth/Pages/Unlock.razor similarity index 97% rename from src/AliasVault.WebApp/Auth/Pages/Unlock.razor rename to src/AliasVault.Client/Auth/Pages/Unlock.razor index 7b9a21f3c..454114761 100644 --- a/src/AliasVault.WebApp/Auth/Pages/Unlock.razor +++ b/src/AliasVault.Client/Auth/Pages/Unlock.razor @@ -1,8 +1,8 @@ @page "/unlock" -@inherits AliasVault.WebApp.Auth.Pages.Base.LoginBase +@inherits AliasVault.Client.Auth.Pages.Base.LoginBase @layout Auth.Layout.MainLayout @using AliasVault.Shared.Models -@using AliasVault.WebApp.Auth.Components +@using AliasVault.Client.Auth.Components
Bonnie image diff --git a/src/AliasVault.WebApp/Dockerfile b/src/AliasVault.Client/Dockerfile similarity index 73% rename from src/AliasVault.WebApp/Dockerfile rename to src/AliasVault.Client/Dockerfile index e95d08b33..3fe823426 100644 --- a/src/AliasVault.WebApp/Dockerfile +++ b/src/AliasVault.Client/Dockerfile @@ -14,31 +14,31 @@ RUN apt-get update && apt-get install -y python3 && apt-get clean RUN dotnet workload install wasm-tools # Copy the project files and restore dependencies -COPY ["src/AliasVault.WebApp/AliasVault.WebApp.csproj", "src/AliasVault.WebApp/"] +COPY ["src/AliasVault.Client/AliasVault.Client.csproj", "src/AliasVault.Client/"] COPY ["src/AliasVault.Shared/AliasVault.Shared.csproj", "src/AliasVault.Shared/"] COPY ["src/Databases/AliasServerDb/AliasServerDb.csproj", "src/Databases/AliasServerDb/"] COPY ["src/AliasGenerators/AliasGenerators.csproj", "src/AliasGenerators/"] COPY ["src/Utilities/FaviconExtractor/FaviconExtractor.csproj", "src/Utilities/FaviconExtractor/"] -RUN dotnet restore "src/AliasVault.WebApp/AliasVault.WebApp.csproj" +RUN dotnet restore "src/AliasVault.Client/AliasVault.Client.csproj" # Copy the rest of the application code COPY . . -# Build the WebApp project -WORKDIR "/src/src/AliasVault.WebApp" -RUN dotnet build "AliasVault.WebApp.csproj" -c "$BUILD_CONFIGURATION" -o /app/build +# Build the Client project +WORKDIR "/src/src/AliasVault.Client" +RUN dotnet build "AliasVault.Client.csproj" -c "$BUILD_CONFIGURATION" -o /app/build -# Publish the WebApp project +# Publish the Client project FROM build AS publish ARG BUILD_CONFIGURATION=Release -RUN dotnet publish "AliasVault.WebApp.csproj" -c "$BUILD_CONFIGURATION" -o /app/publish /p:UseAppHost=false +RUN dotnet publish "AliasVault.Client.csproj" -c "$BUILD_CONFIGURATION" -o /app/publish /p:UseAppHost=false # Final stage: start nginx and serve static html files that were published in the previous stage FROM nginx:alpine AS final WORKDIR /usr/share/nginx/html COPY --from=publish /app/publish/wwwroot . -COPY /src/AliasVault.WebApp/nginx.conf /etc/nginx/nginx.conf -COPY /src/AliasVault.WebApp/entrypoint.sh /app/ +COPY /src/AliasVault.Client/nginx.conf /etc/nginx/nginx.conf +COPY /src/AliasVault.Client/entrypoint.sh /app/ RUN chmod +x /app/entrypoint.sh EXPOSE 8080 ENV ASPNETCORE_URLS=http://+:8080 diff --git a/src/AliasVault.WebApp/GlobalUsings.cs b/src/AliasVault.Client/GlobalUsings.cs similarity index 77% rename from src/AliasVault.WebApp/GlobalUsings.cs rename to src/AliasVault.Client/GlobalUsings.cs index 547b4d0e1..8a62d0608 100644 --- a/src/AliasVault.WebApp/GlobalUsings.cs +++ b/src/AliasVault.Client/GlobalUsings.cs @@ -9,7 +9,7 @@ // Note: this file is not actually auto-generated but the statement above is required because // otherwise a lot of SA1200 checks will fail due to it not fully supporting GlobalUsings at time of writing. -global using AliasVault.WebApp.Main.Models; -global using AliasVault.WebApp.Services; -global using AliasVault.WebApp.Services.Auth; -global using AliasVault.WebApp.Services.Database; +global using AliasVault.Client.Main.Models; +global using AliasVault.Client.Services; +global using AliasVault.Client.Services.Auth; +global using AliasVault.Client.Services.Database; diff --git a/src/AliasVault.WebApp/Main/Components/Alerts/AlertMessageError.razor b/src/AliasVault.Client/Main/Components/Alerts/AlertMessageError.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Alerts/AlertMessageError.razor rename to src/AliasVault.Client/Main/Components/Alerts/AlertMessageError.razor diff --git a/src/AliasVault.WebApp/Main/Components/Alerts/AlertMessageSuccess.razor b/src/AliasVault.Client/Main/Components/Alerts/AlertMessageSuccess.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Alerts/AlertMessageSuccess.razor rename to src/AliasVault.Client/Main/Components/Alerts/AlertMessageSuccess.razor diff --git a/src/AliasVault.WebApp/Main/Components/Alerts/GlobalNotificationDisplay.razor b/src/AliasVault.Client/Main/Components/Alerts/GlobalNotificationDisplay.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Alerts/GlobalNotificationDisplay.razor rename to src/AliasVault.Client/Main/Components/Alerts/GlobalNotificationDisplay.razor diff --git a/src/AliasVault.WebApp/Main/Components/Alerts/ServerValidationErrors.razor b/src/AliasVault.Client/Main/Components/Alerts/ServerValidationErrors.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Alerts/ServerValidationErrors.razor rename to src/AliasVault.Client/Main/Components/Alerts/ServerValidationErrors.razor diff --git a/src/AliasVault.WebApp/Main/Components/Attachments/AttachmentUploader.razor b/src/AliasVault.Client/Main/Components/Attachments/AttachmentUploader.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Attachments/AttachmentUploader.razor rename to src/AliasVault.Client/Main/Components/Attachments/AttachmentUploader.razor diff --git a/src/AliasVault.WebApp/Main/Components/Attachments/AttachmentViewer.razor b/src/AliasVault.Client/Main/Components/Attachments/AttachmentViewer.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Attachments/AttachmentViewer.razor rename to src/AliasVault.Client/Main/Components/Attachments/AttachmentViewer.razor diff --git a/src/AliasVault.WebApp/Main/Components/Credentials/CredentialCard.razor b/src/AliasVault.Client/Main/Components/Credentials/CredentialCard.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Credentials/CredentialCard.razor rename to src/AliasVault.Client/Main/Components/Credentials/CredentialCard.razor diff --git a/src/AliasVault.WebApp/Main/Components/Credentials/DisplayFavicon.razor b/src/AliasVault.Client/Main/Components/Credentials/DisplayFavicon.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Credentials/DisplayFavicon.razor rename to src/AliasVault.Client/Main/Components/Credentials/DisplayFavicon.razor diff --git a/src/AliasVault.WebApp/Main/Components/Email/RecentEmails.razor b/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor similarity index 99% rename from src/AliasVault.WebApp/Main/Components/Email/RecentEmails.razor rename to src/AliasVault.Client/Main/Components/Email/RecentEmails.razor index ea6d0cff3..acba2eb0a 100644 --- a/src/AliasVault.WebApp/Main/Components/Email/RecentEmails.razor +++ b/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor @@ -1,4 +1,4 @@ -@using AliasVault.WebApp.Main.Models.Spamok +@using AliasVault.Client.Main.Models.Spamok @inherits ComponentBase @inject IHttpClientFactory HttpClientFactory diff --git a/src/AliasVault.WebApp/Main/Components/Forms/CopyPasteFormRow.razor b/src/AliasVault.Client/Main/Components/Forms/CopyPasteFormRow.razor similarity index 98% rename from src/AliasVault.WebApp/Main/Components/Forms/CopyPasteFormRow.razor rename to src/AliasVault.Client/Main/Components/Forms/CopyPasteFormRow.razor index 06b6584aa..89721349f 100644 --- a/src/AliasVault.WebApp/Main/Components/Forms/CopyPasteFormRow.razor +++ b/src/AliasVault.Client/Main/Components/Forms/CopyPasteFormRow.razor @@ -1,4 +1,4 @@ -@using AliasVault.WebApp.Services +@using AliasVault.Client.Services @inject ClipboardCopyService ClipboardCopyService diff --git a/src/AliasVault.WebApp/Main/Components/Forms/EditFormRow.razor b/src/AliasVault.Client/Main/Components/Forms/EditFormRow.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Forms/EditFormRow.razor rename to src/AliasVault.Client/Main/Components/Forms/EditFormRow.razor diff --git a/src/AliasVault.WebApp/Main/Components/Layout/Breadcrumb.razor b/src/AliasVault.Client/Main/Components/Layout/Breadcrumb.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Layout/Breadcrumb.razor rename to src/AliasVault.Client/Main/Components/Layout/Breadcrumb.razor diff --git a/src/AliasVault.WebApp/Main/Components/Layout/LayoutPageTitle.razor b/src/AliasVault.Client/Main/Components/Layout/LayoutPageTitle.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Layout/LayoutPageTitle.razor rename to src/AliasVault.Client/Main/Components/Layout/LayoutPageTitle.razor diff --git a/src/AliasVault.WebApp/Main/Components/Loading/FullScreenLoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Loading/FullScreenLoadingIndicator.razor rename to src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor diff --git a/src/AliasVault.WebApp/Main/Components/Loading/FullScreenLoadingIndicator.razor.css b/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor.css similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Loading/FullScreenLoadingIndicator.razor.css rename to src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor.css diff --git a/src/AliasVault.WebApp/Main/Components/Loading/LoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Loading/LoadingIndicator.razor rename to src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor diff --git a/src/AliasVault.WebApp/Main/Components/Loading/SmallLoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/SmallLoadingIndicator.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/Loading/SmallLoadingIndicator.razor rename to src/AliasVault.Client/Main/Components/Loading/SmallLoadingIndicator.razor diff --git a/src/AliasVault.WebApp/Main/Components/RedirectToLogin.razor b/src/AliasVault.Client/Main/Components/RedirectToLogin.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Components/RedirectToLogin.razor rename to src/AliasVault.Client/Main/Components/RedirectToLogin.razor diff --git a/src/AliasVault.WebApp/Main/Layout/DbStatusIndicator.razor b/src/AliasVault.Client/Main/Layout/DbStatusIndicator.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/DbStatusIndicator.razor rename to src/AliasVault.Client/Main/Layout/DbStatusIndicator.razor diff --git a/src/AliasVault.WebApp/Main/Layout/DbStatusIndicator.razor.css b/src/AliasVault.Client/Main/Layout/DbStatusIndicator.razor.css similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/DbStatusIndicator.razor.css rename to src/AliasVault.Client/Main/Layout/DbStatusIndicator.razor.css diff --git a/src/AliasVault.WebApp/Main/Layout/EmptyLayout.razor b/src/AliasVault.Client/Main/Layout/EmptyLayout.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/EmptyLayout.razor rename to src/AliasVault.Client/Main/Layout/EmptyLayout.razor diff --git a/src/AliasVault.WebApp/Main/Layout/Footer.razor b/src/AliasVault.Client/Main/Layout/Footer.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/Footer.razor rename to src/AliasVault.Client/Main/Layout/Footer.razor diff --git a/src/AliasVault.WebApp/Main/Layout/Footer.razor.css b/src/AliasVault.Client/Main/Layout/Footer.razor.css similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/Footer.razor.css rename to src/AliasVault.Client/Main/Layout/Footer.razor.css diff --git a/src/AliasVault.WebApp/Main/Layout/MainLayout.razor b/src/AliasVault.Client/Main/Layout/MainLayout.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/MainLayout.razor rename to src/AliasVault.Client/Main/Layout/MainLayout.razor diff --git a/src/AliasVault.WebApp/Main/Layout/TopMenu.razor b/src/AliasVault.Client/Main/Layout/TopMenu.razor similarity index 99% rename from src/AliasVault.WebApp/Main/Layout/TopMenu.razor rename to src/AliasVault.Client/Main/Layout/TopMenu.razor index a10499e83..303d6f374 100644 --- a/src/AliasVault.WebApp/Main/Layout/TopMenu.razor +++ b/src/AliasVault.Client/Main/Layout/TopMenu.razor @@ -1,5 +1,5 @@ @inherits MainBase -@using AliasVault.WebApp.Main.Pages; +@using AliasVault.Client.Main.Pages; @implements IDisposable
diff --git a/src/AliasVault.WebApp/Main/Layout/TopMenu.razor.css b/src/AliasVault.Client/Main/Layout/TopMenu.razor.css similarity index 100% rename from src/AliasVault.WebApp/Main/Layout/TopMenu.razor.css rename to src/AliasVault.Client/Main/Layout/TopMenu.razor.css diff --git a/src/AliasVault.WebApp/Main/Models/BreadcrumbItem.cs b/src/AliasVault.Client/Main/Models/BreadcrumbItem.cs similarity index 94% rename from src/AliasVault.WebApp/Main/Models/BreadcrumbItem.cs rename to src/AliasVault.Client/Main/Models/BreadcrumbItem.cs index 6620baea0..bc68cf068 100644 --- a/src/AliasVault.WebApp/Main/Models/BreadcrumbItem.cs +++ b/src/AliasVault.Client/Main/Models/BreadcrumbItem.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models; +namespace AliasVault.Client.Main.Models; /// /// Represents a breadcrumb item for the breadcrumb component. diff --git a/src/AliasVault.WebApp/Main/Models/CredentialEdit.cs b/src/AliasVault.Client/Main/Models/CredentialEdit.cs similarity index 96% rename from src/AliasVault.WebApp/Main/Models/CredentialEdit.cs rename to src/AliasVault.Client/Main/Models/CredentialEdit.cs index 82d5936e4..35bac8257 100644 --- a/src/AliasVault.WebApp/Main/Models/CredentialEdit.cs +++ b/src/AliasVault.Client/Main/Models/CredentialEdit.cs @@ -5,13 +5,13 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models; +namespace AliasVault.Client.Main.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using AliasClientDb; -using AliasVault.WebApp.Models.FormValidation; +using AliasVault.Client.Models.FormValidation; /// /// Credential edit model. diff --git a/src/AliasVault.WebApp/Main/Models/CredentialListEntry.cs b/src/AliasVault.Client/Main/Models/CredentialListEntry.cs similarity index 96% rename from src/AliasVault.WebApp/Main/Models/CredentialListEntry.cs rename to src/AliasVault.Client/Main/Models/CredentialListEntry.cs index 5cafc7ada..40f7ec0d6 100644 --- a/src/AliasVault.WebApp/Main/Models/CredentialListEntry.cs +++ b/src/AliasVault.Client/Main/Models/CredentialListEntry.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models; +namespace AliasVault.Client.Main.Models; /// /// Alias list entry model. This model is used to represent an alias in a list with simplified properties. diff --git a/src/AliasVault.WebApp/Main/Models/FormValidation/StringDateFormatAttribute.cs b/src/AliasVault.Client/Main/Models/FormValidation/StringDateFormatAttribute.cs similarity index 96% rename from src/AliasVault.WebApp/Main/Models/FormValidation/StringDateFormatAttribute.cs rename to src/AliasVault.Client/Main/Models/FormValidation/StringDateFormatAttribute.cs index af7e1dc08..7ebc1b877 100644 --- a/src/AliasVault.WebApp/Main/Models/FormValidation/StringDateFormatAttribute.cs +++ b/src/AliasVault.Client/Main/Models/FormValidation/StringDateFormatAttribute.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Models.FormValidation; +namespace AliasVault.Client.Models.FormValidation; using System.ComponentModel.DataAnnotations; using System.Globalization; diff --git a/src/AliasVault.WebApp/Main/Models/Spamok/AttachmentApiModel.cs b/src/AliasVault.Client/Main/Models/Spamok/AttachmentApiModel.cs similarity index 96% rename from src/AliasVault.WebApp/Main/Models/Spamok/AttachmentApiModel.cs rename to src/AliasVault.Client/Main/Models/Spamok/AttachmentApiModel.cs index 11d8f34a2..6f5951c8f 100644 --- a/src/AliasVault.WebApp/Main/Models/Spamok/AttachmentApiModel.cs +++ b/src/AliasVault.Client/Main/Models/Spamok/AttachmentApiModel.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models.Spamok; +namespace AliasVault.Client.Main.Models.Spamok; /// /// Represents an attachment for an email. diff --git a/src/AliasVault.WebApp/Main/Models/Spamok/Base/EmailApiModelBase.cs b/src/AliasVault.Client/Main/Models/Spamok/Base/EmailApiModelBase.cs similarity index 97% rename from src/AliasVault.WebApp/Main/Models/Spamok/Base/EmailApiModelBase.cs rename to src/AliasVault.Client/Main/Models/Spamok/Base/EmailApiModelBase.cs index 6cff09231..2c96fb79b 100644 --- a/src/AliasVault.WebApp/Main/Models/Spamok/Base/EmailApiModelBase.cs +++ b/src/AliasVault.Client/Main/Models/Spamok/Base/EmailApiModelBase.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models.Spamok.Base; +namespace AliasVault.Client.Main.Models.Spamok.Base; /// /// Represents a mailbox email API model base. diff --git a/src/AliasVault.WebApp/Main/Models/Spamok/EmailApiModel.cs b/src/AliasVault.Client/Main/Models/Spamok/EmailApiModel.cs similarity index 90% rename from src/AliasVault.WebApp/Main/Models/Spamok/EmailApiModel.cs rename to src/AliasVault.Client/Main/Models/Spamok/EmailApiModel.cs index 84ab4e49e..aae8f03cd 100644 --- a/src/AliasVault.WebApp/Main/Models/Spamok/EmailApiModel.cs +++ b/src/AliasVault.Client/Main/Models/Spamok/EmailApiModel.cs @@ -5,9 +5,9 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models.Spamok; +namespace AliasVault.Client.Main.Models.Spamok; -using AliasVault.WebApp.Main.Models.Spamok.Base; +using AliasVault.Client.Main.Models.Spamok.Base; /// /// Represents an email API model. diff --git a/src/AliasVault.WebApp/Main/Models/Spamok/MailboxApiModel.cs b/src/AliasVault.Client/Main/Models/Spamok/MailboxApiModel.cs similarity index 95% rename from src/AliasVault.WebApp/Main/Models/Spamok/MailboxApiModel.cs rename to src/AliasVault.Client/Main/Models/Spamok/MailboxApiModel.cs index 0fed7dd34..c042f25fd 100644 --- a/src/AliasVault.WebApp/Main/Models/Spamok/MailboxApiModel.cs +++ b/src/AliasVault.Client/Main/Models/Spamok/MailboxApiModel.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models.Spamok; +namespace AliasVault.Client.Main.Models.Spamok; /// /// Represents a mailbox API model. diff --git a/src/AliasVault.WebApp/Main/Models/Spamok/MailboxEmailApiModel.cs b/src/AliasVault.Client/Main/Models/Spamok/MailboxEmailApiModel.cs similarity index 87% rename from src/AliasVault.WebApp/Main/Models/Spamok/MailboxEmailApiModel.cs rename to src/AliasVault.Client/Main/Models/Spamok/MailboxEmailApiModel.cs index ca05f91c6..0e2741690 100644 --- a/src/AliasVault.WebApp/Main/Models/Spamok/MailboxEmailApiModel.cs +++ b/src/AliasVault.Client/Main/Models/Spamok/MailboxEmailApiModel.cs @@ -5,9 +5,9 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Models.Spamok; +namespace AliasVault.Client.Main.Models.Spamok; -using AliasVault.WebApp.Main.Models.Spamok.Base; +using AliasVault.Client.Main.Models.Spamok.Base; /// /// Represents a mailbox email API model. diff --git a/src/AliasVault.WebApp/Main/Pages/Credentials/AddEdit.razor b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Credentials/AddEdit.razor rename to src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Credentials/Delete.razor b/src/AliasVault.Client/Main/Pages/Credentials/Delete.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Credentials/Delete.razor rename to src/AliasVault.Client/Main/Pages/Credentials/Delete.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Credentials/Home.razor b/src/AliasVault.Client/Main/Pages/Credentials/Home.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Credentials/Home.razor rename to src/AliasVault.Client/Main/Pages/Credentials/Home.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Credentials/View.razor b/src/AliasVault.Client/Main/Pages/Credentials/View.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Credentials/View.razor rename to src/AliasVault.Client/Main/Pages/Credentials/View.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Home.razor b/src/AliasVault.Client/Main/Pages/Home.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Home.razor rename to src/AliasVault.Client/Main/Pages/Home.razor diff --git a/src/AliasVault.WebApp/Main/Pages/MainBase.cs b/src/AliasVault.Client/Main/Pages/MainBase.cs similarity index 98% rename from src/AliasVault.WebApp/Main/Pages/MainBase.cs rename to src/AliasVault.Client/Main/Pages/MainBase.cs index e8a6fd575..3755fa5b5 100644 --- a/src/AliasVault.WebApp/Main/Pages/MainBase.cs +++ b/src/AliasVault.Client/Main/Pages/MainBase.cs @@ -5,10 +5,10 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Main.Pages; +namespace AliasVault.Client.Main.Pages; -using AliasVault.WebApp.Services; -using AliasVault.WebApp.Services.Auth; +using AliasVault.Client.Services; +using AliasVault.Client.Services.Auth; using Blazored.LocalStorage; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Authorization; diff --git a/src/AliasVault.WebApp/Main/Pages/Settings/Vault.razor b/src/AliasVault.Client/Main/Pages/Settings/Vault.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Settings/Vault.razor rename to src/AliasVault.Client/Main/Pages/Settings/Vault.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/Creating.razor b/src/AliasVault.Client/Main/Pages/Sync/StatusMessages/Creating.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/Creating.razor rename to src/AliasVault.Client/Main/Pages/Sync/StatusMessages/Creating.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/ErrorVaultDecrypt.razor b/src/AliasVault.Client/Main/Pages/Sync/StatusMessages/ErrorVaultDecrypt.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/ErrorVaultDecrypt.razor rename to src/AliasVault.Client/Main/Pages/Sync/StatusMessages/ErrorVaultDecrypt.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/PendingMigrations.razor b/src/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/PendingMigrations.razor rename to src/AliasVault.Client/Main/Pages/Sync/StatusMessages/PendingMigrations.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/VaultDecryptionProgress.razor b/src/AliasVault.Client/Main/Pages/Sync/StatusMessages/VaultDecryptionProgress.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Sync/StatusMessages/VaultDecryptionProgress.razor rename to src/AliasVault.Client/Main/Pages/Sync/StatusMessages/VaultDecryptionProgress.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Sync/Sync.razor b/src/AliasVault.Client/Main/Pages/Sync/Sync.razor similarity index 98% rename from src/AliasVault.WebApp/Main/Pages/Sync/Sync.razor rename to src/AliasVault.Client/Main/Pages/Sync/Sync.razor index d07bbee36..32633e3bb 100644 --- a/src/AliasVault.WebApp/Main/Pages/Sync/Sync.razor +++ b/src/AliasVault.Client/Main/Pages/Sync/Sync.razor @@ -1,7 +1,7 @@ @page "/sync" @layout EmptyLayout @implements IDisposable -@using AliasVault.WebApp.Main.Pages.Sync.StatusMessages +@using AliasVault.Client.Main.Pages.Sync.StatusMessages @inject ILocalStorageService LocalStorage @inject DbService DbService @inject AuthService AuthService diff --git a/src/AliasVault.WebApp/Main/Pages/Test/Test1.razor b/src/AliasVault.Client/Main/Pages/Test/Test1.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Test/Test1.razor rename to src/AliasVault.Client/Main/Pages/Test/Test1.razor diff --git a/src/AliasVault.WebApp/Main/Pages/Test/Test2.razor b/src/AliasVault.Client/Main/Pages/Test/Test2.razor similarity index 100% rename from src/AliasVault.WebApp/Main/Pages/Test/Test2.razor rename to src/AliasVault.Client/Main/Pages/Test/Test2.razor diff --git a/src/AliasVault.WebApp/Program.cs b/src/AliasVault.Client/Program.cs similarity index 97% rename from src/AliasVault.WebApp/Program.cs rename to src/AliasVault.Client/Program.cs index 4ddbd7334..50916c66b 100644 --- a/src/AliasVault.WebApp/Program.cs +++ b/src/AliasVault.Client/Program.cs @@ -5,8 +5,8 @@ // //----------------------------------------------------------------------- -using AliasVault.WebApp; -using AliasVault.WebApp.Providers; +using AliasVault.Client; +using AliasVault.Client.Providers; using Blazored.LocalStorage; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Web; diff --git a/src/AliasVault.WebApp/Properties/launchSettings.json b/src/AliasVault.Client/Properties/launchSettings.json similarity index 100% rename from src/AliasVault.WebApp/Properties/launchSettings.json rename to src/AliasVault.Client/Properties/launchSettings.json diff --git a/src/AliasVault.WebApp/Providers/AuthStateProvider.cs b/src/AliasVault.Client/Providers/AuthStateProvider.cs similarity index 97% rename from src/AliasVault.WebApp/Providers/AuthStateProvider.cs rename to src/AliasVault.Client/Providers/AuthStateProvider.cs index fc1d7e5de..93115923f 100644 --- a/src/AliasVault.WebApp/Providers/AuthStateProvider.cs +++ b/src/AliasVault.Client/Providers/AuthStateProvider.cs @@ -5,11 +5,11 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Providers; +namespace AliasVault.Client.Providers; using System.Security.Claims; using System.Text.Json; -using AliasVault.WebApp.Services.Auth; +using AliasVault.Client.Services.Auth; using Microsoft.AspNetCore.Components.Authorization; /// diff --git a/src/AliasVault.WebApp/Services/Auth/AliasVaultApiHandlerService.cs b/src/AliasVault.Client/Services/Auth/AliasVaultApiHandlerService.cs similarity index 98% rename from src/AliasVault.WebApp/Services/Auth/AliasVaultApiHandlerService.cs rename to src/AliasVault.Client/Services/Auth/AliasVaultApiHandlerService.cs index 26be904ba..1dd8e129d 100644 --- a/src/AliasVault.WebApp/Services/Auth/AliasVaultApiHandlerService.cs +++ b/src/AliasVault.Client/Services/Auth/AliasVaultApiHandlerService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services.Auth; +namespace AliasVault.Client.Services.Auth; using System.Net; using System.Net.Http.Headers; diff --git a/src/AliasVault.WebApp/Services/Auth/AuthService.cs b/src/AliasVault.Client/Services/Auth/AuthService.cs similarity index 99% rename from src/AliasVault.WebApp/Services/Auth/AuthService.cs rename to src/AliasVault.Client/Services/Auth/AuthService.cs index d0dae03ef..9ebaa63d5 100644 --- a/src/AliasVault.WebApp/Services/Auth/AuthService.cs +++ b/src/AliasVault.Client/Services/Auth/AuthService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services.Auth; +namespace AliasVault.Client.Services.Auth; using System.Net.Http.Json; using System.Text.Json; diff --git a/src/AliasVault.WebApp/Services/ClipboardCopyService.cs b/src/AliasVault.Client/Services/ClipboardCopyService.cs similarity index 96% rename from src/AliasVault.WebApp/Services/ClipboardCopyService.cs rename to src/AliasVault.Client/Services/ClipboardCopyService.cs index bd98d854a..e3ff0489f 100644 --- a/src/AliasVault.WebApp/Services/ClipboardCopyService.cs +++ b/src/AliasVault.Client/Services/ClipboardCopyService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services; +namespace AliasVault.Client.Services; /// /// Service to manage the clipboard copy operations across the application. diff --git a/src/AliasVault.WebApp/Services/CredentialService.cs b/src/AliasVault.Client/Services/CredentialService.cs similarity index 99% rename from src/AliasVault.WebApp/Services/CredentialService.cs rename to src/AliasVault.Client/Services/CredentialService.cs index 5eda87933..c067d1367 100644 --- a/src/AliasVault.WebApp/Services/CredentialService.cs +++ b/src/AliasVault.Client/Services/CredentialService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services; +namespace AliasVault.Client.Services; using System; using System.Collections.Generic; @@ -14,8 +14,8 @@ using System.Net.Http; using System.Net.Http.Json; using System.Threading.Tasks; using AliasClientDb; +using AliasVault.Client.Models; using AliasVault.Shared.Models; -using AliasVault.WebApp.Models; using Microsoft.EntityFrameworkCore; using Identity = AliasGenerators.Identity.Models.Identity; diff --git a/src/AliasVault.WebApp/Services/Database/DbService.cs b/src/AliasVault.Client/Services/Database/DbService.cs similarity index 99% rename from src/AliasVault.WebApp/Services/Database/DbService.cs rename to src/AliasVault.Client/Services/Database/DbService.cs index 29a1abb2c..489c58748 100644 --- a/src/AliasVault.WebApp/Services/Database/DbService.cs +++ b/src/AliasVault.Client/Services/Database/DbService.cs @@ -5,13 +5,13 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services.Database; +namespace AliasVault.Client.Services.Database; using System.Data; using System.Net.Http.Json; using AliasClientDb; +using AliasVault.Client.Services.Auth; using AliasVault.Shared.Models.WebApi; -using AliasVault.WebApp.Services.Auth; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.JSInterop; diff --git a/src/AliasVault.WebApp/Services/Database/DbServiceState.cs b/src/AliasVault.Client/Services/Database/DbServiceState.cs similarity index 98% rename from src/AliasVault.WebApp/Services/Database/DbServiceState.cs rename to src/AliasVault.Client/Services/Database/DbServiceState.cs index 90af6ba85..b8a1234a9 100644 --- a/src/AliasVault.WebApp/Services/Database/DbServiceState.cs +++ b/src/AliasVault.Client/Services/Database/DbServiceState.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services.Database; +namespace AliasVault.Client.Services.Database; /// /// Class to manage the state of the AliasClientDbService that others can subscribe to events for. diff --git a/src/AliasVault.WebApp/Services/GlobalLoadingService.cs b/src/AliasVault.Client/Services/GlobalLoadingService.cs similarity index 97% rename from src/AliasVault.WebApp/Services/GlobalLoadingService.cs rename to src/AliasVault.Client/Services/GlobalLoadingService.cs index 95fcf5092..0380319f5 100644 --- a/src/AliasVault.WebApp/Services/GlobalLoadingService.cs +++ b/src/AliasVault.Client/Services/GlobalLoadingService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services; +namespace AliasVault.Client.Services; /// /// Global loading service that can be used to show or hide a global layout loading spinner. diff --git a/src/AliasVault.WebApp/Services/GlobalNotificationService.cs b/src/AliasVault.Client/Services/GlobalNotificationService.cs similarity index 99% rename from src/AliasVault.WebApp/Services/GlobalNotificationService.cs rename to src/AliasVault.Client/Services/GlobalNotificationService.cs index 04cf5f6d6..dbb795d6f 100644 --- a/src/AliasVault.WebApp/Services/GlobalNotificationService.cs +++ b/src/AliasVault.Client/Services/GlobalNotificationService.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.WebApp.Services; +namespace AliasVault.Client.Services; /// /// Handles global notifications that should be displayed to the user, such as success or error messages. These messages diff --git a/src/AliasVault.WebApp/_Imports.razor b/src/AliasVault.Client/_Imports.razor similarity index 50% rename from src/AliasVault.WebApp/_Imports.razor rename to src/AliasVault.Client/_Imports.razor index 89912e41b..5456c412c 100644 --- a/src/AliasVault.WebApp/_Imports.razor +++ b/src/AliasVault.Client/_Imports.razor @@ -9,20 +9,20 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.AspNetCore.Components.WebAssembly.Http @using Microsoft.JSInterop -@using AliasVault.WebApp -@using AliasVault.WebApp.Main.Layout -@using AliasVault.WebApp.Main.Components -@using AliasVault.WebApp.Main.Components.Alerts -@using AliasVault.WebApp.Main.Components.Attachments -@using AliasVault.WebApp.Main.Components.Credentials -@using AliasVault.WebApp.Main.Components.Email -@using AliasVault.WebApp.Main.Components.Forms -@using AliasVault.WebApp.Main.Components.Layout -@using AliasVault.WebApp.Main.Components.Loading -@using AliasVault.WebApp.Main.Models -@using AliasVault.WebApp.Services -@using AliasVault.WebApp.Services.Auth -@using AliasVault.WebApp.Services.Database +@using AliasVault.Client +@using AliasVault.Client.Main.Layout +@using AliasVault.Client.Main.Components +@using AliasVault.Client.Main.Components.Alerts +@using AliasVault.Client.Main.Components.Attachments +@using AliasVault.Client.Main.Components.Credentials +@using AliasVault.Client.Main.Components.Email +@using AliasVault.Client.Main.Components.Forms +@using AliasVault.Client.Main.Components.Layout +@using AliasVault.Client.Main.Components.Loading +@using AliasVault.Client.Main.Models +@using AliasVault.Client.Services +@using AliasVault.Client.Services.Auth +@using AliasVault.Client.Services.Database @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using Blazored.LocalStorage diff --git a/src/AliasVault.WebApp/entrypoint.sh b/src/AliasVault.Client/entrypoint.sh similarity index 100% rename from src/AliasVault.WebApp/entrypoint.sh rename to src/AliasVault.Client/entrypoint.sh diff --git a/src/AliasVault.WebApp/nginx.conf b/src/AliasVault.Client/nginx.conf similarity index 100% rename from src/AliasVault.WebApp/nginx.conf rename to src/AliasVault.Client/nginx.conf diff --git a/src/AliasVault.WebApp/package-lock.json b/src/AliasVault.Client/package-lock.json similarity index 99% rename from src/AliasVault.WebApp/package-lock.json rename to src/AliasVault.Client/package-lock.json index 2cd36d8a4..3c29e29e9 100644 --- a/src/AliasVault.WebApp/package-lock.json +++ b/src/AliasVault.Client/package-lock.json @@ -1,11 +1,11 @@ { - "name": "aliasvault.webapp", + "name": "AliasVault.Client", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aliasvault.webapp", + "name": "AliasVault.Client", "version": "1.0.0", "license": "ISC", "dependencies": { diff --git a/src/AliasVault.WebApp/package.json b/src/AliasVault.Client/package.json similarity index 92% rename from src/AliasVault.WebApp/package.json rename to src/AliasVault.Client/package.json index 4f6bea137..0d9e59c9d 100644 --- a/src/AliasVault.WebApp/package.json +++ b/src/AliasVault.Client/package.json @@ -1,5 +1,5 @@ { - "name": "aliasvault.webapp", + "name": "aliasvault.client", "version": "1.0.0", "description": "", "main": "index.js", diff --git a/src/AliasVault.WebApp/postcss.config.js b/src/AliasVault.Client/postcss.config.js similarity index 100% rename from src/AliasVault.WebApp/postcss.config.js rename to src/AliasVault.Client/postcss.config.js diff --git a/src/AliasVault.WebApp/tailwind.config.js b/src/AliasVault.Client/tailwind.config.js similarity index 100% rename from src/AliasVault.WebApp/tailwind.config.js rename to src/AliasVault.Client/tailwind.config.js diff --git a/src/AliasVault.WebApp/tailwind.css b/src/AliasVault.Client/tailwind.css similarity index 100% rename from src/AliasVault.WebApp/tailwind.css rename to src/AliasVault.Client/tailwind.css diff --git a/src/AliasVault.WebApp/wwwroot/appsettings.json b/src/AliasVault.Client/wwwroot/appsettings.json similarity index 100% rename from src/AliasVault.WebApp/wwwroot/appsettings.json rename to src/AliasVault.Client/wwwroot/appsettings.json diff --git a/src/AliasVault.WebApp/wwwroot/css/app.css b/src/AliasVault.Client/wwwroot/css/app.css similarity index 100% rename from src/AliasVault.WebApp/wwwroot/css/app.css rename to src/AliasVault.Client/wwwroot/css/app.css diff --git a/src/AliasVault.WebApp/wwwroot/css/tailwind.css b/src/AliasVault.Client/wwwroot/css/tailwind.css similarity index 99% rename from src/AliasVault.WebApp/wwwroot/css/tailwind.css rename to src/AliasVault.Client/wwwroot/css/tailwind.css index 94fe579c9..661759319 100644 --- a/src/AliasVault.WebApp/wwwroot/css/tailwind.css +++ b/src/AliasVault.Client/wwwroot/css/tailwind.css @@ -631,19 +631,16 @@ video { grid-column: 1 / -1; } -.m-6 { - margin: 1.5rem; -} - -.m-4 { - margin: 1rem; -} - .mx-3 { margin-left: 0.75rem; margin-right: 0.75rem; } +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + .mx-auto { margin-left: auto; margin-right: auto; @@ -654,11 +651,6 @@ video { margin-bottom: 1rem; } -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - .-ml-1 { margin-left: -0.25rem; } @@ -695,10 +687,6 @@ video { margin-left: 0.75rem; } -.ml-5 { - margin-left: 1.25rem; -} - .ml-auto { margin-left: auto; } @@ -743,14 +731,6 @@ video { margin-top: 2rem; } -.ml-4 { - margin-left: 1rem; -} - -.ml-6 { - margin-left: 1.5rem; -} - .block { display: block; } @@ -791,10 +771,6 @@ video { height: 3rem; } -.h-32 { - height: 8rem; -} - .h-4 { height: 1rem; } diff --git a/src/AliasVault.WebApp/wwwroot/favicon.png b/src/AliasVault.Client/wwwroot/favicon.png similarity index 100% rename from src/AliasVault.WebApp/wwwroot/favicon.png rename to src/AliasVault.Client/wwwroot/favicon.png diff --git a/src/AliasVault.WebApp/wwwroot/horizontal-logo-cropped.png b/src/AliasVault.Client/wwwroot/horizontal-logo-cropped.png similarity index 100% rename from src/AliasVault.WebApp/wwwroot/horizontal-logo-cropped.png rename to src/AliasVault.Client/wwwroot/horizontal-logo-cropped.png diff --git a/src/AliasVault.WebApp/wwwroot/icon-trimmed.png b/src/AliasVault.Client/wwwroot/icon-trimmed.png similarity index 100% rename from src/AliasVault.WebApp/wwwroot/icon-trimmed.png rename to src/AliasVault.Client/wwwroot/icon-trimmed.png diff --git a/src/AliasVault.WebApp/wwwroot/img/avatar.webp b/src/AliasVault.Client/wwwroot/img/avatar.webp similarity index 100% rename from src/AliasVault.WebApp/wwwroot/img/avatar.webp rename to src/AliasVault.Client/wwwroot/img/avatar.webp diff --git a/src/AliasVault.WebApp/wwwroot/img/service-placeholder.webp b/src/AliasVault.Client/wwwroot/img/service-placeholder.webp similarity index 100% rename from src/AliasVault.WebApp/wwwroot/img/service-placeholder.webp rename to src/AliasVault.Client/wwwroot/img/service-placeholder.webp diff --git a/src/AliasVault.WebApp/wwwroot/index.template.html b/src/AliasVault.Client/wwwroot/index.template.html similarity index 98% rename from src/AliasVault.WebApp/wwwroot/index.template.html rename to src/AliasVault.Client/wwwroot/index.template.html index 94371a70f..bf362b642 100644 --- a/src/AliasVault.WebApp/wwwroot/index.template.html +++ b/src/AliasVault.Client/wwwroot/index.template.html @@ -29,7 +29,7 @@ - + diff --git a/src/AliasVault.WebApp/wwwroot/js/cryptoInterop.js b/src/AliasVault.Client/wwwroot/js/cryptoInterop.js similarity index 100% rename from src/AliasVault.WebApp/wwwroot/js/cryptoInterop.js rename to src/AliasVault.Client/wwwroot/js/cryptoInterop.js diff --git a/src/AliasVault.WebApp/wwwroot/js/dark-mode.js b/src/AliasVault.Client/wwwroot/js/dark-mode.js similarity index 100% rename from src/AliasVault.WebApp/wwwroot/js/dark-mode.js rename to src/AliasVault.Client/wwwroot/js/dark-mode.js diff --git a/src/AliasVault.WebApp/wwwroot/js/utilities.js b/src/AliasVault.Client/wwwroot/js/utilities.js similarity index 100% rename from src/AliasVault.WebApp/wwwroot/js/utilities.js rename to src/AliasVault.Client/wwwroot/js/utilities.js diff --git a/src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj b/src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj new file mode 100644 index 000000000..b03fe7973 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + dotnet-AliasVault.SmtpService-eaac287e-32a7-4ff9-bbf9-1925c446ef73 + Linux + ..\..\.. + + + + + + + + + + + + diff --git a/src/Services/AliasVault.SmtpService/Certificates/.gitignore b/src/Services/AliasVault.SmtpService/Certificates/.gitignore new file mode 100644 index 000000000..612424a3c --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Certificates/.gitignore @@ -0,0 +1 @@ +*.pem \ No newline at end of file diff --git a/src/Services/AliasVault.SmtpService/Certificates/README.md b/src/Services/AliasVault.SmtpService/Certificates/README.md new file mode 100644 index 000000000..f06339383 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Certificates/README.md @@ -0,0 +1,6 @@ +Place the certificates for the SMTP service here. +The certificates must be in .p12 format and can be any name. Multiple certificates will be combined into one. + +The certificates must be without password. + +Make sure to restart the SMTP service after adding new certificates. diff --git a/src/Services/AliasVault.SmtpService/Config.cs b/src/Services/AliasVault.SmtpService/Config.cs new file mode 100644 index 000000000..7a6938947 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Config.cs @@ -0,0 +1,25 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) lanedirt. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// +//----------------------------------------------------------------------- + +namespace AliasVault.SmtpService; + +/// +/// Configuration class for the SMTP service with values loaded from appsettings.json file. +/// +public class Config +{ + /// + /// Gets or sets whether TLS is enabled for the SMTP service. + /// + public string SmtpTlsEnabled { get; set; } = "false"; + + /// + /// Gets or sets the domains that the SMTP service is listening for. + /// Domains not in this list will be rejected. + /// + public List AllowedToDomains { get; set; } = []; +} diff --git a/src/Services/AliasVault.SmtpService/Dockerfile b/src/Services/AliasVault.SmtpService/Dockerfile new file mode 100644 index 000000000..3fd572635 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Dockerfile @@ -0,0 +1,23 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base +USER app +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj", "src/Services/AliasVault.SmtpService/"] +RUN dotnet restore "./src/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj" +COPY . . +WORKDIR "/src/src/Services/AliasVault.SmtpService" +RUN dotnet build "./AliasVault.SmtpService.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./AliasVault.SmtpService.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "AliasVault.SmtpService.dll"] \ No newline at end of file diff --git a/src/Services/AliasVault.SmtpService/Program.cs b/src/Services/AliasVault.SmtpService/Program.cs new file mode 100644 index 000000000..7d8f7ddeb --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Program.cs @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) lanedirt. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// +//----------------------------------------------------------------------- + +using AliasVault.SmtpService; +using SmtpServer; +using System.Security.Cryptography.X509Certificates; + +var builder = Host.CreateApplicationBuilder(args); +builder.Services.AddHostedService(); + +// Read settings from appsettings.json. +ConfigurationManager configuration = builder.Configuration; +Config config = configuration.GetSection("Config").Get()!; +builder.Services.AddSingleton(config); + +builder.Services.AddSingleton( + provider => + { + var options = new SmtpServerOptionsBuilder() + .ServerName("aliasvault"); + + if (config.SmtpTlsEnabled == "true") + { + // With TLS and certificate support. + options.Endpoint(builder => + builder + .Port(25, false) + .AllowUnsecureAuthentication(true) + .Certificate(CreateCertificate()) + .SupportedSslProtocols(System.Security.Authentication.SslProtocols.Tls12)) + .Endpoint(builder => + builder + .Port(587, false) + .AllowUnsecureAuthentication(true) + .Certificate(CreateCertificate()) + .SupportedSslProtocols(System.Security.Authentication.SslProtocols.Tls12) + ); + } + else + { + // No TLS + options.Endpoint(builder => + builder + .Port(25, false)) + .Endpoint(builder => + builder + .Port(587, false) + ); + } + + /// + /// Helper method to create an X509Certificate2 object from a PEM file. + /// + static X509Certificate2 CreateCertificate() + { + // Specify the directory where PEM files are stored. + string certificatesDirectory = "Certificates"; + + // Get all PEM files in the directory. + string[] pemFiles = Directory.GetFiles(certificatesDirectory, "*.pem"); + + // Check if there are any PEM files found. + if (pemFiles.Length == 0) + { + throw new FileNotFoundException("No PEM files found in the specified directory."); + } + + // Use the first PEM file found + string firstPemFile = pemFiles[0]; + + // Create an X509Certificate2 object from the PEM file. + var cert = X509Certificate2.CreateFromPemFile(firstPemFile); + + // Convert the X509Certificate2 object to a PFX file then immediately load it again + // NOTE: this is important because saving the object to a PFX file to disk for a brief + // second will allow Windows to correctly load the certificate with the private key. + // If we don't do this, the certificate will be loaded without the private key and + // will throw error on Windows: + // "The TLS server credential's certificate does not have a private key information property attached to it" + cert = new X509Certificate2(cert.Export(X509ContentType.Pfx)); + + return cert; + } + + return new SmtpServer.SmtpServer(options.Build(), provider.GetRequiredService()); + } +); + +var host = builder.Build(); +await host.RunAsync(); diff --git a/src/Services/AliasVault.SmtpService/Properties/launchSettings.json b/src/Services/AliasVault.SmtpService/Properties/launchSettings.json new file mode 100644 index 000000000..a6513c699 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "profiles": { + "AliasVault.SmtpService": { + "commandName": "Project", + "environmentVariables": { + "DOTNET_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true + }, + "Container (Dockerfile)": { + "commandName": "Docker" + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json" +} \ No newline at end of file diff --git a/src/Services/AliasVault.SmtpService/Worker.cs b/src/Services/AliasVault.SmtpService/Worker.cs new file mode 100644 index 000000000..55c56eb4b --- /dev/null +++ b/src/Services/AliasVault.SmtpService/Worker.cs @@ -0,0 +1,22 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) lanedirt. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// +//----------------------------------------------------------------------- + +namespace AliasVault.SmtpService +{ + public class Worker(ILogger logger, SmtpServer.SmtpServer smtpServer) : BackgroundService + { + /// + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + if (logger.IsEnabled(LogLevel.Information)) + { + logger.LogInformation("AliasVault.SmtpService running at: {Time}", DateTimeOffset.Now); + } + await smtpServer.StartAsync(stoppingToken); + } + } +} diff --git a/src/Services/AliasVault.SmtpService/appsettings.Development.json b/src/Services/AliasVault.SmtpService/appsettings.Development.json new file mode 100644 index 000000000..b2dcdb674 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/src/Services/AliasVault.SmtpService/appsettings.json b/src/Services/AliasVault.SmtpService/appsettings.json new file mode 100644 index 000000000..9939a39f3 --- /dev/null +++ b/src/Services/AliasVault.SmtpService/appsettings.json @@ -0,0 +1,14 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "Config": { + "SmtpTlsEnabled": "false", + "AllowedToDomains": [ + "example.tld" + ] + } +} diff --git a/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj b/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj index 4550445e5..e8a408ac1 100644 --- a/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj +++ b/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj @@ -46,7 +46,7 @@ - + diff --git a/src/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs b/src/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs index 95e138e33..4919c836a 100644 --- a/src/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs +++ b/src/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs @@ -27,9 +27,9 @@ public class PlaywrightTest private readonly WebApplicationApiFactoryFixture _apiFactory = new(); /// - /// For starting the WASM WebApp project in-memory. + /// For starting the Client project in-memory. /// - private readonly WebApplicationWasmFactoryFixture _wasmFactory = new(); + private readonly WebApplicationClientFactoryFixture _clientFactory = new(); /// /// Gets the time provider instance for mutating the current WebApi time in tests. @@ -101,7 +101,6 @@ public class PlaywrightTest if (currentRetry >= maxRetries) { Console.WriteLine($"All {maxRetries} attempts failed. Last exception: {ex}"); - throw; } await Task.Delay(500); @@ -121,7 +120,7 @@ public class PlaywrightTest await Browser.CloseAsync(); await _apiFactory.DisposeAsync(); - await _wasmFactory.DisposeAsync(); + await _clientFactory.DisposeAsync(); } /// @@ -291,8 +290,8 @@ public class PlaywrightTest _apiFactory.CreateDefaultClient(); // Start Blazor WASM app out-of-process. - _wasmFactory.HostUrl = "http://localhost:" + appPort; - _wasmFactory.CreateDefaultClient(); + _clientFactory.HostUrl = "http://localhost:" + appPort; + _clientFactory.CreateDefaultClient(); // Set Playwright headless mode based on appsettings.json value. var configuration = new ConfigurationBuilder() diff --git a/src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationWasmFactoryFixture.cs b/src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs similarity index 89% rename from src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationWasmFactoryFixture.cs rename to src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs index a19037b87..8e9cf3251 100644 --- a/src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationWasmFactoryFixture.cs +++ b/src/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs @@ -1,5 +1,5 @@ //----------------------------------------------------------------------- -// +// // Copyright (c) lanedirt. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // @@ -15,7 +15,7 @@ using Microsoft.Extensions.Hosting; /// Web application factory fixture for integration tests. /// /// The entry point. -public class WebApplicationWasmFactoryFixture : WebApplicationFactory +public class WebApplicationClientFactoryFixture : WebApplicationFactory where TEntryPoint : class { /// diff --git a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/AliasVault.E2ETests.WebApp.Server.csproj b/src/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj similarity index 81% rename from src/Tests/Server/AliasVault.E2ETests.WebApp.Server/AliasVault.E2ETests.WebApp.Server.csproj rename to src/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj index 83a2e47fb..1ce08073d 100644 --- a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/AliasVault.E2ETests.WebApp.Server.csproj +++ b/src/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/Program.cs b/src/Tests/Server/AliasVault.E2ETests.Client.Server/Program.cs similarity index 92% rename from src/Tests/Server/AliasVault.E2ETests.WebApp.Server/Program.cs rename to src/Tests/Server/AliasVault.E2ETests.Client.Server/Program.cs index 92cc64791..d9d490aa3 100644 --- a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/Program.cs +++ b/src/Tests/Server/AliasVault.E2ETests.Client.Server/Program.cs @@ -13,7 +13,7 @@ app.MapFallbackToFile("index.html"); await app.RunAsync(); -namespace AliasVault.E2ETests.WebApp.Server +namespace AliasVault.E2ETests.Client.Server { /// /// Explicit program class definition. This is required in order to start the WebAPI project diff --git a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/Properties/launchSettings.json b/src/Tests/Server/AliasVault.E2ETests.Client.Server/Properties/launchSettings.json similarity index 100% rename from src/Tests/Server/AliasVault.E2ETests.WebApp.Server/Properties/launchSettings.json rename to src/Tests/Server/AliasVault.E2ETests.Client.Server/Properties/launchSettings.json diff --git a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/README.md b/src/Tests/Server/AliasVault.E2ETests.Client.Server/README.md similarity index 62% rename from src/Tests/Server/AliasVault.E2ETests.WebApp.Server/README.md rename to src/Tests/Server/AliasVault.E2ETests.Client.Server/README.md index 57dbc54f5..c58658f92 100644 --- a/src/Tests/Server/AliasVault.E2ETests.WebApp.Server/README.md +++ b/src/Tests/Server/AliasVault.E2ETests.Client.Server/README.md @@ -1,2 +1,2 @@ -This project is meant to be used only for the E2E tests of the AliasVault.WebApp project. -This separate project is made to be able to host the AliasVault.WebApp project in-memory via WebApplicationFactory. +This project is meant to be used only for the E2E tests of the AliasVault.Client project. +This separate project is made to be able to host the AliasVault.Client project in-memory via WebApplicationFactory. diff --git a/src/Utilities/Cryptography/Encryption.cs b/src/Utilities/Cryptography/Encryption.cs index e86740b1e..5d1a4c256 100644 --- a/src/Utilities/Cryptography/Encryption.cs +++ b/src/Utilities/Cryptography/Encryption.cs @@ -72,11 +72,11 @@ public static class Encryption public static string Encrypt(string plaintext, byte[] key) { byte[] iv = new byte[12]; - SecureRandom random = new SecureRandom(); + SecureRandom random = new(); random.NextBytes(iv); - GcmBlockCipher gcm = new GcmBlockCipher(new AesEngine()); - AeadParameters parameters = new AeadParameters(new KeyParameter(key), 128, iv, null); + GcmBlockCipher gcm = new(new AesEngine()); + AeadParameters parameters = new(new KeyParameter(key), 128, iv, null); gcm.Init(true, parameters); byte[] plaintextBytes = Encoding.UTF8.GetBytes(plaintext); @@ -107,8 +107,8 @@ public static class Encryption Array.Copy(fullCipher, 0, iv, 0, iv.Length); Array.Copy(fullCipher, iv.Length, cipherBytes, 0, cipherBytes.Length); - GcmBlockCipher gcm = new GcmBlockCipher(new AesEngine()); - AeadParameters parameters = new AeadParameters(new KeyParameter(key), 128, iv, null); + GcmBlockCipher gcm = new(new AesEngine()); + AeadParameters parameters = new(new KeyParameter(key), 128, iv, null); gcm.Init(false, parameters); byte[] plaintextBytes = new byte[gcm.GetOutputSize(cipherBytes.Length)];