Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AC-1139] Flexible collections: deprecate Manage/Edit/Delete Assigned Collections custom permissions #3360

Merged
merged 141 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
4f08039
[AC-1117] Add manage permission (#3126)
differsthecat Aug 11, 2023
cf78f12
[AC-1374] Limit collection creation/deletion to Owner/Admin (#3145)
vincentsalucci Aug 14, 2023
78bdd51
Merge branch 'master' into feature/flexible-collections
vincentsalucci Aug 14, 2023
2f45726
Merge branch 'master' into feature/flexible-collections
vincentsalucci Aug 24, 2023
d5da5bb
fix: merge conflict resolution
vincentsalucci Aug 24, 2023
e87c20c
Merge branch 'master' into feature/flexible-collections
vincentsalucci Aug 30, 2023
5dc3ca8
[AC-1174] CollectionUser and CollectionGroup authorization handlers (…
shane-melton Aug 30, 2023
e8053e2
Fix improper merge conflict resolution
shane-melton Aug 30, 2023
3dfd38c
Merge branch 'master' into feature/flexible-collections
vincentsalucci Sep 1, 2023
3c9c8ac
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Sep 4, 2023
4ac1b10
Merge branch 'master' into feature/flexible-collections
vincentsalucci Sep 12, 2023
064a28c
fix: add permission check for collection management api, refs AC-1647…
vincentsalucci Sep 12, 2023
acd3997
Merge branch 'master' into feature/flexible-collections
vincentsalucci Sep 13, 2023
34dfdc5
[AC-1125] Enforce org setting for creating/deleting collections (#3241)
vincentsalucci Sep 18, 2023
9f5fec6
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Sep 19, 2023
ffa09d1
Merge branch 'master' into feature/flexible-collections
vincentsalucci Sep 19, 2023
f2acf1c
refactor: remove organizationId from CollectionBulkDeleteRequestModel…
vincentsalucci Sep 20, 2023
2c7d02d
Merge branch 'master' into feature/flexible-collections
eliykat Sep 26, 2023
5d431ad
[AC-1174] Bulk Collection Management (#3229)
shane-melton Sep 26, 2023
a3f554a
[AC-1646] Rename LimitCollectionCdOwnerAdmin column (#3300)
eliykat Sep 26, 2023
30b91cd
Merge branch 'master' into feature/flexible-collections
eliykat Sep 27, 2023
dd10614
Merge branch 'master' into feature/flexible-collections
eliykat Sep 28, 2023
fbb7aa1
[AC-1666] Removed EditAnyCollection from Create/Delete permission che…
vincentsalucci Sep 29, 2023
f7d05e2
Add feature flags constants and flag new route
eliykat Oct 1, 2023
90db41a
Update feature flag keys
eliykat Oct 2, 2023
fbb19cd
Create LegacyCollectionsAuthorizationHandler and start to re-implemen…
eliykat Oct 3, 2023
279d0cc
[AC-1669] Bug - Remove obsolete assignUserId from CollectionService.S…
vincentsalucci Oct 5, 2023
0abd7c3
Merge branch 'master' into feature/flexible-collections
vincentsalucci Oct 5, 2023
fed3252
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Oct 9, 2023
64ec62c
Merge branch 'feature/flexible-collections' into flexible-collections…
eliykat Oct 9, 2023
7aabe7c
Revert "Create LegacyCollectionsAuthorizationHandler and start to re-…
eliykat Oct 9, 2023
8ebac62
Restore old logic behind flags
eliykat Oct 9, 2023
1dad2af
Add missing flags
eliykat Oct 9, 2023
343ab2d
Fix logic, add comment
eliykat Oct 9, 2023
d9b0f01
Fix tests
eliykat Oct 9, 2023
05192a9
Add EnableFeatureFlag extension method for tests
eliykat Oct 10, 2023
ea4b282
Restore legacy tests
eliykat Oct 10, 2023
60ea32b
Add FeatureServiceFixtures to set feature flags in test
eliykat Oct 11, 2023
98b60cf
Remove unused method
eliykat Oct 11, 2023
a87236a
Fix formatting
eliykat Oct 12, 2023
5bdeb7f
Set feature flag to ON for auth handler tests
eliykat Oct 12, 2023
01518de
Use fixture instead of calling nsubstitute directly
eliykat Oct 12, 2023
6bc38ac
Merge branch 'master' into feature/flexible-collections
eliykat Oct 13, 2023
b2f4b66
Merge branch 'feature/flexible-collections' into flexible-collections…
eliykat Oct 13, 2023
fc68bf2
Change FlexibleCollectionsIsEnabled method to property
eliykat Oct 16, 2023
abb23da
Finish changing to property
eliykat Oct 16, 2023
9f4df46
[AC-1139] Marked as obsolete the methods EditAssignedCollections, Del…
r-tome Oct 17, 2023
c2b5d45
[AC-1139] Disabled the ability to set the custom permissions 'Delete/…
r-tome Oct 17, 2023
3b049a6
[AC-1713] [Flexible collections] Add feature flags to server (#3334)
eliykat Oct 17, 2023
ae18e76
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Oct 18, 2023
2f974d6
[AC-1748] Updated CurrentContext EditAssignedCollections, DeleteAssig…
r-tome Oct 19, 2023
09be616
[AC-1748] Created GroupAuthorizationHandler and modified GroupsContro…
r-tome Oct 19, 2023
85de435
[AC-1748] Created OrganizationUserAuthorizationHandler and modified O…
r-tome Oct 19, 2023
1cad986
[AC-1748] Reverted changes on OrganizationService
r-tome Oct 19, 2023
72b9392
Merge branch 'feature/flexible-collections' into flexible-collections…
r-tome Oct 19, 2023
049fc2e
[AC-1748] Removed GroupAuthorizationHandler
r-tome Oct 19, 2023
8c1a3a6
[AC-1748] Set resource as null when reading OrganizationUserUserDetai…
r-tome Oct 19, 2023
1e2908b
[AC-1139] Updated CollectionsController GetManyWithDetails and Get to…
r-tome Oct 19, 2023
dadf29f
[AC-1139] Modified CollectionsController.Get to check access before g…
r-tome Oct 20, 2023
7629882
[AC-1139] Updated CollectionsController to use CollectionAuthorizatio…
r-tome Oct 21, 2023
403e63c
[AC-1139] Lining up collection access data with Manage = true if feat…
r-tome Oct 22, 2023
52e723c
Add joint codeownership for auth handlers (#3346)
eliykat Oct 22, 2023
cd376be
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Oct 22, 2023
d7a19e0
[AC-1139] Separated flexible collections logic from old logic in Coll…
r-tome Oct 23, 2023
e64a7d5
[AC-1139] Fixed formatting on OrganizationUsersController; renamed Or…
r-tome Oct 23, 2023
cb6c411
[AC-1748] Fixed logic to set manage = true for collections if user ha…
r-tome Oct 23, 2023
ad27f3d
[AC-1717] Update default values for LimitCollectionCreationDeletion (…
eliykat Oct 24, 2023
d91eb23
Merge branch 'master' into feature/flexible-collections
eliykat Oct 24, 2023
9d5c5bc
Fix: add missing namespace after merging in master
eliykat Oct 24, 2023
596e0df
Fix: add missing namespace after merging in master
eliykat Oct 24, 2023
3a5c35b
[AC-1683] Fix DB migrations for new Manage permission (#3307)
shane-melton Oct 24, 2023
f00dbf0
[AC-1139] Added permission checks for GroupsController.Get if FC feat…
r-tome Oct 24, 2023
20fe2bc
[AC-1139] Added an AuthorizationHandler for Collections and renamed e…
r-tome Oct 24, 2023
0fe97d7
[AC-1648] [Flexible Collections] Bump migration scripts before featur…
eliykat Oct 24, 2023
c11ba10
Merge branch 'master' into feature/flexible-collections
shane-melton Oct 24, 2023
e574698
[AC-1139] Renamed existing CollectionAuthorizationHandler to BulkColl…
r-tome Oct 25, 2023
5c56b01
[AC-1139] Fixed Provider AuthorizationHandler logic for Groups and Or…
r-tome Oct 25, 2023
18592e4
Merge branch 'feature/flexible-collections' into flexible-collections…
r-tome Oct 25, 2023
57d3abb
[AC-1139] Fixed CollectionAuthorizationHandler unit tests
r-tome Oct 25, 2023
9d8f6ac
[AC-1139] Added unit tests for GroupAuthorizationHandler and Organiza…
r-tome Oct 26, 2023
021eaa4
[AC-1139] Added unit test to test setting users with EditAssignedColl…
r-tome Oct 26, 2023
c47ebed
[AC-1139] Added unit tests for OrganizationService InviteUser and Sav…
r-tome Oct 26, 2023
5f3d350
[AC-1139] Reverted changes on OrganizationService
r-tome Oct 26, 2023
3b52536
[AC-1139] Marked obsolete Permissions EditAssignedCollections and Del…
r-tome Oct 26, 2023
8c78fc2
Merge remote-tracking branch 'origin/master' into feature/flexible-co…
eliykat Oct 27, 2023
9c5f580
Merge branch 'feature/flexible-collections' into flexible-collections…
r-tome Oct 27, 2023
1a56c35
[AC-1139] Renamed FlexibleCollectionsIsEnabled properties to UseFlexi…
r-tome Oct 30, 2023
91de2d8
[AC-1139] Renamed new flexible collections controller methods to have…
r-tome Oct 30, 2023
4642b73
[AC-1139] Created AuthorizationServiceExtensions to have an extension…
r-tome Oct 30, 2023
219cd88
[AC-1139] Renamed CollectionsController method to delete collection u…
r-tome Oct 30, 2023
4b293d7
[AC-1139] Refactored BulkCollectionAuthorizationHandler.CheckCollecti…
r-tome Oct 30, 2023
bd3d66a
[AC-1139] Created new CollectionOperation ReadAccess and changed GetU…
r-tome Oct 30, 2023
c629228
[AC-1139] Created new CollectionOperationRequirement ReadAllWithAccess
r-tome Oct 30, 2023
96ed67a
Merge branch 'master' into feature/flexible-collections
eliykat Oct 30, 2023
b2e4a39
Merge branch 'feature/flexible-collections' into flexible-collections…
r-tome Oct 31, 2023
080d108
[AC-1139] Addressing PR suggestions
r-tome Oct 31, 2023
db19d14
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 1, 2023
52ae10f
[AC-1139] Unit tests refactors and added tests
r-tome Nov 1, 2023
f82508f
[AC-1139] Updated BulkCollectionAuthorizationHandler to not fail if t…
r-tome Nov 2, 2023
5a05eb3
[AC-1139] Modified authorization handlers to not fail in case the res…
r-tome Nov 2, 2023
68a1eb8
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 2, 2023
70209f1
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 2, 2023
c94c853
[AC-1139] Reverted changes made to CollectionService and Organization…
r-tome Nov 2, 2023
98f958f
[AC-1139] Reverted changes to CollectionServiceTests and Organization…
r-tome Nov 2, 2023
5ebf4c8
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 6, 2023
20d0957
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 7, 2023
fc385c1
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 8, 2023
7845381
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 8, 2023
6436efc
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 14, 2023
7c2a197
[AC-1139] Fixed OrganizationUser.ReadAll permissions
r-tome Nov 17, 2023
fa66562
[AC-1139] Fixed Groups ReadAll permissions
r-tome Nov 22, 2023
f63ac56
[AC-1139] Fixed unit tests
r-tome Nov 22, 2023
6215e9f
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 23, 2023
21887c3
[AC-1139] Removed unnecessary permission from GroupAuthorizationHandler
r-tome Nov 24, 2023
0b24fe1
[AC-1139] Rewrote GroupAuthorizationHandler to be similar to other Au…
r-tome Nov 24, 2023
790c48b
[AC-1139] Rewrote OrganizationUserAuthorizationHandler to be similar …
r-tome Nov 24, 2023
e0955a1
[AC-1139] Changed CollectionsController.Get_vNext method to use Colle…
r-tome Nov 24, 2023
22a90de
[AC-1139] Changed GroupAuthorizationHandler and OrganizationUserAutho…
r-tome Nov 24, 2023
95e6211
[AC-1139] Rewrote CollectionAuthorizationHandler to be similar to oth…
r-tome Nov 24, 2023
0229165
[AC-1139] Resolved conflict when resolving operations between Collect…
r-tome Nov 25, 2023
bad95c5
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Nov 29, 2023
e7dc0a4
[AC-1139] Created BulkCollectionOperations.ReadWithAccess
r-tome Nov 29, 2023
b20d75b
[AC-1139] Removed unnecessary permissions object creation on unit tests
r-tome Nov 29, 2023
ade06a8
[AC-1139] Refactored unit test
r-tome Nov 29, 2023
88ed0ab
[AC-1139] Renamed UseFlexibleCollections variables to FlexibleCollect…
r-tome Nov 29, 2023
9d6713d
[AC-1139] Added missing read permission check
r-tome Nov 29, 2023
4431b90
[AC-1139] Added CollectionOperation ReadManyWithDetails
r-tome Nov 29, 2023
238a9cd
[AC-1139] Removed unnecessary operation
r-tome Nov 30, 2023
cb8a1a9
[AC-1139] Throwing NotFoundException on GetManyWithDetails_vNext if u…
r-tome Nov 30, 2023
5428a9e
Revert "[AC-1139] Removed unnecessary permissions object creation on …
r-tome Nov 30, 2023
fd0d5d7
[AC-1139] Refined permissions for BulkCollectionOperations.Read
r-tome Dec 1, 2023
834a0a7
[AC-1139] Revised BulkCollectionAuthorizationHandler permissions for …
r-tome Dec 1, 2023
839a6cd
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Dec 1, 2023
ca8f333
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Dec 4, 2023
7774b74
[AC-1139] Removed duplicate IOrganizationUserRepository
r-tome Dec 4, 2023
85739cc
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
r-tome Dec 5, 2023
3a7f18e
[AC-1139] Added ManageGroups permission access for CollectionOperatio…
r-tome Dec 5, 2023
a5d75bf
[AC-1139] Added ManageUsers permission access for CollectionOperation…
r-tome Dec 5, 2023
75764eb
[AC-1139] Filter returned collections by manage permission
r-tome Dec 5, 2023
d64ac0d
[AC-1139] Refactor Read authorization checks in BulkCollectionAuthori…
r-tome Dec 5, 2023
0a28601
Merge branch 'master' into flexible-collections/deprecate-custom-coll…
eliykat Dec 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions src/Api/AdminConsole/Controllers/GroupsController.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using Bit.Api.AdminConsole.Models.Request;
using Bit.Api.AdminConsole.Models.Response;
using Bit.Api.Models.Response;
using Bit.Api.Utilities;
using Bit.Api.Vault.AuthorizationHandlers.Groups;
using Bit.Core;
using Bit.Core.AdminConsole.OrganizationFeatures.Groups.Interfaces;
using Bit.Core.AdminConsole.Repositories;
using Bit.Core.AdminConsole.Services;
using Bit.Core.Context;
using Bit.Core.Exceptions;
using Bit.Core.Repositories;
using Bit.Core.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

Expand All @@ -23,6 +27,10 @@ public class GroupsController : Controller
private readonly ICurrentContext _currentContext;
private readonly ICreateGroupCommand _createGroupCommand;
private readonly IUpdateGroupCommand _updateGroupCommand;
private readonly IFeatureService _featureService;
private readonly IAuthorizationService _authorizationService;

private bool UseFlexibleCollections => _featureService.IsEnabled(FeatureFlagKeys.FlexibleCollections, _currentContext);

public GroupsController(
IGroupRepository groupRepository,
Expand All @@ -31,7 +39,9 @@ public GroupsController(
ICurrentContext currentContext,
ICreateGroupCommand createGroupCommand,
IUpdateGroupCommand updateGroupCommand,
IDeleteGroupCommand deleteGroupCommand)
IDeleteGroupCommand deleteGroupCommand,
IFeatureService featureService,
IAuthorizationService authorizationService)
{
_groupRepository = groupRepository;
_groupService = groupService;
Expand All @@ -40,6 +50,8 @@ public GroupsController(
_createGroupCommand = createGroupCommand;
_updateGroupCommand = updateGroupCommand;
_deleteGroupCommand = deleteGroupCommand;
_featureService = featureService;
_authorizationService = authorizationService;
}

[HttpGet("{id}")]
Expand Down Expand Up @@ -67,20 +79,26 @@ public async Task<GroupDetailsResponseModel> GetDetails(string orgId, string id)
}

[HttpGet("")]
public async Task<ListResponseModel<GroupDetailsResponseModel>> Get(string orgId)
public async Task<ListResponseModel<GroupDetailsResponseModel>> Get(Guid orgId)
r-tome marked this conversation as resolved.
Show resolved Hide resolved
{
var orgIdGuid = new Guid(orgId);
var canAccess = await _currentContext.ManageGroups(orgIdGuid) ||
await _currentContext.ViewAssignedCollections(orgIdGuid) ||
await _currentContext.ViewAllCollections(orgIdGuid) ||
await _currentContext.ManageUsers(orgIdGuid);
if (UseFlexibleCollections)
{
// New flexible collections logic
return await Get_vNext(orgId);
}

// Old pre-flexible collections logic follows
var canAccess = await _currentContext.ManageGroups(orgId) ||
await _currentContext.ViewAssignedCollections(orgId) ||
await _currentContext.ViewAllCollections(orgId) ||
await _currentContext.ManageUsers(orgId);

if (!canAccess)
{
throw new NotFoundException();
}

var groups = await _groupRepository.GetManyWithCollectionsByOrganizationIdAsync(orgIdGuid);
var groups = await _groupRepository.GetManyWithCollectionsByOrganizationIdAsync(orgId);
var responses = groups.Select(g => new GroupDetailsResponseModel(g.Item1, g.Item2));
return new ListResponseModel<GroupDetailsResponseModel>(responses);
}
Expand Down Expand Up @@ -185,4 +203,18 @@ public async Task Delete(string orgId, string id, string orgUserId)

await _groupService.DeleteUserAsync(group, new Guid(orgUserId));
}

private async Task<ListResponseModel<GroupDetailsResponseModel>> Get_vNext(Guid orgId)
{
var authorized =
(await _authorizationService.AuthorizeAsync(User, GroupOperations.ReadAll(orgId))).Succeeded;
if (!authorized)
{
throw new NotFoundException();
}

var groups = await _groupRepository.GetManyWithCollectionsByOrganizationIdAsync(orgId);
var responses = groups.Select(g => new GroupDetailsResponseModel(g.Item1, g.Item2));
return new ListResponseModel<GroupDetailsResponseModel>(responses);
}
}
29 changes: 21 additions & 8 deletions src/Api/AdminConsole/Controllers/OrganizationUsersController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
using Bit.Api.AdminConsole.Models.Response.Organizations;
using Bit.Api.Models.Request.Organizations;
using Bit.Api.Models.Response;
using Bit.Api.Utilities;
using Bit.Api.Vault.AuthorizationHandlers.OrganizationUsers;
using Bit.Core;
using Bit.Core.AdminConsole.Enums;
using Bit.Core.AdminConsole.Models.Data.Organizations.Policies;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
Expand Down Expand Up @@ -36,6 +39,10 @@ public class OrganizationUsersController : Controller
private readonly IUpdateSecretsManagerSubscriptionCommand _updateSecretsManagerSubscriptionCommand;
private readonly IUpdateOrganizationUserGroupsCommand _updateOrganizationUserGroupsCommand;
private readonly IAcceptOrgUserCommand _acceptOrgUserCommand;
private readonly IFeatureService _featureService;
private readonly IAuthorizationService _authorizationService;

private bool UseFlexibleCollections => _featureService.IsEnabled(FeatureFlagKeys.FlexibleCollections, _currentContext);

public OrganizationUsersController(
IOrganizationRepository organizationRepository,
Expand All @@ -49,7 +56,9 @@ public OrganizationUsersController(
ICountNewSmSeatsRequiredQuery countNewSmSeatsRequiredQuery,
IUpdateSecretsManagerSubscriptionCommand updateSecretsManagerSubscriptionCommand,
IUpdateOrganizationUserGroupsCommand updateOrganizationUserGroupsCommand,
IAcceptOrgUserCommand acceptOrgUserCommand)
IAcceptOrgUserCommand acceptOrgUserCommand,
IFeatureService featureService,
IAuthorizationService authorizationService)
{
_organizationRepository = organizationRepository;
_organizationUserRepository = organizationUserRepository;
Expand All @@ -63,6 +72,8 @@ public OrganizationUsersController(
_updateSecretsManagerSubscriptionCommand = updateSecretsManagerSubscriptionCommand;
_updateOrganizationUserGroupsCommand = updateOrganizationUserGroupsCommand;
_acceptOrgUserCommand = acceptOrgUserCommand;
_featureService = featureService;
_authorizationService = authorizationService;
}

[HttpGet("{id}")]
Expand All @@ -85,18 +96,20 @@ public async Task<OrganizationUserDetailsResponseModel> Get(string id, bool incl
}

[HttpGet("")]
public async Task<ListResponseModel<OrganizationUserUserDetailsResponseModel>> Get(string orgId, bool includeGroups = false, bool includeCollections = false)
public async Task<ListResponseModel<OrganizationUserUserDetailsResponseModel>> Get(Guid orgId, bool includeGroups = false, bool includeCollections = false)
{
var orgGuidId = new Guid(orgId);
if (!await _currentContext.ViewAllCollections(orgGuidId) &&
!await _currentContext.ViewAssignedCollections(orgGuidId) &&
!await _currentContext.ManageGroups(orgGuidId) &&
!await _currentContext.ManageUsers(orgGuidId))
var authorized = UseFlexibleCollections
? (await _authorizationService.AuthorizeAsync(User, OrganizationUserOperations.ReadAll(orgId))).Succeeded
: await _currentContext.ViewAllCollections(orgId) ||
await _currentContext.ViewAssignedCollections(orgId) ||
await _currentContext.ManageGroups(orgId) ||
await _currentContext.ManageUsers(orgId);
if (!authorized)
{
throw new NotFoundException();
}

var organizationUsers = await _organizationUserRepository.GetManyDetailsByOrganizationAsync(orgGuidId, includeGroups, includeCollections);
var organizationUsers = await _organizationUserRepository.GetManyDetailsByOrganizationAsync(orgId, includeGroups, includeCollections);
var responseTasks = organizationUsers.Select(async o => new OrganizationUserUserDetailsResponseModel(o,
await _userService.TwoFactorIsEnabledAsync(o)));
var responses = await Task.WhenAll(responseTasks);
Expand Down
Loading
Loading