diff --git a/src/Core/MailTemplates/Handlebars/AdminResetPassword.html.hbs b/src/Core/MailTemplates/Handlebars/AdminResetPassword.html.hbs new file mode 100644 index 0000000000..164fe523ea --- /dev/null +++ b/src/Core/MailTemplates/Handlebars/AdminResetPassword.html.hbs @@ -0,0 +1,9 @@ +{{#>FullHtmlLayout}} + + + + +
+ The master password for {{UserName}} has been changed by an administrator in your {{OrgName}} organization. If you did not initiate this request, please reach out to your administrator immediately. +
+{{/FullHtmlLayout}} diff --git a/src/Core/MailTemplates/Handlebars/AdminResetPassword.text.hbs b/src/Core/MailTemplates/Handlebars/AdminResetPassword.text.hbs new file mode 100644 index 0000000000..30e211af4f --- /dev/null +++ b/src/Core/MailTemplates/Handlebars/AdminResetPassword.text.hbs @@ -0,0 +1,3 @@ +{{#>BasicTextLayout}} +The master password for {{UserName}} has been changed by an administrator in your {{OrgName}} organization. If you did not initiate this request, please reach out to your administrator immediately. +{{/BasicTextLayout}} diff --git a/src/Core/Models/Mail/AdminResetPasswordViewModel.cs b/src/Core/Models/Mail/AdminResetPasswordViewModel.cs new file mode 100644 index 0000000000..5f5e859ac2 --- /dev/null +++ b/src/Core/Models/Mail/AdminResetPasswordViewModel.cs @@ -0,0 +1,8 @@ +namespace Bit.Core.Models.Mail +{ + public class AdminResetPasswordViewModel : BaseMailModel + { + public string UserName { get; set; } + public string OrgName { get; set; } + } +} diff --git a/src/Core/Services/IMailService.cs b/src/Core/Services/IMailService.cs index c09eb132fc..00f3b424d7 100644 --- a/src/Core/Services/IMailService.cs +++ b/src/Core/Services/IMailService.cs @@ -40,5 +40,6 @@ namespace Bit.Core.Services Task SendEmergencyAccessRecoveryReminder(EmergencyAccess emergencyAccess, string initiatingName, string email); Task SendEmergencyAccessRecoveryTimedOut(EmergencyAccess ea, string initiatingName, string email); Task SendEnqueuedMailMessageAsync(IMailQueueMessage queueMessage); + Task SendAdminResetPasswordEmailAsync(string email, string userName, string orgName); } } diff --git a/src/Core/Services/Implementations/HandlebarsMailService.cs b/src/Core/Services/Implementations/HandlebarsMailService.cs index 17c2ee7a45..072f350db6 100644 --- a/src/Core/Services/Implementations/HandlebarsMailService.cs +++ b/src/Core/Services/Implementations/HandlebarsMailService.cs @@ -361,6 +361,19 @@ namespace Bit.Core.Services await AddMessageContentAsync(message, queueMessage.TemplateName, queueMessage.Model); await _mailDeliveryService.SendEmailAsync(message); } + + public async Task SendAdminResetPasswordEmailAsync(string email, string userName, string orgName) + { + var message = CreateDefaultMessage("Master Password Has Been Changed", email); + var model = new AdminResetPasswordViewModel() + { + UserName = CoreHelpers.SanitizeForEmail(userName), + OrgName = CoreHelpers.SanitizeForEmail(orgName), + }; + await AddMessageContentAsync(message, "AdminResetPassword", model); + message.Category = "AdminResetPassword"; + await _mailDeliveryService.SendEmailAsync(message); + } private Task EnqueueMailAsync(IMailQueueMessage queueMessage) => _mailEnqueuingService.EnqueueAsync(queueMessage, SendEnqueuedMailMessageAsync); diff --git a/src/Core/Services/Implementations/UserService.cs b/src/Core/Services/Implementations/UserService.cs index c070849236..54deb5756d 100644 --- a/src/Core/Services/Implementations/UserService.cs +++ b/src/Core/Services/Implementations/UserService.cs @@ -689,7 +689,7 @@ namespace Bit.Core.Services user.Key = key; await _userRepository.ReplaceAsync(user); - // TODO Reset Password - Send email alerting user of changed password + await _mailService.SendAdminResetPasswordEmailAsync(user.Email, user.Name ?? user.Email, org.Name); await _eventService.LogOrganizationUserEventAsync(orgUser, EventType.OrganizationUser_AdminResetPassword); await _pushService.PushLogOutAsync(user.Id); diff --git a/src/Core/Services/NoopImplementations/NoopMailService.cs b/src/Core/Services/NoopImplementations/NoopMailService.cs index 29bef48922..a7bd0b28a8 100644 --- a/src/Core/Services/NoopImplementations/NoopMailService.cs +++ b/src/Core/Services/NoopImplementations/NoopMailService.cs @@ -158,5 +158,10 @@ namespace Bit.Core.Services { return Task.FromResult(0); } + + public Task SendAdminResetPasswordEmailAsync(string email, string userName, string orgName) + { + return Task.FromResult(0); + } } }