From d57a68aae338f3f004ca248de7a51051a99c6fc4 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Sat, 24 Jun 2017 12:08:34 -0400 Subject: [PATCH] two factor emails --- src/Core/Core.csproj | 2 ++ src/Core/MailTemplates/ChangeEmail.cshtml | 2 +- src/Core/MailTemplates/ChangeEmail.text.cshtml | 2 +- src/Core/MailTemplates/TwoFactorEmail.cshtml | 10 ++++++++++ .../MailTemplates/TwoFactorEmail.text.cshtml | 7 +++++++ ...mailViewModel.cs => EmailTokenViewModel.cs} | 2 +- src/Core/Services/IMailService.cs | 1 + .../Implementations/RazorViewMailService.cs | 18 +++++++++++++++++- .../SendGridTemplateMailService.cs | 15 +++++++++++++++ .../Services/Implementations/UserService.cs | 2 +- 10 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 src/Core/MailTemplates/TwoFactorEmail.cshtml create mode 100644 src/Core/MailTemplates/TwoFactorEmail.text.cshtml rename src/Core/Models/Mail/{ChangeEmailViewModel.cs => EmailTokenViewModel.cs} (63%) diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 8bcf8e837..29897c7dd 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -14,6 +14,8 @@ + + diff --git a/src/Core/MailTemplates/ChangeEmail.cshtml b/src/Core/MailTemplates/ChangeEmail.cshtml index 3aa571ee1..30ee0fe3c 100644 --- a/src/Core/MailTemplates/ChangeEmail.cshtml +++ b/src/Core/MailTemplates/ChangeEmail.cshtml @@ -1,4 +1,4 @@ -@model Bit.Core.Models.Mail.ChangeEmailViewModel +@model Bit.Core.Models.Mail.EmailTokenViewModel @{ Layout = "_BasicMailLayout"; } diff --git a/src/Core/MailTemplates/ChangeEmail.text.cshtml b/src/Core/MailTemplates/ChangeEmail.text.cshtml index bdfba1a7b..b9f60e81a 100644 --- a/src/Core/MailTemplates/ChangeEmail.text.cshtml +++ b/src/Core/MailTemplates/ChangeEmail.text.cshtml @@ -1,4 +1,4 @@ -@model Bit.Core.Models.Mail.ChangeEmailViewModel +@model Bit.Core.Models.Mail.EmailTokenViewModel @{ Layout = "_BasicMailLayout.text"; } diff --git a/src/Core/MailTemplates/TwoFactorEmail.cshtml b/src/Core/MailTemplates/TwoFactorEmail.cshtml new file mode 100644 index 000000000..bbd1d5454 --- /dev/null +++ b/src/Core/MailTemplates/TwoFactorEmail.cshtml @@ -0,0 +1,10 @@ +@model Bit.Core.Models.Mail.EmailTokenViewModel +@{ + Layout = "_BasicMailLayout"; +} +

+ Your two-step verification code is: @Model.Token +

+

+ Use this code to complete logging in with bitwarden. +

