Files
server/src/Core/Identity/EmailTokenProvider.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

84 lines
2.5 KiB
C#
Raw Normal View History

using Bit.Core.Entities;
2018-12-19 22:27:45 -05:00
using Bit.Core.Enums;
using Bit.Core.Models;
using Bit.Core.Services;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
namespace Bit.Core.Identity;
2022-08-29 16:06:55 -04:00
2018-12-19 22:27:45 -05:00
public class EmailTokenProvider : IUserTwoFactorTokenProvider<User>
{
private readonly IServiceProvider _serviceProvider;
2022-08-29 16:06:55 -04:00
2018-12-19 22:27:45 -05:00
public EmailTokenProvider(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
2022-08-29 16:06:55 -04:00
}
2018-12-19 22:27:45 -05:00
public async Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<User> manager, User user)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
var provider = user.GetTwoFactorProvider(TwoFactorProviderType.Email);
if (!HasProperMetaData(provider))
{
return false;
}
return await _serviceProvider.GetRequiredService<IUserService>().
TwoFactorProviderIsEnabledAsync(TwoFactorProviderType.Email, user);
}
public Task<string> GenerateAsync(string purpose, UserManager<User> manager, User user)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
var provider = user.GetTwoFactorProvider(TwoFactorProviderType.Email);
if (!HasProperMetaData(provider))
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
return null;
}
2018-12-19 22:27:45 -05:00
return Task.FromResult(RedactEmail((string)provider.MetaData["Email"]));
}
2018-12-19 22:27:45 -05:00
public Task<bool> ValidateAsync(string purpose, string token, UserManager<User> manager, User user)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
return _serviceProvider.GetRequiredService<IUserService>().VerifyTwoFactorEmailAsync(user, token);
}
2018-12-19 22:27:45 -05:00
private bool HasProperMetaData(TwoFactorProvider provider)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
return provider?.MetaData != null && provider.MetaData.ContainsKey("Email") &&
!string.IsNullOrWhiteSpace((string)provider.MetaData["Email"]);
2022-08-29 16:06:55 -04:00
}
2018-12-19 22:27:45 -05:00
private static string RedactEmail(string email)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
var emailParts = email.Split('@');
2022-08-29 16:06:55 -04:00
2018-12-19 22:27:45 -05:00
string shownPart = null;
if (emailParts[0].Length > 2 && emailParts[0].Length <= 4)
{
shownPart = emailParts[0].Substring(0, 1);
}
else if (emailParts[0].Length > 4)
2022-08-29 14:53:16 -04:00
{
2018-12-19 22:27:45 -05:00
shownPart = emailParts[0].Substring(0, 2);
}
2022-08-29 14:53:16 -04:00
else
{
2018-12-19 22:27:45 -05:00
shownPart = string.Empty;
}
2018-12-19 22:27:45 -05:00
string redactedPart = null;
if (emailParts[0].Length > 4)
2022-08-29 16:06:55 -04:00
{
2018-12-19 22:27:45 -05:00
redactedPart = new string('*', emailParts[0].Length - 2);
}
2022-08-29 16:06:55 -04:00
else
{
2018-12-19 22:27:45 -05:00
redactedPart = new string('*', emailParts[0].Length - shownPart.Length);
2022-08-29 16:06:55 -04:00
}
2018-12-19 22:27:45 -05:00
return $"{shownPart}{redactedPart}@{emailParts[1]}";
}
}