Browse Source

[Provider] Send email on removal (#1463)

pull/1464/head
Oscar Hinton 4 years ago committed by GitHub
parent
commit
8ac2dc50af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      bitwarden_license/src/CommCore/Services/ProviderService.cs
  2. 6
      bitwarden_license/test/CmmCore.Test/Services/ProviderServiceTests.cs
  3. 9
      src/Core/MailTemplates/Handlebars/Provider/ProviderUserRemoved.html.hbs
  4. 4
      src/Core/MailTemplates/Handlebars/Provider/ProviderUserRemoved.text.hbs
  5. 7
      src/Core/Models/Mail/Provider/ProviderUserRemovedViewModel.cs
  6. 1
      src/Core/Services/IMailService.cs
  7. 14
      src/Core/Services/Implementations/HandlebarsMailService.cs
  8. 5
      src/Core/Services/NoopImplementations/NoopMailService.cs

19
bitwarden_license/src/CommCore/Services/ProviderService.cs

@ -259,7 +259,7 @@ namespace Bit.CommCore.Services @@ -259,7 +259,7 @@ namespace Bit.CommCore.Services
await _providerUserRepository.ReplaceAsync(providerUser);
events.Add((providerUser, EventType.ProviderUser_Confirmed, null));
await _mailService.SendOrganizationConfirmedEmailAsync(provider.Name, user.Email);
await _mailService.SendProviderConfirmedEmailAsync(provider.Name, user.Email);
result.Add(Tuple.Create(providerUser, ""));
}
catch (BadRequestException e)
@ -293,7 +293,17 @@ namespace Bit.CommCore.Services @@ -293,7 +293,17 @@ namespace Bit.CommCore.Services
public async Task<List<Tuple<ProviderUser, string>>> DeleteUsersAsync(Guid providerId,
IEnumerable<Guid> providerUserIds, Guid deletingUserId)
{
var provider = await _providerRepository.GetByIdAsync(providerId);
if (provider == null)
{
throw new NotFoundException();
}
var providerUsers = await _providerUserRepository.GetManyAsync(providerUserIds);
var users = await _userRepository.GetManyAsync(providerUsers.Where(pu => pu.UserId.HasValue)
.Select(pu => pu.UserId.Value));
var keyedUsers = users.ToDictionary(u => u.Id);
if (!await HasConfirmedProviderAdminExceptAsync(providerId, providerUserIds))
{
@ -319,6 +329,13 @@ namespace Bit.CommCore.Services @@ -319,6 +329,13 @@ namespace Bit.CommCore.Services
events.Add((providerUser, EventType.ProviderUser_Removed, null));
var user = keyedUsers.GetValueOrDefault(providerUser.UserId.GetValueOrDefault());
var email = user == null ? providerUser.Email : user.Email;
if (!string.IsNullOrWhiteSpace(email))
{
await _mailService.SendProviderUserRemoved(provider.Name, email);
}
result.Add(Tuple.Create(providerUser, ""));
deletedUserIds.Add(providerUser.Id);
}

6
bitwarden_license/test/CmmCore.Test/Services/ProviderServiceTests.cs

@ -360,7 +360,8 @@ namespace Bit.CommCore.Test.Services @@ -360,7 +360,8 @@ namespace Bit.CommCore.Test.Services
providerUser.ProviderId = provider.Id;
}
providerUsers.Last().ProviderId = default;
sutProvider.GetDependency<IProviderRepository>().GetByIdAsync(provider.Id).Returns(provider);
var providerUserRepository = sutProvider.GetDependency<IProviderUserRepository>();
providerUserRepository.GetManyAsync(default).ReturnsForAnyArgs(providerUsers);
providerUserRepository.GetManyByProviderAsync(default, default).ReturnsForAnyArgs(new ProviderUser[] {});
@ -383,7 +384,8 @@ namespace Bit.CommCore.Test.Services @@ -383,7 +384,8 @@ namespace Bit.CommCore.Test.Services
providerUser.ProviderId = provider.Id;
}
providerUsers.Last().ProviderId = default;
sutProvider.GetDependency<IProviderRepository>().GetByIdAsync(provider.Id).Returns(provider);
var providerUserRepository = sutProvider.GetDependency<IProviderUserRepository>();
providerUserRepository.GetManyAsync(default).ReturnsForAnyArgs(providerUsers);
providerUserRepository.GetManyByProviderAsync(default, default).ReturnsForAnyArgs(new[] {remainingOwner});

9
src/Core/MailTemplates/Handlebars/Provider/ProviderUserRemoved.html.hbs

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
{{#>FullHtmlLayout}}
<table width="100%" cellpadding="0" cellspacing="0" style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
<tr style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">
<td class="content-block" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; margin: 0; -webkit-font-smoothing: antialiased; padding: 0 0 10px; -webkit-text-size-adjust: none;" valign="top" align="left">
You have been removed from <b style="margin: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; color: #333; line-height: 25px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;">{{ProviderName}}</b>. You will no longer have access to the Provider Portal. If you have an existing Bitwarden account, your account is unaffected.
</td>
</tr>
</table>
{{/FullHtmlLayout}}

4
src/Core/MailTemplates/Handlebars/Provider/ProviderUserRemoved.text.hbs

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
{{#>BasicTextLayout}}
You have been removed from {{ProviderName}}. You will no longer have access to the Provider Portal.
If you have an existing Bitwarden account, your account is unaffected.
{{/BasicTextLayout}}

7
src/Core/Models/Mail/Provider/ProviderUserRemovedViewModel.cs

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
namespace Bit.Core.Models.Mail.Provider
{
public class ProviderUserRemovedViewModel : BaseMailModel
{
public string ProviderName { get; set; }
}
}

1
src/Core/Services/IMailService.cs

@ -45,5 +45,6 @@ namespace Bit.Core.Services @@ -45,5 +45,6 @@ namespace Bit.Core.Services
Task SendProviderSetupInviteEmailAsync(Provider provider, string token, string email);
Task SendProviderInviteEmailAsync(string providerName, ProviderUser providerUser, string token, string email);
Task SendProviderConfirmedEmailAsync(string providerName, string email);
Task SendProviderUserRemoved(string providerName, string email);
}
}

14
src/Core/Services/Implementations/HandlebarsMailService.cs

@ -697,5 +697,19 @@ namespace Bit.Core.Services @@ -697,5 +697,19 @@ namespace Bit.Core.Services
message.Category = "ProviderUserConfirmed";
await _mailDeliveryService.SendEmailAsync(message);
}
public async Task SendProviderUserRemoved(string providerName, string email)
{
var message = CreateDefaultMessage($"You Have Been Removed from {providerName}", email);
var model = new ProviderUserRemovedViewModel
{
ProviderName = CoreHelpers.SanitizeForEmail(providerName),
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
SiteName = _globalSettings.SiteName
};
await AddMessageContentAsync(message, "Provider.ProviderUserRemoved", model);
message.Category = "ProviderUserRemoved";
await _mailDeliveryService.SendEmailAsync(message);
}
}
}

5
src/Core/Services/NoopImplementations/NoopMailService.cs

@ -179,5 +179,10 @@ namespace Bit.Core.Services @@ -179,5 +179,10 @@ namespace Bit.Core.Services
{
return Task.FromResult(0);
}
public Task SendProviderUserRemoved(string providerName, string email)
{
return Task.FromResult(0);
}
}
}

Loading…
Cancel
Save