diff --git a/src/Api/Vault/AuthorizationHandlers/Groups/GroupAuthorizationHandler.cs b/src/Api/Vault/AuthorizationHandlers/Groups/GroupAuthorizationHandler.cs index 7a74c35dbd..666cd725e4 100644 --- a/src/Api/Vault/AuthorizationHandlers/Groups/GroupAuthorizationHandler.cs +++ b/src/Api/Vault/AuthorizationHandlers/Groups/GroupAuthorizationHandler.cs @@ -1,8 +1,5 @@ #nullable enable using Bit.Core.Context; -using Bit.Core.Enums; -using Bit.Core.Models.Data.Organizations; -using Bit.Core.Services; using Microsoft.AspNetCore.Authorization; namespace Bit.Api.Vault.AuthorizationHandlers.Groups; @@ -14,17 +11,10 @@ namespace Bit.Api.Vault.AuthorizationHandlers.Groups; public class GroupAuthorizationHandler : AuthorizationHandler { private readonly ICurrentContext _currentContext; - private readonly IFeatureService _featureService; - private readonly IApplicationCacheService _applicationCacheService; - public GroupAuthorizationHandler( - ICurrentContext currentContext, - IFeatureService featureService, - IApplicationCacheService applicationCacheService) + public GroupAuthorizationHandler(ICurrentContext currentContext) { _currentContext = currentContext; - _featureService = featureService; - _applicationCacheService = applicationCacheService; } protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, @@ -56,22 +46,8 @@ public class GroupAuthorizationHandler : AuthorizationHandler GetOrganizationAbilityAsync(CurrentContextOrganization? organization) - { - // If the CurrentContextOrganization is null, then the user isn't a member of the org so the setting is - // irrelevant - if (organization == null) - { - return null; - } - - return await _applicationCacheService.GetOrganizationAbilityAsync(organization.Id); - } } diff --git a/src/Api/Vault/AuthorizationHandlers/OrganizationUsers/OrganizationUserAuthorizationHandler.cs b/src/Api/Vault/AuthorizationHandlers/OrganizationUsers/OrganizationUserAuthorizationHandler.cs index 28b60cb0c0..4b267242a3 100644 --- a/src/Api/Vault/AuthorizationHandlers/OrganizationUsers/OrganizationUserAuthorizationHandler.cs +++ b/src/Api/Vault/AuthorizationHandlers/OrganizationUsers/OrganizationUserAuthorizationHandler.cs @@ -1,8 +1,5 @@ #nullable enable using Bit.Core.Context; -using Bit.Core.Enums; -using Bit.Core.Models.Data.Organizations; -using Bit.Core.Services; using Microsoft.AspNetCore.Authorization; namespace Bit.Api.Vault.AuthorizationHandlers.OrganizationUsers; @@ -14,17 +11,10 @@ namespace Bit.Api.Vault.AuthorizationHandlers.OrganizationUsers; public class OrganizationUserAuthorizationHandler : AuthorizationHandler { private readonly ICurrentContext _currentContext; - private readonly IFeatureService _featureService; - private readonly IApplicationCacheService _applicationCacheService; - public OrganizationUserAuthorizationHandler( - ICurrentContext currentContext, - IFeatureService featureService, - IApplicationCacheService applicationCacheService) + public OrganizationUserAuthorizationHandler(ICurrentContext currentContext) { _currentContext = currentContext; - _featureService = featureService; - _applicationCacheService = applicationCacheService; } protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, @@ -55,26 +45,10 @@ public class OrganizationUserAuthorizationHandler : AuthorizationHandler GetOrganizationAbilityAsync(CurrentContextOrganization? organization) - { - // If the CurrentContextOrganization is null, then the user isn't a member of the org so the setting is - // irrelevant - if (organization == null) - { - return null; - } - - return await _applicationCacheService.GetOrganizationAbilityAsync(organization.Id); - } } diff --git a/test/Api.Test/Vault/AuthorizationHandlers/GroupAuthorizationHandlerTests.cs b/test/Api.Test/Vault/AuthorizationHandlers/GroupAuthorizationHandlerTests.cs index 8ba03930ef..608e201c50 100644 --- a/test/Api.Test/Vault/AuthorizationHandlers/GroupAuthorizationHandlerTests.cs +++ b/test/Api.Test/Vault/AuthorizationHandlers/GroupAuthorizationHandlerTests.cs @@ -3,8 +3,6 @@ using Bit.Api.Vault.AuthorizationHandlers.Groups; using Bit.Core.Context; using Bit.Core.Enums; using Bit.Core.Models.Data; -using Bit.Core.Models.Data.Organizations; -using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Authorization; @@ -19,7 +17,9 @@ public class GroupAuthorizationHandlerTests [Theory] [BitAutoData(OrganizationUserType.Admin)] [BitAutoData(OrganizationUserType.Owner)] - public async Task CanReadAllAsync_WhenAdminOrOwner_Success( + [BitAutoData(OrganizationUserType.User)] + [BitAutoData(OrganizationUserType.Custom)] + public async Task CanReadAllAsync_WhenMemberOfOrg_Success( OrganizationUserType userType, Guid userId, SutProvider sutProvider, CurrentContextOrganization organization) @@ -27,8 +27,6 @@ public class GroupAuthorizationHandlerTests organization.Type = userType; organization.Permissions = new Permissions(); - ArrangeOrganizationAbility(sutProvider, organization, true); - var context = new AuthorizationHandlerContext( new[] { GroupOperations.ReadAll(organization.Id) }, new ClaimsPrincipal(), @@ -50,8 +48,6 @@ public class GroupAuthorizationHandlerTests organization.Type = OrganizationUserType.User; organization.Permissions = new Permissions(); - ArrangeOrganizationAbility(sutProvider, organization, true); - var context = new AuthorizationHandlerContext( new[] { GroupOperations.ReadAll(organization.Id) }, new ClaimsPrincipal(), @@ -69,87 +65,12 @@ public class GroupAuthorizationHandlerTests Assert.True(context.HasSucceeded); } - [Theory] - [BitAutoData(true, false, false, false, true)] - [BitAutoData(false, true, false, false, true)] - [BitAutoData(false, false, true, false, true)] - [BitAutoData(false, false, false, true, true)] - [BitAutoData(false, false, false, false, false)] - public async Task CanReadAllAsync_WhenCustomUserWithRequiredPermissions_Success( - bool editAnyCollection, bool deleteAnyCollection, bool manageGroups, - bool manageUsers, bool limitCollectionCreationDeletion, - SutProvider sutProvider, - CurrentContextOrganization organization) - { - var actingUserId = Guid.NewGuid(); - - organization.Type = OrganizationUserType.Custom; - organization.Permissions = new Permissions - { - EditAnyCollection = editAnyCollection, - DeleteAnyCollection = deleteAnyCollection, - ManageGroups = manageGroups, - ManageUsers = manageUsers - }; - - ArrangeOrganizationAbility(sutProvider, organization, limitCollectionCreationDeletion); - - var context = new AuthorizationHandlerContext( - new[] { GroupOperations.ReadAll(organization.Id) }, - new ClaimsPrincipal(), - null); - - sutProvider.GetDependency().UserId.Returns(actingUserId); - sutProvider.GetDependency().GetOrganization(organization.Id).Returns(organization); - - await sutProvider.Sut.HandleAsync(context); - - Assert.True(context.HasSucceeded); - } - - [Theory] - [BitAutoData(OrganizationUserType.User)] - [BitAutoData(OrganizationUserType.Custom)] - public async Task CanReadAllAsync_WhenMissingPermissions_NoSuccess( - OrganizationUserType userType, - SutProvider sutProvider, - CurrentContextOrganization organization) - { - var actingUserId = Guid.NewGuid(); - - organization.Type = userType; - organization.Permissions = new Permissions - { - EditAnyCollection = false, - DeleteAnyCollection = false, - ManageGroups = false, - ManageUsers = false, - AccessImportExport = false - }; - - ArrangeOrganizationAbility(sutProvider, organization, true); - - var context = new AuthorizationHandlerContext( - new[] { GroupOperations.ReadAll(organization.Id) }, - new ClaimsPrincipal(), - null); - - sutProvider.GetDependency().UserId.Returns(actingUserId); - sutProvider.GetDependency().GetOrganization(organization.Id).Returns(organization); - sutProvider.GetDependency().ProviderUserForOrgAsync(Arg.Any()).Returns(false); - - await sutProvider.Sut.HandleAsync(context); - - Assert.False(context.HasSucceeded); - } - [Theory, BitAutoData] public async Task CanReadAllAsync_WhenMissingOrgAccess_NoSuccess( Guid userId, CurrentContextOrganization organization, SutProvider sutProvider) { - ArrangeOrganizationAbility(sutProvider, organization, true); var context = new AuthorizationHandlerContext( new[] { GroupOperations.ReadAll(organization.Id) }, @@ -201,17 +122,4 @@ public class GroupAuthorizationHandlerTests Assert.False(context.HasSucceeded); Assert.True(context.HasFailed); } - - private static void ArrangeOrganizationAbility( - SutProvider sutProvider, - CurrentContextOrganization organization, bool limitCollectionCreationDeletion) - { - var organizationAbility = new OrganizationAbility(); - organizationAbility.Id = organization.Id; - organizationAbility.FlexibleCollections = true; - organizationAbility.LimitCollectionCreationDeletion = limitCollectionCreationDeletion; - - sutProvider.GetDependency().GetOrganizationAbilityAsync(organizationAbility.Id) - .Returns(organizationAbility); - } } diff --git a/test/Api.Test/Vault/AuthorizationHandlers/OrganizationUserAuthorizationHandlerTests.cs b/test/Api.Test/Vault/AuthorizationHandlers/OrganizationUserAuthorizationHandlerTests.cs index d6c22197fe..0d7090e688 100644 --- a/test/Api.Test/Vault/AuthorizationHandlers/OrganizationUserAuthorizationHandlerTests.cs +++ b/test/Api.Test/Vault/AuthorizationHandlers/OrganizationUserAuthorizationHandlerTests.cs @@ -3,8 +3,6 @@ using Bit.Api.Vault.AuthorizationHandlers.OrganizationUsers; using Bit.Core.Context; using Bit.Core.Enums; using Bit.Core.Models.Data; -using Bit.Core.Models.Data.Organizations; -using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Authorization; @@ -19,7 +17,9 @@ public class OrganizationUserAuthorizationHandlerTests [Theory] [BitAutoData(OrganizationUserType.Admin)] [BitAutoData(OrganizationUserType.Owner)] - public async Task CanReadAllAsync_WhenAdminOrOwner_Success( + [BitAutoData(OrganizationUserType.User)] + [BitAutoData(OrganizationUserType.Custom)] + public async Task CanReadAllAsync_WhenMemberOfOrg_Success( OrganizationUserType userType, Guid userId, SutProvider sutProvider, CurrentContextOrganization organization) @@ -27,8 +27,6 @@ public class OrganizationUserAuthorizationHandlerTests organization.Type = userType; organization.Permissions = new Permissions(); - ArrangeOrganizationAbility(sutProvider, organization, true); - var context = new AuthorizationHandlerContext( new[] { OrganizationUserOperations.ReadAll(organization.Id) }, new ClaimsPrincipal(), @@ -50,8 +48,6 @@ public class OrganizationUserAuthorizationHandlerTests organization.Type = OrganizationUserType.User; organization.Permissions = new Permissions(); - ArrangeOrganizationAbility(sutProvider, organization, true); - var context = new AuthorizationHandlerContext( new[] { OrganizationUserOperations.ReadAll(organization.Id) }, new ClaimsPrincipal(), @@ -69,87 +65,12 @@ public class OrganizationUserAuthorizationHandlerTests Assert.True(context.HasSucceeded); } - [Theory] - [BitAutoData(true, false, false, false, true)] - [BitAutoData(false, true, false, false, true)] - [BitAutoData(false, false, true, false, true)] - [BitAutoData(false, false, false, true, true)] - [BitAutoData(false, false, false, false, false)] - public async Task CanReadAllAsync_WhenCustomUserWithRequiredPermissions_Success( - bool editAnyCollection, bool deleteAnyCollection, bool manageGroups, - bool manageUsers, bool limitCollectionCreationDeletion, - SutProvider sutProvider, - CurrentContextOrganization organization) - { - var actingUserId = Guid.NewGuid(); - - organization.Type = OrganizationUserType.Custom; - organization.Permissions = new Permissions - { - EditAnyCollection = editAnyCollection, - DeleteAnyCollection = deleteAnyCollection, - ManageGroups = manageGroups, - ManageUsers = manageUsers - }; - - ArrangeOrganizationAbility(sutProvider, organization, limitCollectionCreationDeletion); - - var context = new AuthorizationHandlerContext( - new[] { OrganizationUserOperations.ReadAll(organization.Id) }, - new ClaimsPrincipal(), - null); - - sutProvider.GetDependency().UserId.Returns(actingUserId); - sutProvider.GetDependency().GetOrganization(organization.Id).Returns(organization); - - await sutProvider.Sut.HandleAsync(context); - - Assert.True(context.HasSucceeded); - } - - [Theory] - [BitAutoData(OrganizationUserType.User)] - [BitAutoData(OrganizationUserType.Custom)] - public async Task CanReadAllAsync_WhenMissingPermissions_NoSuccess( - OrganizationUserType userType, - SutProvider sutProvider, - CurrentContextOrganization organization) - { - var actingUserId = Guid.NewGuid(); - - organization.Type = userType; - organization.Permissions = new Permissions - { - EditAnyCollection = false, - DeleteAnyCollection = false, - ManageGroups = false, - ManageUsers = false - }; - - ArrangeOrganizationAbility(sutProvider, organization, true); - - var context = new AuthorizationHandlerContext( - new[] { OrganizationUserOperations.ReadAll(organization.Id) }, - new ClaimsPrincipal(), - null); - - sutProvider.GetDependency().UserId.Returns(actingUserId); - sutProvider.GetDependency().GetOrganization(organization.Id).Returns(organization); - sutProvider.GetDependency().ProviderUserForOrgAsync(Arg.Any()).Returns(false); - - await sutProvider.Sut.HandleAsync(context); - - Assert.False(context.HasSucceeded); - } - [Theory, BitAutoData] public async Task HandleRequirementAsync_WhenMissingOrgAccess_NoSuccess( Guid userId, CurrentContextOrganization organization, SutProvider sutProvider) { - ArrangeOrganizationAbility(sutProvider, organization, true); - var context = new AuthorizationHandlerContext( new[] { OrganizationUserOperations.ReadAll(organization.Id) }, new ClaimsPrincipal(), @@ -198,17 +119,4 @@ public class OrganizationUserAuthorizationHandlerTests Assert.True(context.HasFailed); } - - private static void ArrangeOrganizationAbility( - SutProvider sutProvider, - CurrentContextOrganization organization, bool limitCollectionCreationDeletion) - { - var organizationAbility = new OrganizationAbility(); - organizationAbility.Id = organization.Id; - organizationAbility.FlexibleCollections = true; - organizationAbility.LimitCollectionCreationDeletion = limitCollectionCreationDeletion; - - sutProvider.GetDependency().GetOrganizationAbilityAsync(organizationAbility.Id) - .Returns(organizationAbility); - } }