< Summary

Information
Class: Elsa.Identity.Services.DefaultUserCredentialsValidator
Assembly: Elsa.Identity
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/DefaultUserCredentialsValidator.cs
Line coverage
86%
Covered lines: 31
Uncovered lines: 5
Coverable lines: 36
Total lines: 84
Line coverage: 86.1%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%22100%
ValidateAsync()87.5%8880.76%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/DefaultUserCredentialsValidator.cs

#LineLine coverage
 1using Elsa.Extensions;
 2using Elsa.Identity.Contracts;
 3using Elsa.Identity.Entities;
 4using Microsoft.Extensions.Logging;
 5using Microsoft.Extensions.Logging.Abstractions;
 6
 7namespace Elsa.Identity.Services;
 8
 9/// <summary>
 10/// Validates user credentials
 11/// </summary>
 12public class DefaultUserCredentialsValidator : IUserCredentialsValidator
 13{
 14    private readonly IUserProvider _userProvider;
 15    private readonly IUserStore? _userStore;
 16    private readonly ISecretHasher _secretHasher;
 17    private readonly ILogger<DefaultUserCredentialsValidator> _logger;
 18
 19    /// <summary>
 20    /// Initializes a new instance of the <see cref="DefaultUserCredentialsValidator"/> class.
 21    /// </summary>
 522    public DefaultUserCredentialsValidator(IUserProvider userProvider, ISecretHasher secretHasher) : this(userProvider, 
 23    {
 524    }
 25
 26    /// <summary>
 27    /// Initializes a new instance of the <see cref="DefaultUserCredentialsValidator"/> class.
 28    /// </summary>
 229    public DefaultUserCredentialsValidator(IUserProvider userProvider, IUserStore userStore, ISecretHasher secretHasher)
 30    {
 231    }
 32
 33    /// <summary>
 34    /// Initializes a new instance of the <see cref="DefaultUserCredentialsValidator"/> class.
 35    /// </summary>
 1036    public DefaultUserCredentialsValidator(IUserProvider userProvider, IUserStore? userStore, ISecretHasher secretHasher
 37    {
 1038        _userProvider = userProvider;
 1039        _userStore = userStore;
 1040        _secretHasher = secretHasher;
 1041        _logger = logger ?? NullLogger<DefaultUserCredentialsValidator>.Instance;
 1042    }
 43
 44    /// <inheritdoc />
 45    public async ValueTask<User?> ValidateAsync(string username, string password, CancellationToken cancellationToken = 
 46    {
 747        var user = await _userProvider.FindByNameAsync(username, cancellationToken);
 48
 749        if (user == null)
 350            return null;
 51
 452        var isValidPassword = _secretHasher.VerifySecret(password, user.HashedPassword, user.HashedPasswordSalt, out var
 53
 454        if (!isValidPassword)
 055            return null;
 56
 457        if (needsRehash && _userStore != null)
 58        {
 259            var previousHashedPassword = user.HashedPassword;
 260            var previousHashedPasswordSalt = user.HashedPasswordSalt;
 261            var hashedPassword = _secretHasher.HashSecret(password);
 262            user.HashedPassword = hashedPassword.EncodeSecret();
 263            user.HashedPasswordSalt = hashedPassword.EncodeSalt();
 64            try
 65            {
 266                await _userStore.SaveAsync(user, cancellationToken);
 167            }
 068            catch (OperationCanceledException)
 69            {
 070                user.HashedPassword = previousHashedPassword;
 071                user.HashedPasswordSalt = previousHashedPasswordSalt;
 072                throw;
 73            }
 174            catch (Exception e)
 75            {
 176                user.HashedPassword = previousHashedPassword;
 177                user.HashedPasswordSalt = previousHashedPasswordSalt;
 178                _logger.LogWarning(e, "Failed to save upgraded password hash for user {UserId}.", user.Id);
 179            }
 280        }
 81
 482        return user;
 783    }
 84}