1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-01 08:02:49 -05:00

Add disable send policy (#1130)

* Add Disable Send policy

* Test DisableSend policy

* PR Review

* Update tests for using CurrentContext

This required making an interface for CurrentContext and mocking out
the members used. The interface can be expanded as needed for tests.

I moved CurrentContext to a folder, which changes the namespace
and causes a lot of file touches, but most are just adding a reference

* Fix failing test

* Update exemption to include all exempt users

* Move all CurrentContext usages to ICurrentContext

* PR review. Match messaging with Web
This commit is contained in:
Matt Gibson
2021-02-04 12:54:21 -06:00
committed by GitHub
parent 19e7ce8519
commit edd4bc2623
60 changed files with 437 additions and 99 deletions

View File

@ -8,6 +8,7 @@ using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using Bit.Api.Utilities;
using Bit.Core.Utilities;
using System.Collections.Generic;
@ -23,7 +24,7 @@ namespace Bit.Api.Controllers
private readonly ICollectionCipherRepository _collectionCipherRepository;
private readonly ICipherService _cipherService;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
public CiphersController(
@ -31,7 +32,7 @@ namespace Bit.Api.Controllers
ICollectionCipherRepository collectionCipherRepository,
ICipherService cipherService,
IUserService userService,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings)
{
_cipherRepository = cipherRepository;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Table;
using System.Collections.Generic;
@ -20,13 +20,13 @@ namespace Bit.Api.Controllers
private readonly ICollectionRepository _collectionRepository;
private readonly ICollectionService _collectionService;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public CollectionsController(
ICollectionRepository collectionRepository,
ICollectionService collectionService,
IUserService userService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_collectionRepository = collectionRepository;
_collectionService = collectionService;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using Bit.Core.Exceptions;
using Bit.Core.Models.Api;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Data;
namespace Bit.Api.Controllers
@ -20,14 +20,14 @@ namespace Bit.Api.Controllers
private readonly ICipherRepository _cipherRepository;
private readonly IOrganizationUserRepository _organizationUserRepository;
private readonly IEventRepository _eventRepository;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public EventsController(
IUserService userService,
ICipherRepository cipherRepository,
IOrganizationUserRepository organizationUserRepository,
IEventRepository eventRepository,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_userService = userService;
_cipherRepository = cipherRepository;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using System.Collections.Generic;
namespace Bit.Api.Controllers
@ -18,12 +18,12 @@ namespace Bit.Api.Controllers
{
private readonly IGroupRepository _groupRepository;
private readonly IGroupService _groupService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public GroupsController(
IGroupRepository groupRepository,
IGroupService groupService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_groupRepository = groupRepository;
_groupService = groupService;

View File

@ -6,6 +6,7 @@ using System.Net.Http;
using System.Security.Cryptography;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using System.Net;
using Bit.Core.Exceptions;
using System.Linq;
@ -22,7 +23,7 @@ namespace Bit.Api.Controllers
private static HttpClient _httpClient;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
private readonly string _userAgent;
@ -33,7 +34,7 @@ namespace Bit.Api.Controllers
public HibpController(
IUserService userService,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings)
{
_userService = userService;

View File

@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Bit.Core.Services;
using Microsoft.AspNetCore.Authorization;
using Bit.Core;
using Bit.Core.Context;
using System.Threading.Tasks;
using Bit.Core.Models.Business;
using Bit.Core.Exceptions;
@ -21,7 +21,7 @@ namespace Bit.Api.Controllers
private readonly IUserService _userService;
private readonly IOrganizationRepository _organizationRepository;
private readonly IOrganizationService _organizationService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public LicensesController(
ILicensingService licensingService,
@ -29,7 +29,7 @@ namespace Bit.Api.Controllers
IUserService userService,
IOrganizationRepository organizationRepository,
IOrganizationService organizationService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_licensingService = licensingService;
_userRepository = userRepository;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using System.Collections.Generic;
using Bit.Core.Models.Business;
@ -23,7 +23,7 @@ namespace Bit.Api.Controllers
private readonly ICollectionRepository _collectionRepository;
private readonly IGroupRepository _groupRepository;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public OrganizationUsersController(
IOrganizationRepository organizationRepository,
@ -32,7 +32,7 @@ namespace Bit.Api.Controllers
ICollectionRepository collectionRepository,
IGroupRepository groupRepository,
IUserService userService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_organizationRepository = organizationRepository;
_organizationUserRepository = organizationUserRepository;

View File

@ -9,6 +9,7 @@ using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using Bit.Api.Utilities;
using Bit.Core.Models.Business;
using Bit.Core.Utilities;
@ -24,7 +25,7 @@ namespace Bit.Api.Controllers
private readonly IOrganizationService _organizationService;
private readonly IUserService _userService;
private readonly IPaymentService _paymentService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
private readonly IPolicyRepository _policyRepository;
@ -34,7 +35,7 @@ namespace Bit.Api.Controllers
IOrganizationService organizationService,
IUserService userService,
IPaymentService paymentService,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings,
IPolicyRepository policyRepository)
{

View File

@ -8,6 +8,7 @@ using Bit.Core.Models.Api;
using Bit.Core.Exceptions;
using Bit.Core.Services;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Enums;
using Bit.Core.Utilities;
using Microsoft.AspNetCore.DataProtection;
@ -23,7 +24,7 @@ namespace Bit.Api.Controllers
private readonly IOrganizationService _organizationService;
private readonly IOrganizationUserRepository _organizationUserRepository;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
private readonly IDataProtector _organizationServiceDataProtector;
@ -33,7 +34,7 @@ namespace Bit.Api.Controllers
IOrganizationService organizationService,
IOrganizationUserRepository organizationUserRepository,
IUserService userService,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings,
IDataProtectionProvider dataProtectionProvider)
{

View File

@ -2,6 +2,7 @@
using Bit.Core.Services;
using Microsoft.AspNetCore.Authorization;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Exceptions;
using Bit.Core.Models.Api;
using System.Threading.Tasks;
@ -21,14 +22,14 @@ namespace Bit.Api.Controllers
private readonly IPushRegistrationService _pushRegistrationService;
private readonly IPushNotificationService _pushNotificationService;
private readonly IWebHostEnvironment _environment;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
public PushController(
IPushRegistrationService pushRegistrationService,
IPushNotificationService pushNotificationService,
IWebHostEnvironment environment,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings)
{
_currentContext = currentContext;

View File

@ -10,6 +10,7 @@ using Bit.Core.Models.Table;
using Bit.Core.Enums;
using System.Linq;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Repositories;
using Bit.Core.Utilities;
using Bit.Core.Utilities.Duo;
@ -25,7 +26,7 @@ namespace Bit.Api.Controllers
private readonly IOrganizationService _organizationService;
private readonly GlobalSettings _globalSettings;
private readonly UserManager<User> _userManager;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public TwoFactorController(
IUserService userService,
@ -33,7 +34,7 @@ namespace Bit.Api.Controllers
IOrganizationService organizationService,
GlobalSettings globalSettings,
UserManager<User> userManager,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_userService = userService;
_organizationRepository = organizationRepository;

View File

@ -2,7 +2,7 @@
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Api.Public;
using Bit.Core.Repositories;
using Bit.Core.Services;
@ -17,12 +17,12 @@ namespace Bit.Api.Public.Controllers
{
private readonly ICollectionRepository _collectionRepository;
private readonly ICollectionService _collectionService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public CollectionsController(
ICollectionRepository collectionRepository,
ICollectionService collectionService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_collectionRepository = collectionRepository;
_collectionService = collectionService;

View File

@ -2,7 +2,7 @@
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Api.Public;
using Bit.Core.Models.Data;
using Bit.Core.Repositories;
@ -17,12 +17,12 @@ namespace Bit.Api.Public.Controllers
{
private readonly IEventRepository _eventRepository;
private readonly ICipherRepository _cipherRepository;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public EventsController(
IEventRepository eventRepository,
ICipherRepository cipherRepository,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_eventRepository = eventRepository;
_cipherRepository = cipherRepository;

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Api.Public;
using Bit.Core.Repositories;
using Bit.Core.Services;
@ -18,12 +18,12 @@ namespace Bit.Api.Public.Controllers
{
private readonly IGroupRepository _groupRepository;
private readonly IGroupService _groupService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public GroupsController(
IGroupRepository groupRepository,
IGroupService groupService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_groupRepository = groupRepository;
_groupService = groupService;

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Models.Api.Public;
using Bit.Core.Models.Business;
using Bit.Core.Repositories;
@ -21,14 +21,14 @@ namespace Bit.Api.Public.Controllers
private readonly IGroupRepository _groupRepository;
private readonly IOrganizationService _organizationService;
private readonly IUserService _userService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public MembersController(
IOrganizationUserRepository organizationUserRepository,
IGroupRepository groupRepository,
IOrganizationService organizationService,
IUserService userService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_organizationUserRepository = organizationUserRepository;
_groupRepository = groupRepository;

View File

@ -2,6 +2,7 @@
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Exceptions;
using Bit.Core.Models.Api.Public;
using Bit.Core.Services;
@ -15,12 +16,12 @@ namespace Bit.Api.Public.Controllers
public class OrganizationController : Controller
{
private readonly IOrganizationService _organizationService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings;
public OrganizationController(
IOrganizationService organizationService,
CurrentContext currentContext,
ICurrentContext currentContext,
GlobalSettings globalSettings)
{
_organizationService = organizationService;

View File

@ -2,7 +2,7 @@
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Enums;
using Bit.Core.Models.Api.Public;
using Bit.Core.Repositories;
@ -20,14 +20,14 @@ namespace Bit.Api.Public.Controllers
private readonly IPolicyService _policyService;
private readonly IUserService _userService;
private readonly IOrganizationService _organizationService;
private readonly CurrentContext _currentContext;
private readonly ICurrentContext _currentContext;
public PoliciesController(
IPolicyRepository policyRepository,
IPolicyService policyService,
IUserService userService,
IOrganizationService organizationService,
CurrentContext currentContext)
ICurrentContext currentContext)
{
_policyRepository = policyRepository;
_policyService = policyService;

View File

@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Bit.Api.Utilities;
using Bit.Core;
using Bit.Core.Context;
using Bit.Core.Identity;
using Newtonsoft.Json.Serialization;
using AspNetCoreRateLimit;
@ -54,7 +55,7 @@ namespace Bit.Api
services.AddSqlServerRepositories(globalSettings);
// Context
services.AddScoped<CurrentContext>();
services.AddScoped<ICurrentContext, CurrentContext>();
// Caching
services.AddMemoryCache();