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

[AC-1139] Updated BulkCollectionAuthorizationHandler to not fail if the resource list is null or empty.

This commit is contained in:
Rui Tome
2023-11-02 13:06:43 +00:00
parent 52ae10fd50
commit f82508f41a
3 changed files with 137 additions and 41 deletions

View File

@ -44,14 +44,12 @@ public class BulkCollectionAuthorizationHandler : BulkAuthorizationHandler<Colle
// Establish pattern of authorization handler null checking passed resources
if (resources == null || !resources.Any() || !_currentContext.UserId.HasValue)
{
context.Fail();
return;
}
var targetOrganizationId = resources.FirstOrDefault()?.OrganizationId ?? default;
if (targetOrganizationId == default)
{
context.Fail();
return;
}

View File

@ -35,7 +35,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.CreateNewCollections = createNewCollection;
organization.Permissions = new Permissions
{
CreateNewCollections = createNewCollection
};
organization.LimitCollectionCreationDeletion = limitCollectionCreateDelete;
var context = new AuthorizationHandlerContext(
@ -60,7 +63,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions.CreateNewCollections = false;
organization.Permissions = new Permissions
{
CreateNewCollections = false
};
organization.LimitCollectionCreationDeletion = true;
var context = new AuthorizationHandlerContext(
@ -89,7 +95,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.CreateNewCollections = false;
organization.Permissions = new Permissions
{
CreateNewCollections = false
};
organization.LimitCollectionCreationDeletion = true;
var context = new AuthorizationHandlerContext(
@ -117,6 +126,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Read },
@ -140,6 +150,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Read },
@ -167,8 +178,11 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.Custom;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions.DeleteAnyCollection = deleteAnyCollection;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection,
DeleteAnyCollection = deleteAnyCollection
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Read },
@ -192,6 +206,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Read },
@ -219,8 +234,11 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.EditAnyCollection = false;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false,
DeleteAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Read },
@ -247,6 +265,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAccess },
@ -270,6 +289,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAccess },
@ -297,8 +317,11 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.Custom;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions.DeleteAnyCollection = deleteAnyCollection;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection,
DeleteAnyCollection = deleteAnyCollection
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAccess },
@ -322,6 +345,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAccess },
@ -349,8 +373,11 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.EditAnyCollection = false;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false,
DeleteAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAccess },
@ -385,7 +412,10 @@ public class BulkCollectionAuthorizationHandlerTests
}
organization.Type = userType;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Update },
@ -410,7 +440,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions.EditAnyCollection = false;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Update },
@ -444,7 +474,10 @@ public class BulkCollectionAuthorizationHandlerTests
// Ensure the user is not an owner/admin and does not have edit any collection permission
organization.Type = OrganizationUserType.User;
organization.Permissions.EditAnyCollection = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Update },
@ -483,7 +516,10 @@ public class BulkCollectionAuthorizationHandlerTests
}
organization.Type = userType;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ModifyAccess },
@ -508,7 +544,7 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions.EditAnyCollection = false;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ModifyAccess },
@ -542,7 +578,10 @@ public class BulkCollectionAuthorizationHandlerTests
// Ensure the user is not an owner/admin and does not have edit any collection permission
organization.Type = OrganizationUserType.User;
organization.Permissions.EditAnyCollection = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ModifyAccess },
@ -580,7 +619,10 @@ public class BulkCollectionAuthorizationHandlerTests
}
organization.Type = userType;
organization.Permissions.DeleteAnyCollection = deleteAnyCollection;
organization.Permissions = new Permissions
{
DeleteAnyCollection = deleteAnyCollection
};
organization.LimitCollectionCreationDeletion = limitCollectionCreateDelete;
var context = new AuthorizationHandlerContext(
@ -606,7 +648,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.User;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions = new Permissions
{
DeleteAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Delete },
@ -631,7 +676,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.Custom;
organization.Permissions.DeleteAnyCollection = true;
organization.Permissions = new Permissions
{
DeleteAnyCollection = true
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Delete },
@ -658,7 +706,10 @@ public class BulkCollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions = new Permissions
{
DeleteAnyCollection = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Delete },
@ -674,7 +725,39 @@ public class BulkCollectionAuthorizationHandlerTests
}
[Theory, BitAutoData, CollectionCustomization]
public async Task HandleRequirementAsync_MissingUserId_Failure(
public async Task HandleRequirementAsync_NullResource_NoSuccessOrFailure(
SutProvider<BulkCollectionAuthorizationHandler> sutProvider)
{
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Create },
new ClaimsPrincipal(),
null
);
await sutProvider.Sut.HandleAsync(context);
Assert.False(context.HasSucceeded);
Assert.False(context.HasFailed);
}
[Theory, BitAutoData, CollectionCustomization]
public async Task HandleRequirementAsync_EmptyResourceList_NoSuccessOrFailure(
SutProvider<BulkCollectionAuthorizationHandler> sutProvider)
{
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.Create },
new ClaimsPrincipal(),
new List<Collection>()
);
await sutProvider.Sut.HandleAsync(context);
Assert.False(context.HasSucceeded);
Assert.False(context.HasFailed);
}
[Theory, BitAutoData, CollectionCustomization]
public async Task HandleRequirementAsync_MissingUserId_NoSuccessOrFailure(
SutProvider<BulkCollectionAuthorizationHandler> sutProvider,
ICollection<Collection> collections)
{
@ -688,7 +771,8 @@ public class BulkCollectionAuthorizationHandlerTests
sutProvider.GetDependency<ICurrentContext>().UserId.Returns((Guid?)null);
await sutProvider.Sut.HandleAsync(context);
Assert.True(context.HasFailed);
Assert.False(context.HasSucceeded);
Assert.False(context.HasFailed);
sutProvider.GetDependency<ICollectionRepository>().DidNotReceiveWithAnyArgs();
}

