From 712b880ab2ad0b5ff226d61aec98dc4b9d83cd14 Mon Sep 17 00:00:00 2001 From: Maksym Sadovnychyy Date: Sun, 9 Nov 2025 15:54:47 +0100 Subject: [PATCH] (refactor): code cleanup --- src/LetsEncrypt/Entities/Jws/Jwk.cs | 2 ++ src/LetsEncrypt/Entities/Jws/JwsMessage.cs | 5 ++-- .../Entities/LetsEncrypt/CachedHostname.cs | 24 +++++++-------- .../Entities/LetsEncrypt/RegistrationCache.cs | 2 +- .../Entities/LetsEncrypt/RevokeReason.cs | 28 +++++++----------- src/LetsEncrypt/Entities/LetsEncrypt/State.cs | 26 +++++++---------- .../Exceptions/LetsEncrytException.cs | 5 ++-- .../Extensions/ServiceCollectionExtensions.cs | 4 +-- src/LetsEncrypt/LetsEncryptConfiguration.cs | 29 ++++++------------- src/LetsEncrypt/Services/JwsService.cs | 4 +-- .../Services/LetsEncryptService.cs | 17 +++++------ src/LetsEncryptServer/Domain/Settings.cs | 18 ++++-------- src/LetsEncryptServer/Domain/User.cs | 12 ++------ .../Services/IdentityService.cs | 13 ++++----- .../Services/SettingsService.cs | 19 ++++++------ 15 files changed, 86 insertions(+), 122 deletions(-) diff --git a/src/LetsEncrypt/Entities/Jws/Jwk.cs b/src/LetsEncrypt/Entities/Jws/Jwk.cs index 0907727..0601c59 100644 --- a/src/LetsEncrypt/Entities/Jws/Jwk.cs +++ b/src/LetsEncrypt/Entities/Jws/Jwk.cs @@ -2,7 +2,9 @@ using System.Text.Json.Serialization; + namespace MaksIT.LetsEncrypt.Entities.Jws; + public class Jwk { /// /// "kty" (Key Type) Parameter diff --git a/src/LetsEncrypt/Entities/Jws/JwsMessage.cs b/src/LetsEncrypt/Entities/Jws/JwsMessage.cs index 4726d5e..ee964a5 100644 --- a/src/LetsEncrypt/Entities/Jws/JwsMessage.cs +++ b/src/LetsEncrypt/Entities/Jws/JwsMessage.cs @@ -1,9 +1,8 @@ -using System; -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; + namespace MaksIT.LetsEncrypt.Entities.Jws; - public class JwsMessage { public string? Protected { get; set; } diff --git a/src/LetsEncrypt/Entities/LetsEncrypt/CachedHostname.cs b/src/LetsEncrypt/Entities/LetsEncrypt/CachedHostname.cs index 2aba48e..881062d 100644 --- a/src/LetsEncrypt/Entities/LetsEncrypt/CachedHostname.cs +++ b/src/LetsEncrypt/Entities/LetsEncrypt/CachedHostname.cs @@ -1,16 +1,16 @@ -namespace MaksIT.LetsEncrypt.Entities { - public class CachedHostname { - public string Hostname { get; set; } - public DateTime Expires { get; set; } - public bool IsUpcomingExpire { get; set; } +namespace MaksIT.LetsEncrypt.Entities; - public bool IsDisabled { get; set; } +public class CachedHostname { + public string Hostname { get; set; } + public DateTime Expires { get; set; } + public bool IsUpcomingExpire { get; set; } - public CachedHostname(string hostname, DateTime expires, bool isUpcomingExpire, bool isDisabled) { - Hostname = hostname; - Expires = expires; - IsUpcomingExpire = isUpcomingExpire; - IsDisabled = isDisabled; - } + public bool IsDisabled { get; set; } + + public CachedHostname(string hostname, DateTime expires, bool isUpcomingExpire, bool isDisabled) { + Hostname = hostname; + Expires = expires; + IsUpcomingExpire = isUpcomingExpire; + IsDisabled = isDisabled; } } diff --git a/src/LetsEncrypt/Entities/LetsEncrypt/RegistrationCache.cs b/src/LetsEncrypt/Entities/LetsEncrypt/RegistrationCache.cs index 5e8dd5f..a2ce0c5 100644 --- a/src/LetsEncrypt/Entities/LetsEncrypt/RegistrationCache.cs +++ b/src/LetsEncrypt/Entities/LetsEncrypt/RegistrationCache.cs @@ -2,9 +2,9 @@ using System.Text; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; - using MaksIT.LetsEncrypt.Entities.Jws; + namespace MaksIT.LetsEncrypt.Entities; public class RegistrationCache { diff --git a/src/LetsEncrypt/Entities/LetsEncrypt/RevokeReason.cs b/src/LetsEncrypt/Entities/LetsEncrypt/RevokeReason.cs index 7ca53cd..6eb0afb 100644 --- a/src/LetsEncrypt/Entities/LetsEncrypt/RevokeReason.cs +++ b/src/LetsEncrypt/Entities/LetsEncrypt/RevokeReason.cs @@ -1,18 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace MaksIT.LetsEncrypt.Entities.LetsEncrypt; -namespace MaksIT.LetsEncrypt.Entities.LetsEncrypt { - public enum RevokeReason { - Unspecified = 0, - KeyCompromise = 1, - CaCompromise = 2, - AffiliationChanged = 3, - Superseded = 4, - CessationOfOperation = 5, - PrivilegeWithdrawn = 6, - AaCompromise = 7 - } -} +public enum RevokeReason { + Unspecified = 0, + KeyCompromise = 1, + CaCompromise = 2, + AffiliationChanged = 3, + Superseded = 4, + CessationOfOperation = 5, + PrivilegeWithdrawn = 6, + AaCompromise = 7 +} \ No newline at end of file diff --git a/src/LetsEncrypt/Entities/LetsEncrypt/State.cs b/src/LetsEncrypt/Entities/LetsEncrypt/State.cs index e936cb5..d55db08 100644 --- a/src/LetsEncrypt/Entities/LetsEncrypt/State.cs +++ b/src/LetsEncrypt/Entities/LetsEncrypt/State.cs @@ -1,19 +1,15 @@ using MaksIT.LetsEncrypt.Models.Responses; using MaksIT.LetsEncrypt.Services; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace MaksIT.LetsEncrypt.Entities.LetsEncrypt { - public class State { - public bool IsStaging { get; set; } - public AcmeDirectory? Directory { get; set; } - public JwsService? JwsService { get; set; } - public Order? CurrentOrder { get; set; } - public List Challenges { get; } = new List(); - public string? Nonce { get; set; } - public RegistrationCache? Cache { get; set; } - } + +namespace MaksIT.LetsEncrypt.Entities.LetsEncrypt; + +public class State { + public bool IsStaging { get; set; } + public AcmeDirectory? Directory { get; set; } + public JwsService? JwsService { get; set; } + public Order? CurrentOrder { get; set; } + public List Challenges { get; } = new List(); + public string? Nonce { get; set; } + public RegistrationCache? Cache { get; set; } } diff --git a/src/LetsEncrypt/Exceptions/LetsEncrytException.cs b/src/LetsEncrypt/Exceptions/LetsEncrytException.cs index 184dbb9..f91c967 100644 --- a/src/LetsEncrypt/Exceptions/LetsEncrytException.cs +++ b/src/LetsEncrypt/Exceptions/LetsEncrytException.cs @@ -1,7 +1,8 @@ -using MaksIT.Core.Extensions; -using MaksIT.LetsEncrypt.Models.Responses; +using MaksIT.LetsEncrypt.Models.Responses; + namespace MaksIT.LetsEncrypt.Exceptions; + public class LetsEncrytException : Exception { public Problem? Problem { get; } diff --git a/src/LetsEncrypt/Extensions/ServiceCollectionExtensions.cs b/src/LetsEncrypt/Extensions/ServiceCollectionExtensions.cs index bca028b..6f26caf 100644 --- a/src/LetsEncrypt/Extensions/ServiceCollectionExtensions.cs +++ b/src/LetsEncrypt/Extensions/ServiceCollectionExtensions.cs @@ -1,9 +1,9 @@ using Microsoft.Extensions.DependencyInjection; - using MaksIT.LetsEncrypt.Services; -using Microsoft.Extensions.Configuration; + namespace MaksIT.LetsEncrypt.Extensions; + public static class ServiceCollectionExtensions { public static void RegisterLetsEncrypt(this IServiceCollection services, ILetsEncryptConfiguration appSettings) { diff --git a/src/LetsEncrypt/LetsEncryptConfiguration.cs b/src/LetsEncrypt/LetsEncryptConfiguration.cs index db2e5b7..338ed00 100644 --- a/src/LetsEncrypt/LetsEncryptConfiguration.cs +++ b/src/LetsEncrypt/LetsEncryptConfiguration.cs @@ -1,22 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MaksIT.LetsEncrypt { - - - public interface ILetsEncryptConfiguration { - string Production { get; set; } - string Staging { get; set; } - } - - - public class LetsEncryptConfiguration : ILetsEncryptConfiguration { - public required string Production { get; set; } - public required string Staging { get; set; } - } - +namespace MaksIT.LetsEncrypt; +public interface ILetsEncryptConfiguration { + string Production { get; set; } + string Staging { get; set; } +} + +public class LetsEncryptConfiguration : ILetsEncryptConfiguration { + public required string Production { get; set; } + public required string Staging { get; set; } } diff --git a/src/LetsEncrypt/Services/JwsService.cs b/src/LetsEncrypt/Services/JwsService.cs index 73720f5..1fea520 100644 --- a/src/LetsEncrypt/Services/JwsService.cs +++ b/src/LetsEncrypt/Services/JwsService.cs @@ -3,13 +3,11 @@ * https://tools.ietf.org/html/rfc4648#section-5 */ - using System.Text; using System.Security.Cryptography; - +using MaksIT.Core.Extensions; using MaksIT.LetsEncrypt.Entities.Jws; -using MaksIT.Core.Extensions; namespace MaksIT.LetsEncrypt.Services; diff --git a/src/LetsEncrypt/Services/LetsEncryptService.cs b/src/LetsEncrypt/Services/LetsEncryptService.cs index ed3b511..a31e9fb 100644 --- a/src/LetsEncrypt/Services/LetsEncryptService.cs +++ b/src/LetsEncrypt/Services/LetsEncryptService.cs @@ -3,7 +3,13 @@ * https://datatracker.ietf.org/doc/html/draft-ietf-acme-acme-12 */ - +using System.Text; +using System.Net.Http.Headers; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Logging; +using MaksIT.Results; using MaksIT.Core.Extensions; using MaksIT.LetsEncrypt.Entities; using MaksIT.LetsEncrypt.Entities.Jws; @@ -12,17 +18,10 @@ using MaksIT.LetsEncrypt.Exceptions; using MaksIT.LetsEncrypt.Models.Interfaces; using MaksIT.LetsEncrypt.Models.Requests; using MaksIT.LetsEncrypt.Models.Responses; -using MaksIT.Results; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Logging; -using System.Net.Http.Headers; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Text; + namespace MaksIT.LetsEncrypt.Services; - public interface ILetsEncryptService { Task ConfigureClient(Guid sessionId, bool isStaging); Task Init(Guid sessionId,Guid accountId, string description, string[] contacts, RegistrationCache? registrationCache); diff --git a/src/LetsEncryptServer/Domain/Settings.cs b/src/LetsEncryptServer/Domain/Settings.cs index 00f9bd4..7318a7a 100644 --- a/src/LetsEncryptServer/Domain/Settings.cs +++ b/src/LetsEncryptServer/Domain/Settings.cs @@ -11,7 +11,8 @@ public class Settings : DomainObjectBase { public Settings() { } public Result Initialize(string pepper) { - var userResult = new User("admin") + var userResult = new User() + .SetName("admin") .SetPassword("password", pepper); if (!userResult.IsSuccess || userResult.Value == null) { @@ -47,8 +48,9 @@ public class Settings : DomainObjectBase { return Result.Ok(user); } - public Result AddUser(string name, string password, string pepper) { - var setPasswordResult = new User(name) + public Result CreateUser(string name, string password, string pepper) { + var setPasswordResult = new User() + .SetName(name) .SetPassword(password, pepper); if (!setPasswordResult.IsSuccess || setPasswordResult.Value == null) @@ -75,16 +77,6 @@ public class Settings : DomainObjectBase { return this; } - - public Result RemoveUser(string name) { - if (Users.Any(x => x.Name == name)) { - Users = [.. Users.Where(u => u.Name != name)]; - return Result.Ok(this); - } - - return Result.NotFound(null, "User not found."); - } - public Result RemoveUser(Guid userId) { var user = Users.FirstOrDefault(u => u.Id == userId); if (user == null) diff --git a/src/LetsEncryptServer/Domain/User.cs b/src/LetsEncryptServer/Domain/User.cs index ce263ef..432f8f2 100644 --- a/src/LetsEncryptServer/Domain/User.cs +++ b/src/LetsEncryptServer/Domain/User.cs @@ -5,21 +5,15 @@ using MaksIT.Results; namespace MaksIT.LetsEncryptServer.Domain; public class User( - Guid id, - string name + Guid id ) : DomainDocumentBase(id) { - public string Name { get; private set; } = name; + public string Name { get; private set; } = string.Empty; public string Salt { get; private set; } = string.Empty; public string Hash { get; private set; } = string.Empty; public List JwtTokens { get; private set; } = []; public DateTime LastLogin { get; private set; } - public User( - string name - ) : this( - Guid.NewGuid(), - name - ) { } + public User() : this(Guid.NewGuid()) { } /// /// Change user name diff --git a/src/LetsEncryptServer/Services/IdentityService.cs b/src/LetsEncryptServer/Services/IdentityService.cs index e85da83..b619e71 100644 --- a/src/LetsEncryptServer/Services/IdentityService.cs +++ b/src/LetsEncryptServer/Services/IdentityService.cs @@ -25,12 +25,11 @@ public class IdentityService( private readonly Configuration _appSettings = appsettings.Value; - private readonly ISettingsService _settingsService = settingsService; #region Login/Refresh/Logout public async Task> LoginAsync(LoginRequest requestData) { - var loadSettingsResult = await _settingsService.LoadAsync(); + var loadSettingsResult = await settingsService.LoadAsync(); if (!loadSettingsResult.IsSuccess || loadSettingsResult.Value == null) { return loadSettingsResult.ToResultOfType(_ => null); } @@ -73,7 +72,7 @@ public class IdentityService( user.SetLastLogin(); settings.UpsertUser(user); - var saveSettingsResult = await _settingsService.SaveAsync(settings); + var saveSettingsResult = await settingsService.SaveAsync(settings); if (!saveSettingsResult.IsSuccess) return saveSettingsResult.ToResultOfType(default); @@ -89,7 +88,7 @@ public class IdentityService( } public async Task> RefreshTokenAsync(RefreshTokenRequest requestData) { - var loadSettingsResult = await _settingsService.LoadAsync(); + var loadSettingsResult = await settingsService.LoadAsync(); if (!loadSettingsResult.IsSuccess || loadSettingsResult.Value == null) return loadSettingsResult.ToResultOfType(_ => null); @@ -109,7 +108,7 @@ public class IdentityService( user.SetLastLogin(); settings.UpsertUser(user); - var saveResult = await _settingsService.SaveAsync(settings); + var saveResult = await settingsService.SaveAsync(settings); if (!saveResult.IsSuccess) return saveResult.ToResultOfType(default); @@ -155,7 +154,7 @@ public class IdentityService( user.SetLastLogin(); settings.UpsertUser(user); - var writeResult = await _settingsService.SaveAsync(settings); + var writeResult = await settingsService.SaveAsync(settings); if (!writeResult.IsSuccess) return writeResult.ToResultOfType(default); @@ -169,7 +168,7 @@ public class IdentityService( } public async Task Logout(LogoutRequest requestData) { - var loadSettingsResult = await _settingsService.LoadAsync(); + var loadSettingsResult = await settingsService.LoadAsync(); if (!loadSettingsResult.IsSuccess || loadSettingsResult.Value == null) return loadSettingsResult.ToResultOfType(_ => null); diff --git a/src/LetsEncryptServer/Services/SettingsService.cs b/src/LetsEncryptServer/Services/SettingsService.cs index 2385f98..1aef03e 100644 --- a/src/LetsEncryptServer/Services/SettingsService.cs +++ b/src/LetsEncryptServer/Services/SettingsService.cs @@ -43,14 +43,15 @@ public class SettingsService : ISettingsService, IDisposable { var settings = new Settings { Init = settingsDto.Init, - Users = [.. settingsDto.Users.Select(userDto => new User(userDto.Id, userDto.Name) - .SetSaltedHash(userDto.Salt, userDto.Hash) - .SetJwtTokens([.. userDto.JwtTokens.Select(jtDto => - new JwtToken(jtDto.Id) - .SetAccessTokenData(jtDto.Token, jtDto.IssuedAt, jtDto.ExpiresAt) - .SetRefreshTokenData(jtDto.RefreshToken, jtDto.RefreshTokenExpiresAt) - )]) - .SetLastLogin(userDto.LastLogin) + Users = [.. settingsDto.Users.Select(userDto => new User(userDto.Id) + .SetName(userDto.Name) + .SetSaltedHash(userDto.Salt, userDto.Hash) + .SetJwtTokens([.. userDto.JwtTokens.Select(jtDto => + new JwtToken(jtDto.Id) + .SetAccessTokenData(jtDto.Token, jtDto.IssuedAt, jtDto.ExpiresAt) + .SetRefreshTokenData(jtDto.RefreshToken, jtDto.RefreshTokenExpiresAt) + )]) + .SetLastLogin(userDto.LastLogin) )] }; return Result.Ok(settings); @@ -58,7 +59,7 @@ public class SettingsService : ISettingsService, IDisposable { catch (Exception ex) { var message = "Error loading settings file."; _logger.LogError(ex, message); - return Result.InternalServerError(null, new[] { message }.Concat(ex.ExtractMessages()).ToArray()); + return Result.InternalServerError(null, [message, .. ex.ExtractMessages()]); } }