From 6e302e06dc101c69e8d1ffb3c5fa68f0a5b93eb9 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Mon, 30 Oct 2017 22:10:40 -0400 Subject: [PATCH] backup mail service --- .../Implementations/BackupMailService.cs | 174 ++++++++++++++++++ .../Utilities/ServiceCollectionExtensions.cs | 2 +- 2 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 src/Core/Services/Implementations/BackupMailService.cs diff --git a/src/Core/Services/Implementations/BackupMailService.cs b/src/Core/Services/Implementations/BackupMailService.cs new file mode 100644 index 0000000000..c804181c46 --- /dev/null +++ b/src/Core/Services/Implementations/BackupMailService.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Bit.Core.Models.Table; +using Microsoft.Extensions.Logging; + +namespace Bit.Core.Services +{ + public class BackupMailService : IMailService + { + private readonly IMailService _primaryMailService; + private readonly IMailService _backupMailService; + private readonly ILogger _logger; + + public BackupMailService( + GlobalSettings globalSettings, + IMailDeliveryService mailDeliveryService, + ILogger logger) + { + _primaryMailService = new RazorMailService(globalSettings, mailDeliveryService); + _backupMailService = new MarkdownMailService(globalSettings, mailDeliveryService); + _logger = logger; + } + + public async Task SendVerifyEmailEmailAsync(string email, Guid userId, string token) + { + try + { + await _primaryMailService.SendVerifyEmailEmailAsync(email, userId, token); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendVerifyEmailEmailAsync(email, userId, token); + } + } + + public async Task SendVerifyDeleteEmailAsync(string email, Guid userId, string token) + { + try + { + await _primaryMailService.SendVerifyDeleteEmailAsync(email, userId, token); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendVerifyDeleteEmailAsync(email, userId, token); + } + } + + public async Task SendChangeEmailAlreadyExistsEmailAsync(string fromEmail, string toEmail) + { + try + { + await _primaryMailService.SendChangeEmailAlreadyExistsEmailAsync(fromEmail, toEmail); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendChangeEmailAlreadyExistsEmailAsync(fromEmail, toEmail); + } + } + + public async Task SendChangeEmailEmailAsync(string newEmailAddress, string token) + { + try + { + await _primaryMailService.SendChangeEmailEmailAsync(newEmailAddress, token); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendChangeEmailEmailAsync(newEmailAddress, token); + } + } + + public async Task SendTwoFactorEmailAsync(string email, string token) + { + try + { + await _primaryMailService.SendTwoFactorEmailAsync(email, token); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendTwoFactorEmailAsync(email, token); + } + } + + public async Task SendMasterPasswordHintEmailAsync(string email, string hint) + { + try + { + await _primaryMailService.SendMasterPasswordHintEmailAsync(email, hint); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendMasterPasswordHintEmailAsync(email, hint); + } + } + + public async Task SendNoMasterPasswordHintEmailAsync(string email) + { + try + { + await _primaryMailService.SendNoMasterPasswordHintEmailAsync(email); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendNoMasterPasswordHintEmailAsync(email); + } + } + + public async Task SendOrganizationAcceptedEmailAsync(string organizationName, string userEmail, + IEnumerable adminEmails) + { + try + { + await _primaryMailService.SendOrganizationAcceptedEmailAsync(organizationName, userEmail, adminEmails); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendOrganizationAcceptedEmailAsync(organizationName, userEmail, adminEmails); + } + } + + public async Task SendOrganizationConfirmedEmailAsync(string organizationName, string email) + { + try + { + await _primaryMailService.SendOrganizationConfirmedEmailAsync(organizationName, email); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendOrganizationConfirmedEmailAsync(organizationName, email); + } + } + + public async Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, string token) + { + try + { + await _primaryMailService.SendOrganizationInviteEmailAsync(organizationName, orgUser, token); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendOrganizationInviteEmailAsync(organizationName, orgUser, token); + } + } + + public async Task SendWelcomeEmailAsync(User user) + { + try + { + await _primaryMailService.SendWelcomeEmailAsync(user); + } + catch(Exception e) + { + LogError(e); + await _backupMailService.SendWelcomeEmailAsync(user); + } + } + + private void LogError(Exception e) + { + _logger.LogError(e, "Error sending mail with primary service, using backup."); + } + } +} diff --git a/src/Core/Utilities/ServiceCollectionExtensions.cs b/src/Core/Utilities/ServiceCollectionExtensions.cs index 82191eec13..b93958fcab 100644 --- a/src/Core/Utilities/ServiceCollectionExtensions.cs +++ b/src/Core/Utilities/ServiceCollectionExtensions.cs @@ -54,7 +54,7 @@ namespace Bit.Core.Utilities public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings) { - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); if(CoreHelpers.SettingHasValue(globalSettings.Mail.SendGridApiKey))