\ No newline at end of file diff --git a/src/Core/MailTemplates/TwoFactorEmail.text.cshtml b/src/Core/MailTemplates/TwoFactorEmail.text.cshtml new file mode 100644 index 000000000..615a65f78 --- /dev/null +++ b/src/Core/MailTemplates/TwoFactorEmail.text.cshtml @@ -0,0 +1,7 @@ +@model Bit.Core.Models.Mail.EmailTokenViewModel +@{ + Layout = "_BasicMailLayout.text"; +} +Your two-step verification code is: @Model.Token + +Use this code to complete logging in with bitwarden. diff --git a/src/Core/Models/Mail/ChangeEmailViewModel.cs b/src/Core/Models/Mail/EmailTokenViewModel.cs similarity index 63% rename from src/Core/Models/Mail/ChangeEmailViewModel.cs rename to src/Core/Models/Mail/EmailTokenViewModel.cs index 7b753cbc0..596fc7c21 100644 --- a/src/Core/Models/Mail/ChangeEmailViewModel.cs +++ b/src/Core/Models/Mail/EmailTokenViewModel.cs @@ -1,6 +1,6 @@ namespace Bit.Core.Models.Mail { - public class ChangeEmailViewModel : BaseMailModel + public class EmailTokenViewModel : BaseMailModel { public string Token { get; set; } } diff --git a/src/Core/Services/IMailService.cs b/src/Core/Services/IMailService.cs index dd1d5bc7d..7e382b6ba 100644 --- a/src/Core/Services/IMailService.cs +++ b/src/Core/Services/IMailService.cs @@ -9,6 +9,7 @@ namespace Bit.Core.Services Task SendWelcomeEmailAsync(User user); Task SendChangeEmailAlreadyExistsEmailAsync(string fromEmail, string toEmail); Task SendChangeEmailEmailAsync(string newEmailAddress, string token); + Task SendTwoFactorEmailAsync(string email, string token); Task SendNoMasterPasswordHintEmailAsync(string email); Task SendMasterPasswordHintEmailAsync(string email, string hint); Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, string token); diff --git a/src/Core/Services/Implementations/RazorViewMailService.cs b/src/Core/Services/Implementations/RazorViewMailService.cs index b65a167e2..a29f90bc9 100644 --- a/src/Core/Services/Implementations/RazorViewMailService.cs +++ b/src/Core/Services/Implementations/RazorViewMailService.cs @@ -48,7 +48,7 @@ namespace Bit.Core.Services public async Task SendChangeEmailEmailAsync(string newEmailAddress, string token) { var message = CreateDefaultMessage("Your Email Change", newEmailAddress); - var model = new ChangeEmailViewModel + var model = new EmailTokenViewModel { Token = token, WebVaultUrl = _globalSettings.BaseVaultUri, @@ -61,6 +61,22 @@ namespace Bit.Core.Services await _mailDeliveryService.SendEmailAsync(message); } + public async Task SendTwoFactorEmailAsync(string email, string token) + { + var message = CreateDefaultMessage("Your Two-step Login Verification Code", email); + var model = new EmailTokenViewModel + { + Token = token, + WebVaultUrl = _globalSettings.BaseVaultUri, + SiteName = _globalSettings.SiteName + }; + message.HtmlContent = _engine.Parse("TwoFactorEmail", model); + message.TextContent = _engine.Parse("TwoFactorEmail.text", model); + message.MetaData.Add("SendGridBypassListManagement", true); + + await _mailDeliveryService.SendEmailAsync(message); + } + public async Task SendMasterPasswordHintEmailAsync(string email, string hint) { var message = CreateDefaultMessage("Your Master Password Hint", email); diff --git a/src/Core/Services/Implementations/SendGridTemplateMailService.cs b/src/Core/Services/Implementations/SendGridTemplateMailService.cs index 00f89d153..bf496ec7a 100644 --- a/src/Core/Services/Implementations/SendGridTemplateMailService.cs +++ b/src/Core/Services/Implementations/SendGridTemplateMailService.cs @@ -12,6 +12,7 @@ namespace Bit.Core.Services private const string WelcomeTemplateId = "045f8ad5-5547-4fa2-8d3d-6d46e401164d"; private const string ChangeEmailAlreadyExistsTemplateId = "b69d2038-6ad9-4cf6-8f7f-7880921cba43"; private const string ChangeEmailTemplateId = "ec2c1471-8292-4f17-b6b6-8223d514f86e"; + private const string TwoFactorEmailTemplateId = "264cfe69-5258-4c89-8d90-76b4659de589"; private const string NoMasterPasswordHintTemplateId = "136eb299-e102-495a-88bd-f96736eea159"; private const string MasterPasswordHintTemplateId = "be77cfde-95dd-4cb9-b5e0-8286b53885f1"; private const string OrganizationInviteTemplateId = "1eff5512-e36c-49a8-b9e2-2b215d6bbced"; @@ -72,6 +73,20 @@ namespace Bit.Core.Services await _mailDeliveryService.SendEmailAsync(message); } + public async Task SendTwoFactorEmailAsync(string email, string token) + { + var message = CreateDefaultMessage( + "Your Two-step Login Verification Code", + email, + TwoFactorEmailTemplateId); + + AddSubstitution(message, "{{token}}", Uri.EscapeDataString(token)); + AddCategories(message, new List { AdministrativeCategoryName, "Two Factor Email" }); + message.MetaData.Add("SendGridBypassListManagement", true); + + await _mailDeliveryService.SendEmailAsync(message); + } + public async Task SendNoMasterPasswordHintEmailAsync(string email) { var message = CreateDefaultMessage( diff --git a/src/Core/Services/Implementations/UserService.cs b/src/Core/Services/Implementations/UserService.cs index 27b4c1748..d4c273642 100644 --- a/src/Core/Services/Implementations/UserService.cs +++ b/src/Core/Services/Implementations/UserService.cs @@ -201,7 +201,7 @@ namespace Bit.Core.Services var token = await base.GenerateUserTokenAsync(user, TokenOptions.DefaultEmailProvider, "2faEmail:" + provider.MetaData["Email"]); - await _mailService.SendChangeEmailEmailAsync((string)provider.MetaData["Email"], token); + await _mailService.SendTwoFactorEmailAsync((string)provider.MetaData["Email"], token); } public async Task VerifyTwoFactorEmailAsync(User user, string token)