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);
+ }
}
}