1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-30 15:42:48 -05:00

[AC-2084] Include Collection permissions for admin endpoints (#3793)

* [AC-2084] Add documentation to existing collection repository getters

* [AC-2084] Add new CollectionAdminDetails model

* [AC-2084] Add SQL and migration scripts

* [AC-2084] Introduce new repository methods to include permission details for collections

* [AC-2084] Add EF repository methods and integration tests

* [AC-2084] Update CollectionsController and response models

* [AC-2084] Fix failing SqlServer test

* [AC-2084] Clean up admin endpoint response models
- vNext endpoints should now always return CollectionDetailsResponse models
- Update constructors in CollectionDetailsResponseModel to be more explicit and add named static constructors for additional clarity

* [AC-2084] Fix failing tests

* [AC-2084] Fix potential provider/member bug

* [AC-2084] Fix broken collections controller

* [AC-2084] Cleanup collection response model types and constructors

* [AC-2084] Remove redundant authorization check

* [AC-2084] Cleanup ambiguous model name

* [AC-2084] Add GroupBy clause to sprocs

* [AC-2084] Add GroupBy logic to EF repository

* [AC-2084] Update collection repository tests

* [AC-2084] Update migration script date

* Update migration script date

---------

Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com>
Co-authored-by: kejaeger <138028972+kejaeger@users.noreply.github.com>
This commit is contained in:
Shane Melton
2024-05-03 06:33:06 -07:00
committed by GitHub
parent 25c87214ff
commit d965166a37
14 changed files with 1232 additions and 45 deletions

View File

@ -26,8 +26,15 @@ public class CollectionResponseModel : ResponseModel
public string ExternalId { get; set; }
}
/// <summary>
/// Response model for a collection that is always assigned to the requesting user, including permissions.
/// </summary>
public class CollectionDetailsResponseModel : CollectionResponseModel
{
/// <summary>
/// Create a response model for when the user is assumed to be assigned to the collection with permissions.
/// e.g. The collection details comes from a repository method that only returns collections the user is assigned to.
/// </summary>
public CollectionDetailsResponseModel(CollectionDetails collectionDetails)
: base(collectionDetails, "collectionDetails")
{
@ -43,6 +50,27 @@ public class CollectionDetailsResponseModel : CollectionResponseModel
public class CollectionAccessDetailsResponseModel : CollectionResponseModel
{
/// <summary>
/// Create a response model for when the requesting user is assumed not assigned to the collection.
/// No user permissions are included.
///
/// Ideally, the CollectionAdminDetails constructor should be used instead wherever possible. This is only
/// used in the case of MSPs where the Provider user will likely never be assigned to the collection.
/// </summary>
/// <param name="collection"></param>
public CollectionAccessDetailsResponseModel(Collection collection)
: base(collection, "collectionAccessDetails")
{ }
/// <summary>
/// Create a response model for when the requesting user is assumed not assigned to the collection. Includes
/// the other groups and user relationships for the collection.
/// No user permissions are included.
/// </summary>
/// <param name="collection"></param>
/// <param name="groups"></param>
/// <param name="users"></param>
[Obsolete("Use the CollectionAdminDetails constructor instead.")]
public CollectionAccessDetailsResponseModel(Collection collection, IEnumerable<CollectionAccessSelection> groups, IEnumerable<CollectionAccessSelection> users)
: base(collection, "collectionAccessDetails")
{
@ -50,6 +78,21 @@ public class CollectionAccessDetailsResponseModel : CollectionResponseModel
Users = users.Select(g => new SelectionReadOnlyResponseModel(g));
}
/// <summary>
/// Create a response model for when the requesting user's assignment is available via CollectionAdminDetails.
/// </summary>
/// <param name="collection"></param>
public CollectionAccessDetailsResponseModel(CollectionAdminDetails collection)
: base(collection, "collectionAccessDetails")
{
Assigned = collection.Assigned;
ReadOnly = collection.ReadOnly;
HidePasswords = collection.HidePasswords;
Manage = collection.Manage;
Groups = collection.Groups?.Select(g => new SelectionReadOnlyResponseModel(g)) ?? Enumerable.Empty<SelectionReadOnlyResponseModel>();
Users = collection.Users?.Select(g => new SelectionReadOnlyResponseModel(g)) ?? Enumerable.Empty<SelectionReadOnlyResponseModel>();
}
public IEnumerable<SelectionReadOnlyResponseModel> Groups { get; set; }
public IEnumerable<SelectionReadOnlyResponseModel> Users { get; set; }
@ -57,4 +100,8 @@ public class CollectionAccessDetailsResponseModel : CollectionResponseModel
/// True if the acting user is explicitly assigned to the collection
/// </summary>
public bool Assigned { get; set; }
public bool ReadOnly { get; set; }
public bool HidePasswords { get; set; }
public bool Manage { get; set; }
}