2020-09-05 12:16:48 +02:00
|
|
|
using System;
|
2020-03-13 11:47:22 +01:00
|
|
|
using System.Threading;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using BTCPayServer.Data;
|
|
|
|
using BTCPayServer.Events;
|
|
|
|
using BTCPayServer.Logging;
|
|
|
|
using BTCPayServer.Services;
|
|
|
|
using BTCPayServer.Services.Mails;
|
2024-01-31 06:45:54 +01:00
|
|
|
using BTCPayServer.Services.Notifications;
|
|
|
|
using BTCPayServer.Services.Notifications.Blobs;
|
2020-04-10 08:59:39 +02:00
|
|
|
using Microsoft.AspNetCore.Http;
|
2020-03-13 11:47:22 +01:00
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
using Microsoft.AspNetCore.Routing;
|
|
|
|
using Microsoft.Extensions.Logging;
|
2022-06-22 05:05:32 +02:00
|
|
|
using MimeKit;
|
2020-03-13 11:47:22 +01:00
|
|
|
|
|
|
|
namespace BTCPayServer.HostedServices
|
|
|
|
{
|
|
|
|
public class UserEventHostedService : EventHostedServiceBase
|
|
|
|
{
|
|
|
|
private readonly UserManager<ApplicationUser> _userManager;
|
|
|
|
private readonly EmailSenderFactory _emailSenderFactory;
|
2024-01-31 06:45:54 +01:00
|
|
|
private readonly NotificationSender _notificationSender;
|
2020-03-13 11:47:22 +01:00
|
|
|
private readonly LinkGenerator _generator;
|
|
|
|
|
2024-01-31 06:45:54 +01:00
|
|
|
public UserEventHostedService(
|
|
|
|
EventAggregator eventAggregator,
|
|
|
|
UserManager<ApplicationUser> userManager,
|
|
|
|
EmailSenderFactory emailSenderFactory,
|
|
|
|
NotificationSender notificationSender,
|
|
|
|
LinkGenerator generator,
|
|
|
|
Logs logs) : base(eventAggregator, logs)
|
2020-03-13 11:47:22 +01:00
|
|
|
{
|
|
|
|
_userManager = userManager;
|
|
|
|
_emailSenderFactory = emailSenderFactory;
|
2024-01-31 06:45:54 +01:00
|
|
|
_notificationSender = notificationSender;
|
2020-03-13 11:47:22 +01:00
|
|
|
_generator = generator;
|
|
|
|
}
|
|
|
|
|
2020-04-28 08:06:28 +02:00
|
|
|
protected override void SubscribeToEvents()
|
2020-03-13 11:47:22 +01:00
|
|
|
{
|
|
|
|
Subscribe<UserRegisteredEvent>();
|
2024-01-31 06:45:54 +01:00
|
|
|
Subscribe<UserApprovedEvent>();
|
2020-09-05 12:16:48 +02:00
|
|
|
Subscribe<UserPasswordResetRequestedEvent>();
|
2020-03-13 11:47:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected override async Task ProcessEvent(object evt, CancellationToken cancellationToken)
|
|
|
|
{
|
2020-09-05 12:16:48 +02:00
|
|
|
string code;
|
|
|
|
string callbackUrl;
|
2024-01-31 06:45:54 +01:00
|
|
|
Uri uri;
|
|
|
|
HostString host;
|
|
|
|
ApplicationUser user;
|
2022-06-22 05:05:32 +02:00
|
|
|
MailboxAddress address;
|
2024-01-31 06:45:54 +01:00
|
|
|
IEmailSender emailSender;
|
2020-09-05 12:16:48 +02:00
|
|
|
UserPasswordResetRequestedEvent userPasswordResetRequestedEvent;
|
2020-03-13 11:47:22 +01:00
|
|
|
switch (evt)
|
|
|
|
{
|
|
|
|
case UserRegisteredEvent userRegisteredEvent:
|
2024-01-31 06:45:54 +01:00
|
|
|
user = userRegisteredEvent.User;
|
2020-09-05 12:16:48 +02:00
|
|
|
Logs.PayServer.LogInformation(
|
2024-01-31 06:45:54 +01:00
|
|
|
$"A new user just registered {user.Email} {(userRegisteredEvent.Admin ? "(admin)" : "")}");
|
|
|
|
if (user.RequiresApproval && !user.Approved)
|
|
|
|
{
|
|
|
|
await _notificationSender.SendNotification(new AdminScope(), new NewUserRequiresApprovalNotification(user));
|
|
|
|
}
|
|
|
|
if (!user.EmailConfirmed && user.RequiresEmailConfirmation)
|
2020-03-13 11:47:22 +01:00
|
|
|
{
|
2024-01-31 06:45:54 +01:00
|
|
|
uri = userRegisteredEvent.RequestUri;
|
|
|
|
host = new HostString(uri.Host, uri.Port);
|
|
|
|
code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
|
|
|
|
callbackUrl = _generator.EmailConfirmationLink(user.Id, code, uri.Scheme, host, uri.PathAndQuery);
|
2020-09-05 12:16:48 +02:00
|
|
|
userRegisteredEvent.CallbackUrlGenerated?.SetResult(new Uri(callbackUrl));
|
2024-01-31 06:45:54 +01:00
|
|
|
address = user.GetMailboxAddress();
|
|
|
|
emailSender = await _emailSenderFactory.GetEmailSender();
|
|
|
|
emailSender.SendEmailConfirmation(address, callbackUrl);
|
2020-03-13 11:47:22 +01:00
|
|
|
}
|
2020-09-05 12:16:48 +02:00
|
|
|
else if (!await _userManager.HasPasswordAsync(userRegisteredEvent.User))
|
|
|
|
{
|
2024-01-31 06:45:54 +01:00
|
|
|
userPasswordResetRequestedEvent = new UserPasswordResetRequestedEvent
|
2020-09-05 12:16:48 +02:00
|
|
|
{
|
|
|
|
CallbackUrlGenerated = userRegisteredEvent.CallbackUrlGenerated,
|
2024-01-31 06:45:54 +01:00
|
|
|
User = user,
|
2020-09-05 12:16:48 +02:00
|
|
|
RequestUri = userRegisteredEvent.RequestUri
|
|
|
|
};
|
|
|
|
goto passwordSetter;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
userRegisteredEvent.CallbackUrlGenerated?.SetResult(null);
|
|
|
|
}
|
2024-01-31 06:45:54 +01:00
|
|
|
break;
|
2020-09-05 12:16:48 +02:00
|
|
|
|
2024-01-31 06:45:54 +01:00
|
|
|
case UserApprovedEvent userApprovedEvent:
|
|
|
|
if (userApprovedEvent.Approved)
|
|
|
|
{
|
|
|
|
uri = userApprovedEvent.RequestUri;
|
|
|
|
host = new HostString(uri.Host, uri.Port);
|
|
|
|
address = userApprovedEvent.User.GetMailboxAddress();
|
|
|
|
callbackUrl = _generator.LoginLink(uri.Scheme, host, uri.PathAndQuery);
|
|
|
|
emailSender = await _emailSenderFactory.GetEmailSender();
|
|
|
|
emailSender.SendApprovalConfirmation(address, callbackUrl);
|
|
|
|
}
|
2020-09-05 12:16:48 +02:00
|
|
|
break;
|
2024-01-31 06:45:54 +01:00
|
|
|
|
2020-09-05 12:16:48 +02:00
|
|
|
case UserPasswordResetRequestedEvent userPasswordResetRequestedEvent2:
|
|
|
|
userPasswordResetRequestedEvent = userPasswordResetRequestedEvent2;
|
2021-12-31 16:59:02 +09:00
|
|
|
passwordSetter:
|
2024-01-31 06:45:54 +01:00
|
|
|
uri = userPasswordResetRequestedEvent.RequestUri;
|
|
|
|
host = new HostString(uri.Host, uri.Port);
|
|
|
|
user = userPasswordResetRequestedEvent.User;
|
|
|
|
code = await _userManager.GeneratePasswordResetTokenAsync(user);
|
|
|
|
var newPassword = await _userManager.HasPasswordAsync(user);
|
|
|
|
callbackUrl = _generator.ResetPasswordCallbackLink(user.Id, code, uri.Scheme, host, uri.PathAndQuery);
|
2020-09-05 12:16:48 +02:00
|
|
|
userPasswordResetRequestedEvent.CallbackUrlGenerated?.SetResult(new Uri(callbackUrl));
|
2024-01-31 06:45:54 +01:00
|
|
|
address = user.GetMailboxAddress();
|
|
|
|
emailSender = await _emailSenderFactory.GetEmailSender();
|
|
|
|
emailSender.SendSetPasswordConfirmation(address, callbackUrl, newPassword);
|
2020-03-13 11:47:22 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|