From c5a3ba2b40ab47d4b48cd0eba8e5da91a6279878 Mon Sep 17 00:00:00 2001 From: Henry Date: Sun, 4 Jan 2026 17:58:26 +0100 Subject: [PATCH] feat: Rework first account to be register is admin and no Standard users get created --- CouchLog/.editorconfig | 4 + .../Components/Account/Pages/Register.razor | 58 +- .../Pages/CouchLogSettings.razor | 51 + .../AdminSettings/Pages/UserManagement.razor | 1 - .../Shared/AdminSettingsNavMenu.razor | 6 +- CouchLog/Components/Layout/NavMenu.razor | 14 +- CouchLog/Components/Pages/GlobalList.razor | 7 +- CouchLog/CouchLog.sln | 2 +- CouchLog/Data/ApplicationDbContext.cs | 4 + CouchLog/Data/DatabaseModels/Private/Label.cs | 2 +- .../Settings/AccountsSettings.cs | 13 + .../DatabaseModels/Settings/CouchLogState.cs | 9 + .../20251229004324_CouchLogState.Designer.cs | 978 +++++++++++++++++ .../20251229004324_CouchLogState.cs | 36 + ...0260103202104_AccountsSettings.Designer.cs | 992 ++++++++++++++++++ .../20260103202104_AccountsSettings.cs | 34 + ...4151950_FixAccountsSettingsKey.Designer.cs | 992 ++++++++++++++++++ .../20260104151950_FixAccountsSettingsKey.cs | 22 + .../ApplicationDbContextModelSnapshot.cs | 31 + CouchLog/OnStartUp.cs | 82 +- CouchLog/Program.cs | 89 +- 21 files changed, 3276 insertions(+), 151 deletions(-) create mode 100644 CouchLog/.editorconfig create mode 100644 CouchLog/Components/AdminSettings/Pages/CouchLogSettings.razor create mode 100644 CouchLog/Data/DatabaseModels/Settings/AccountsSettings.cs create mode 100644 CouchLog/Data/DatabaseModels/Settings/CouchLogState.cs create mode 100644 CouchLog/Migrations/20251229004324_CouchLogState.Designer.cs create mode 100644 CouchLog/Migrations/20251229004324_CouchLogState.cs create mode 100644 CouchLog/Migrations/20260103202104_AccountsSettings.Designer.cs create mode 100644 CouchLog/Migrations/20260103202104_AccountsSettings.cs create mode 100644 CouchLog/Migrations/20260104151950_FixAccountsSettingsKey.Designer.cs create mode 100644 CouchLog/Migrations/20260104151950_FixAccountsSettingsKey.cs diff --git a/CouchLog/.editorconfig b/CouchLog/.editorconfig new file mode 100644 index 0000000..0a700b8 --- /dev/null +++ b/CouchLog/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# IDE0130: Namespace does not match folder structure +dotnet_diagnostic.IDE0130.severity = none diff --git a/CouchLog/Components/Account/Pages/Register.razor b/CouchLog/Components/Account/Pages/Register.razor index 8b76b61..f5e6afc 100644 --- a/CouchLog/Components/Account/Pages/Register.razor +++ b/CouchLog/Components/Account/Pages/Register.razor @@ -10,10 +10,10 @@ @inject UserManager UserManager @inject IUserStore UserStore @inject SignInManager SignInManager -@inject IEmailSender EmailSender @inject ILogger Logger @inject NavigationManager NavigationManager @inject IdentityRedirectManager RedirectManager +@inject ApplicationDbContext CouchLogDB Register @@ -28,9 +28,9 @@
- - - + + +
@@ -67,11 +67,19 @@ public async Task RegisterUser(EditContext editContext) { + if(!CouchLogDB.AccountsSettings.First().IsRegistrationAllowed) + { + identityErrors = new[] + { + new IdentityError { Description = "Registration is deactivated" } + }; + return; + } + var user = CreateUser(); - await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); - var emailStore = GetEmailStore(); - await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); + await UserStore.SetUserNameAsync(user, Input.Username, CancellationToken.None); + user.EmailConfirmed = true; var result = await UserManager.CreateAsync(user, Input.Password); if (!result.Succeeded) @@ -80,23 +88,24 @@ return; } - Logger.LogInformation("User created a new account with password."); - - var userId = await UserManager.GetUserIdAsync(user); - var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); - code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); - var callbackUrl = NavigationManager.GetUriWithQueryParameters( - NavigationManager.ToAbsoluteUri("Account/ConfirmEmail").AbsoluteUri, - new Dictionary { ["userId"] = userId, ["code"] = code, ["returnUrl"] = ReturnUrl }); - - await EmailSender.SendConfirmationLinkAsync(user, Input.Email, HtmlEncoder.Default.Encode(callbackUrl)); - - if (UserManager.Options.SignIn.RequireConfirmedAccount) + if(CouchLogDB.CouchLogState.Count() == 0) { - RedirectManager.RedirectTo( - "Account/RegisterConfirmation", - new() { ["email"] = Input.Email, ["returnUrl"] = ReturnUrl }); + await UserManager.AddToRoleAsync(user, "Admin"); + await CouchLogDB.CouchLogState.AddAsync(new CouchLogState + { + Id = 1, + InitializationDate = DateTime.Now, + IsInitialized = true + }); } + else + { + await UserManager.AddToRoleAsync(user, "User"); + } + + await CouchLogDB.SaveChangesAsync(); + + Logger.LogInformation("User created a new account with password."); await SignInManager.SignInAsync(user, isPersistent: false); RedirectManager.RedirectTo(ReturnUrl); @@ -127,9 +136,8 @@ private sealed class InputModel { [Required] - [EmailAddress] - [Display(Name = "Email")] - public string Email { get; set; } = ""; + [Display(Name = "Username")] + public string Username { get; set; } = ""; [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] diff --git a/CouchLog/Components/AdminSettings/Pages/CouchLogSettings.razor b/CouchLog/Components/AdminSettings/Pages/CouchLogSettings.razor new file mode 100644 index 0000000..ef8642e --- /dev/null +++ b/CouchLog/Components/AdminSettings/Pages/CouchLogSettings.razor @@ -0,0 +1,51 @@ +@page "/AdminSettings/CouchLogSettings" +@rendermode InteractiveServer + +@using CouchLog.Data +@using Microsoft.EntityFrameworkCore +@using Microsoft.AspNetCore.Components.Forms + +@inject ApplicationDbContext CouchLogDB + +

CouchLog Settings

+ +@if (accountsSettings is null) +{ +

Lade Einstellungen…

+} +else +{ + +
+ + + + + +
+
+} + +@code { + private AccountsSettings? accountsSettings; + + protected override async Task OnInitializedAsync() + { + accountsSettings = await CouchLogDB.AccountsSettings.FirstAsync(); + } + + private async Task OnRegistrationChanged(bool value) + { + accountsSettings!.IsRegistrationAllowed = value; + + CouchLogDB.AccountsSettings.Update(accountsSettings); + await CouchLogDB.SaveChangesAsync(); + } +} diff --git a/CouchLog/Components/AdminSettings/Pages/UserManagement.razor b/CouchLog/Components/AdminSettings/Pages/UserManagement.razor index 9e72063..59b84bc 100644 --- a/CouchLog/Components/AdminSettings/Pages/UserManagement.razor +++ b/CouchLog/Components/AdminSettings/Pages/UserManagement.razor @@ -9,7 +9,6 @@ @inject ApplicationDbContext CouchLogDB @inject UserManager UserManager -@inject RoleManager RoleManager @inject AuthenticationStateProvider AuthenticationStateProvider @inject NavigationManager NavigationManager diff --git a/CouchLog/Components/AdminSettings/Shared/AdminSettingsNavMenu.razor b/CouchLog/Components/AdminSettings/Shared/AdminSettingsNavMenu.razor index 3202bbf..3d71bbe 100644 --- a/CouchLog/Components/AdminSettings/Shared/AdminSettingsNavMenu.razor +++ b/CouchLog/Components/AdminSettings/Shared/AdminSettingsNavMenu.razor @@ -4,6 +4,9 @@ @inject SignInManager SignInManager \ No newline at end of file diff --git a/CouchLog/Components/Layout/NavMenu.razor b/CouchLog/Components/Layout/NavMenu.razor index 8b0d37e..cf23b9d 100644 --- a/CouchLog/Components/Layout/NavMenu.razor +++ b/CouchLog/Components/Layout/NavMenu.razor @@ -5,6 +5,7 @@ @inject NavigationManager NavigationManager @inject AuthenticationStateProvider AuthenticationStateProvider @inject UserManager UserManager +@inject ApplicationDbContext CouchLogDB