View File

@ -26,6 +26,7 @@ public class CollectionAuthorizationHandlerTests
CurrentContextOrganization organization)
{
organization.Type = userType;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAll(organization.Id) },
@ -46,6 +47,7 @@ public class CollectionAuthorizationHandlerTests
SutProvider<CollectionAuthorizationHandler> sutProvider, CurrentContextOrganization organization)
{
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAll(organization.Id) },
@ -76,9 +78,12 @@ public class CollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.Custom;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions.DeleteAnyCollection = deleteAnyCollection;
organization.Permissions.AccessImportExport = accessImportExport;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection,
DeleteAnyCollection = deleteAnyCollection,
AccessImportExport = accessImportExport
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAll(organization.Id) },
@ -104,9 +109,12 @@ public class CollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.EditAnyCollection = false;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions.AccessImportExport = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false,
DeleteAnyCollection = false,
AccessImportExport = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAll(organization.Id) },
@ -130,6 +138,7 @@ public class CollectionAuthorizationHandlerTests
CurrentContextOrganization organization)
{
organization.Type = userType;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAllWithAccess(organization.Id) },
@ -150,6 +159,7 @@ public class CollectionAuthorizationHandlerTests
SutProvider<CollectionAuthorizationHandler> sutProvider, CurrentContextOrganization organization)
{
organization.Type = OrganizationUserType.User;
organization.Permissions = new Permissions();
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAllWithAccess(organization.Id) },
@ -169,20 +179,21 @@ public class CollectionAuthorizationHandlerTests
}
[Theory]
[BitAutoData(true, false, false)]
[BitAutoData(false, true, false)]
[BitAutoData(false, false, true)]
[BitAutoData(true, false)]
[BitAutoData(false, true)]
public async Task CanReadAllWithAccessAsync_WhenCustomUserWithRequiredPermissions_Success(
bool editAnyCollection, bool deleteAnyCollection, bool accessImportExport,
bool editAnyCollection, bool deleteAnyCollection,
SutProvider<CollectionAuthorizationHandler> sutProvider,
CurrentContextOrganization organization)
{
var actingUserId = Guid.NewGuid();
organization.Type = OrganizationUserType.Custom;
organization.Permissions.EditAnyCollection = editAnyCollection;
organization.Permissions.DeleteAnyCollection = deleteAnyCollection;
organization.Permissions.AccessImportExport = accessImportExport;
organization.Permissions = new Permissions
{
EditAnyCollection = editAnyCollection,
DeleteAnyCollection = deleteAnyCollection,
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAllWithAccess(organization.Id) },
@ -208,9 +219,12 @@ public class CollectionAuthorizationHandlerTests
var actingUserId = Guid.NewGuid();
organization.Type = userType;
organization.Permissions.EditAnyCollection = false;
organization.Permissions.DeleteAnyCollection = false;
organization.Permissions.AccessImportExport = false;
organization.Permissions = new Permissions
{
EditAnyCollection = false,
DeleteAnyCollection = false,
AccessImportExport = false
};
var context = new AuthorizationHandlerContext(
new[] { CollectionOperations.ReadAllWithAccess(organization.Id) },