From d65db964477ebd21f7fe5b0897e5cd1fb11a0e60 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 22 Jul 2024 23:04:08 +0200 Subject: [PATCH] Fix analyzer issues, update docker compose (#113) --- docker-compose.yml | 2 +- .../Main/Layout/Footer.razor.css | 0 .../Main/Layout/TopMenu.razor.css | 0 .../Pages/Account/Manage/ChangePassword.razor | 1 - .../Main/Pages/Account/Manage/Index.razor | 2 -- src/AliasVault.Admin/Main/Pages/Emails.razor | 7 +++-- src/AliasVault.Admin/Program.cs | 2 +- src/AliasVault.Admin/Services/UserService.cs | 9 ++++--- src/AliasVault.Admin/StartupTasks.cs | 26 +++++++++---------- src/AliasVault.Admin/wwwroot/js/utilities.js | 2 +- .../AliasServerDb/AliasServerDbContext.cs | 18 ++++++------- src/Databases/AliasServerDb/AliasVaultRole.cs | 16 ++++++++++++ src/Utilities/InitializationCLI/Dockerfile | 4 +-- .../InitializationCLI.csproj | 23 ++++++++++++++++ src/Utilities/InitializationCLI/Program.cs | 9 +++++-- 15 files changed, 80 insertions(+), 41 deletions(-) delete mode 100644 src/AliasVault.Admin/Main/Layout/Footer.razor.css delete mode 100644 src/AliasVault.Admin/Main/Layout/TopMenu.razor.css diff --git a/docker-compose.yml b/docker-compose.yml index d698f9783..20963e201 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: image: aliasvault-admin build: context: . - dockerfile: src/AliasVault.Admin2/Dockerfile + dockerfile: src/AliasVault.Admin/Dockerfile ports: - "8080:8082" volumes: diff --git a/src/AliasVault.Admin/Main/Layout/Footer.razor.css b/src/AliasVault.Admin/Main/Layout/Footer.razor.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/AliasVault.Admin/Main/Layout/TopMenu.razor.css b/src/AliasVault.Admin/Main/Layout/TopMenu.razor.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor b/src/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor index 89f513d2e..cbc598ae4 100644 --- a/src/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor +++ b/src/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor @@ -65,7 +65,6 @@ return; } - // await SignInManager.RefreshSignInAsync(user); Logger.LogInformation("User changed their password successfully."); GlobalNotificationService.AddSuccessMessage("Your password has been changed.", true); diff --git a/src/AliasVault.Admin/Main/Pages/Account/Manage/Index.razor b/src/AliasVault.Admin/Main/Pages/Account/Manage/Index.razor index 975574e41..c2a52eb99 100644 --- a/src/AliasVault.Admin/Main/Pages/Account/Manage/Index.razor +++ b/src/AliasVault.Admin/Main/Pages/Account/Manage/Index.razor @@ -52,12 +52,10 @@ var setPhoneResult = await UserManager.SetPhoneNumberAsync(UserService.User(), Input.PhoneNumber); if (!setPhoneResult.Succeeded) { - // TODO: show error that phone number could not be set, use proper form validation? GlobalNotificationService.AddErrorMessage("Phone number could not be set", true); } } - // await SignInManager.RefreshSignInAsync(UserService.User()); GlobalNotificationService.AddSuccessMessage("Your profile has been updated", true); } diff --git a/src/AliasVault.Admin/Main/Pages/Emails.razor b/src/AliasVault.Admin/Main/Pages/Emails.razor index dc93d1cbd..9d5ee47b2 100644 --- a/src/AliasVault.Admin/Main/Pages/Emails.razor +++ b/src/AliasVault.Admin/Main/Pages/Emails.razor @@ -70,17 +70,16 @@ else { if (firstRender) { - await LoadAliasesAsync(); + await LoadEmailsAsync(); } } - private async Task LoadAliasesAsync() + private async Task LoadEmailsAsync() { IsLoading = true; StateHasChanged(); - // Load the aliases from the database. - var user = UserService.User(); + // Load the emails from the database. EmailList = await DbContext.Emails .OrderByDescending(x => x.DateSystem) .ToListAsync(); diff --git a/src/AliasVault.Admin/Program.cs b/src/AliasVault.Admin/Program.cs index 759c2d29f..6e23bb700 100644 --- a/src/AliasVault.Admin/Program.cs +++ b/src/AliasVault.Admin/Program.cs @@ -124,4 +124,4 @@ using (var scope = app.Services.CreateScope()) await StartupTasks.SetAdminUser(scope.ServiceProvider); } -app.Run(); +await app.RunAsync(); diff --git a/src/AliasVault.Admin/Services/UserService.cs b/src/AliasVault.Admin/Services/UserService.cs index daae5c732..365273e9a 100644 --- a/src/AliasVault.Admin/Services/UserService.cs +++ b/src/AliasVault.Admin/Services/UserService.cs @@ -26,7 +26,7 @@ public class UserService(AliasServerDbContext dbContext, UserManager /// /// The roles of the current user. /// - private IList _userRoles = new List(); + private List _userRoles = []; /// /// Whether the current user is an admin or not. @@ -64,7 +64,7 @@ public class UserService(AliasServerDbContext dbContext, UserManager var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) { - throw new Exception($"User with id {userId} not found."); + throw new ArgumentException($"User with id {userId} not found."); } return user; @@ -78,7 +78,7 @@ public class UserService(AliasServerDbContext dbContext, UserManager { if (_user == null) { - throw new Exception("Trying to access User object which is null."); + throw new ArgumentException("Trying to access User object which is null."); } return _user; @@ -110,7 +110,8 @@ public class UserService(AliasServerDbContext dbContext, UserManager _user = user; // Load all roles for current user. - _userRoles = await userManager.GetRolesAsync(User()); + var roles = await userManager.GetRolesAsync(User()); + _userRoles = roles.ToList(); // Define if current user is admin. _isAdmin = _userRoles.Contains(AdminRole); diff --git a/src/AliasVault.Admin/StartupTasks.cs b/src/AliasVault.Admin/StartupTasks.cs index a8be8af14..7ca0b4e31 100644 --- a/src/AliasVault.Admin/StartupTasks.cs +++ b/src/AliasVault.Admin/StartupTasks.cs @@ -58,25 +58,23 @@ public static class StartupTasks } else { - // Check if the password hash is correct, if not, update it to the .env value. - if (adminUser.PasswordHash != config.AdminPasswordHash) + // Check if the password hash is different AND the password in .env file is newer than the password of user. + // If so, update the password hash of the user in the database so it matches the one in the .env file. + if (adminUser.PasswordHash != config.AdminPasswordHash && config.LastPasswordChanged > adminUser.LastPasswordChanged) { - if (config.LastPasswordChanged > adminUser.LastPasswordChanged) - { - // The password has been changed in the .env file, update the user's password hash. - adminUser.PasswordHash = config.AdminPasswordHash; - adminUser.LastPasswordChanged = DateTime.UtcNow; + // The password has been changed in the .env file, update the user's password hash. + adminUser.PasswordHash = config.AdminPasswordHash; + adminUser.LastPasswordChanged = DateTime.UtcNow; - // Reset 2FA settings - adminUser.TwoFactorEnabled = false; + // Reset 2FA settings + adminUser.TwoFactorEnabled = false; - // Clear existing recovery codes - await userManager.GenerateNewTwoFactorRecoveryCodesAsync(adminUser, 0); + // Clear existing recovery codes + await userManager.GenerateNewTwoFactorRecoveryCodesAsync(adminUser, 0); - await userManager.UpdateAsync(adminUser); + await userManager.UpdateAsync(adminUser); - Console.WriteLine("Admin password hash updated."); - } + Console.WriteLine("Admin password hash updated."); } } } diff --git a/src/AliasVault.Admin/wwwroot/js/utilities.js b/src/AliasVault.Admin/wwwroot/js/utilities.js index af70e5a83..a0e828de5 100644 --- a/src/AliasVault.Admin/wwwroot/js/utilities.js +++ b/src/AliasVault.Admin/wwwroot/js/utilities.js @@ -40,7 +40,7 @@ function generateQrCode(id) { element.appendChild(qrContainer); // Initialize QRCode object - const qrcode = new QRCode(qrContainer, { + new QRCode(qrContainer, { text: dataUrl, width: 256, height: 256, diff --git a/src/Databases/AliasServerDb/AliasServerDbContext.cs b/src/Databases/AliasServerDb/AliasServerDbContext.cs index 58baca933..b0d24b91f 100644 --- a/src/Databases/AliasServerDb/AliasServerDbContext.cs +++ b/src/Databases/AliasServerDb/AliasServerDbContext.cs @@ -102,11 +102,11 @@ public class AliasServerDbContext : DbContext /// /// The OnModelCreating method. /// - /// ModelBuilder instance. - protected override void OnModelCreating(ModelBuilder builder) + /// ModelBuilder instance. + protected override void OnModelCreating(ModelBuilder modelBuilder) { - base.OnModelCreating(builder); - foreach (var entity in builder.Model.GetEntityTypes()) + base.OnModelCreating(modelBuilder); + foreach (var entity in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entity.GetProperties()) { @@ -122,31 +122,31 @@ public class AliasServerDbContext : DbContext } // Configure AspNetIdentity tables manually. - builder.Entity>(entity => + modelBuilder.Entity>(entity => { entity.HasKey(r => new { r.UserId, r.RoleId }); entity.ToTable("UserRoles"); }); - builder.Entity>(entity => + modelBuilder.Entity>(entity => { entity.HasKey(c => c.Id); entity.ToTable("UserClaims"); }); - builder.Entity>(entity => + modelBuilder.Entity>(entity => { entity.HasKey(l => new { l.LoginProvider, l.ProviderKey }); entity.ToTable("UserLogins"); }); - builder.Entity>(entity => + modelBuilder.Entity>(entity => { entity.HasKey(rc => rc.Id); entity.ToTable("RoleClaims"); }); - builder.Entity>(entity => + modelBuilder.Entity>(entity => { entity.HasKey(t => new { t.UserId, t.LoginProvider, t.Name }); entity.ToTable("UserTokens"); diff --git a/src/Databases/AliasServerDb/AliasVaultRole.cs b/src/Databases/AliasServerDb/AliasVaultRole.cs index b2758ca4c..f36e2af3f 100644 --- a/src/Databases/AliasServerDb/AliasVaultRole.cs +++ b/src/Databases/AliasServerDb/AliasVaultRole.cs @@ -14,4 +14,20 @@ using Microsoft.AspNetCore.Identity; /// public class AliasVaultRole : IdentityRole { + /// + /// Initializes a new instance of the class. + /// + public AliasVaultRole() + : base() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Role name. + public AliasVaultRole(string roleName) + : base(roleName) + { + } } diff --git a/src/Utilities/InitializationCLI/Dockerfile b/src/Utilities/InitializationCLI/Dockerfile index 82bd26480..6daa6b86f 100644 --- a/src/Utilities/InitializationCLI/Dockerfile +++ b/src/Utilities/InitializationCLI/Dockerfile @@ -14,11 +14,11 @@ RUN dotnet restore "src/Utilities/InitializationCLI/InitializationCLI.csproj" COPY . . # Build the project -RUN dotnet build "src/Utilities/InitializationCLI/InitializationCLI.csproj" -c $BUILD_CONFIGURATION -o /app/build +RUN dotnet build "src/Utilities/InitializationCLI/InitializationCLI.csproj" -c "$BUILD_CONFIGURATION" -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release -RUN dotnet publish "src/Utilities/InitializationCLI/InitializationCLI.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false +RUN dotnet publish "src/Utilities/InitializationCLI/InitializationCLI.csproj" -c "$BUILD_CONFIGURATION" -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app diff --git a/src/Utilities/InitializationCLI/InitializationCLI.csproj b/src/Utilities/InitializationCLI/InitializationCLI.csproj index 7725161a9..009d3ac39 100644 --- a/src/Utilities/InitializationCLI/InitializationCLI.csproj +++ b/src/Utilities/InitializationCLI/InitializationCLI.csproj @@ -7,6 +7,16 @@ enable + + bin\Debug\net8.0\InitializationCLI.xml + true + + + + bin\Release\net8.0\InitializationCLI.xml + true + + .dockerignore @@ -18,4 +28,17 @@ + + + stylecop.json + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/Utilities/InitializationCLI/Program.cs b/src/Utilities/InitializationCLI/Program.cs index 5d744bdc3..39b7ad8ce 100644 --- a/src/Utilities/InitializationCLI/Program.cs +++ b/src/Utilities/InitializationCLI/Program.cs @@ -1,5 +1,10 @@ -// See https://aka.ms/new-console-template for more information -using System; +//----------------------------------------------------------------------- +// +// Copyright (c) lanedirt. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// +//----------------------------------------------------------------------- + using AliasServerDb; using Microsoft.AspNetCore.Identity;