Skip to content

Commit 092b0b8

Browse files
authored
Remove LimitCollectionCreationDeletionSplit feature flag (#4809)
* Remove references to feature flag * Demote entity property to an EF shadow property * Add a few excludes to license file tests
1 parent 2333a93 commit 092b0b8

File tree

24 files changed

+75
-652
lines changed

24 files changed

+75
-652
lines changed

src/Admin/AdminConsole/Views/Organizations/_ViewInformation.cshtml

+5-13
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,11 @@
5555
<dt class="col-sm-4 col-lg-3">Administrators manage all collections</dt>
5656
<dd id="pm-manage-collections" class="col-sm-8 col-lg-9">@(Model.Organization.AllowAdminAccessToAllCollectionItems ? "On" : "Off")</dd>
5757

58-
@if (!FeatureService.IsEnabled(Bit.Core.FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
59-
{
60-
<dt class="col-sm-4 col-lg-3">Limit collection creation to administrators</dt>
61-
<dd id="pm-collection-creation" class="col-sm-8 col-lg-9">@(Model.Organization.LimitCollectionCreationDeletion ? "On" : "Off")</dd>
62-
}
63-
else
64-
{
65-
<dt class="col-sm-4 col-lg-3">Limit collection creation to administrators</dt>
66-
<dd id="pm-collection-creation" class="col-sm-8 col-lg-9">@(Model.Organization.LimitCollectionCreation ? "On" : "Off")</dd>
67-
68-
<dt class="col-sm-4 col-lg-3">Limit collection deletion to administrators</dt>
69-
<dd id="pm-collection-deletion" class="col-sm-8 col-lg-9">@(Model.Organization.LimitCollectionDeletion ? "On" : "Off")</dd>
70-
}
58+
<dt class="col-sm-4 col-lg-3">Limit collection creation to administrators</dt>
59+
<dd id="pm-collection-creation" class="col-sm-8 col-lg-9">@(Model.Organization.LimitCollectionCreation ? "On" : "Off")</dd>
60+
61+
<dt class="col-sm-4 col-lg-3">Limit collection deletion to administrators</dt>
62+
<dd id="pm-collection-deletion" class="col-sm-8 col-lg-9">@(Model.Organization.LimitCollectionDeletion ? "On" : "Off")</dd>
7163
</dl>
7264

7365
<h2>Secrets Manager</h2>

src/Api/AdminConsole/Controllers/OrganizationsController.cs

-8
Original file line numberDiff line numberDiff line change
@@ -526,14 +526,6 @@ public async Task<OrganizationSsoResponseModel> PostSso(Guid id, [FromBody] Orga
526526
[HttpPut("{id}/collection-management")]
527527
public async Task<OrganizationResponseModel> PutCollectionManagement(Guid id, [FromBody] OrganizationCollectionManagementUpdateRequestModel model)
528528
{
529-
if (
530-
_globalSettings.SelfHosted &&
531-
!_featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit)
532-
)
533-
{
534-
throw new BadRequestException("Only allowed when not self hosted.");
535-
}
536-
537529
var organization = await _organizationRepository.GetByIdAsync(id);
538530
if (organization == null)
539531
{

src/Api/AdminConsole/Models/Response/Organizations/OrganizationResponseModel.cs

-4
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ public OrganizationResponseModel(Organization organization, string obj = "organi
5757
MaxAutoscaleSmServiceAccounts = organization.MaxAutoscaleSmServiceAccounts;
5858
LimitCollectionCreation = organization.LimitCollectionCreation;
5959
LimitCollectionDeletion = organization.LimitCollectionDeletion;
60-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
61-
LimitCollectionCreationDeletion = organization.LimitCollectionCreationDeletion;
6260
AllowAdminAccessToAllCollectionItems = organization.AllowAdminAccessToAllCollectionItems;
6361
UseRiskInsights = organization.UseRiskInsights;
6462
}
@@ -104,8 +102,6 @@ public OrganizationResponseModel(Organization organization, string obj = "organi
104102
public int? MaxAutoscaleSmServiceAccounts { get; set; }
105103
public bool LimitCollectionCreation { get; set; }
106104
public bool LimitCollectionDeletion { get; set; }
107-
// Deperectated: https://bitwarden.atlassian.net/browse/PM-10863
108-
public bool LimitCollectionCreationDeletion { get; set; }
109105
public bool AllowAdminAccessToAllCollectionItems { get; set; }
110106
public bool UseRiskInsights { get; set; }
111107
}

src/Api/AdminConsole/Models/Response/ProfileOrganizationResponseModel.cs

-4
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ public ProfileOrganizationResponseModel(
6767
AccessSecretsManager = organization.AccessSecretsManager;
6868
LimitCollectionCreation = organization.LimitCollectionCreation;
6969
LimitCollectionDeletion = organization.LimitCollectionDeletion;
70-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
71-
LimitCollectionCreationDeletion = organization.LimitCollectionCreationDeletion;
7270
AllowAdminAccessToAllCollectionItems = organization.AllowAdminAccessToAllCollectionItems;
7371
UserIsManagedByOrganization = organizationIdsManagingUser.Contains(organization.OrganizationId);
7472
UseRiskInsights = organization.UseRiskInsights;
@@ -130,8 +128,6 @@ public ProfileOrganizationResponseModel(
130128
public bool AccessSecretsManager { get; set; }
131129
public bool LimitCollectionCreation { get; set; }
132130
public bool LimitCollectionDeletion { get; set; }
133-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
134-
public bool LimitCollectionCreationDeletion { get; set; }
135131
public bool AllowAdminAccessToAllCollectionItems { get; set; }
136132
/// <summary>
137133
/// Indicates if the organization manages the user.

src/Api/AdminConsole/Models/Response/ProfileProviderOrganizationResponseModel.cs

-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ public ProfileProviderOrganizationResponseModel(ProviderUserOrganizationDetails
4646
ProductTierType = StaticStore.GetPlan(organization.PlanType).ProductTier;
4747
LimitCollectionCreation = organization.LimitCollectionCreation;
4848
LimitCollectionDeletion = organization.LimitCollectionDeletion;
49-
// https://bitwarden.atlassian.net/browse/PM-10863
50-
LimitCollectionCreationDeletion = organization.LimitCollectionCreationDeletion;
5149
AllowAdminAccessToAllCollectionItems = organization.AllowAdminAccessToAllCollectionItems;
5250
UseRiskInsights = organization.UseRiskInsights;
5351
}

src/Api/Models/Request/Organizations/OrganizationCollectionManagementUpdateRequestModel.cs

+3-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Bit.Core;
2-
using Bit.Core.AdminConsole.Entities;
1+
using Bit.Core.AdminConsole.Entities;
32
using Bit.Core.Services;
43

54
namespace Bit.Api.Models.Request.Organizations;
@@ -8,22 +7,12 @@ public class OrganizationCollectionManagementUpdateRequestModel
87
{
98
public bool LimitCollectionCreation { get; set; }
109
public bool LimitCollectionDeletion { get; set; }
11-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
12-
public bool LimitCreateDeleteOwnerAdmin { get; set; }
1310
public bool AllowAdminAccessToAllCollectionItems { get; set; }
1411

1512
public virtual Organization ToOrganization(Organization existingOrganization, IFeatureService featureService)
1613
{
17-
if (featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
18-
{
19-
existingOrganization.LimitCollectionCreation = LimitCollectionCreation;
20-
existingOrganization.LimitCollectionDeletion = LimitCollectionDeletion;
21-
}
22-
else
23-
{
24-
existingOrganization.LimitCollectionCreationDeletion = LimitCreateDeleteOwnerAdmin || LimitCollectionCreation || LimitCollectionDeletion;
25-
}
26-
14+
existingOrganization.LimitCollectionCreation = LimitCollectionCreation;
15+
existingOrganization.LimitCollectionDeletion = LimitCollectionDeletion;
2716
existingOrganization.AllowAdminAccessToAllCollectionItems = AllowAdminAccessToAllCollectionItems;
2817
return existingOrganization;
2918
}

src/Api/Vault/AuthorizationHandlers/Collections/BulkCollectionAuthorizationHandler.cs

+14-40
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#nullable enable
22
using System.Diagnostics;
3-
using Bit.Core;
43
using Bit.Core.Context;
54
using Bit.Core.Entities;
65
using Bit.Core.Enums;
@@ -124,24 +123,15 @@ private async Task<bool> CanCreateAsync(CurrentContextOrganization? org)
124123
return true;
125124
}
126125

127-
if (_featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
128-
{
129-
var userIsMemberOfOrg = org is not null;
130-
var limitCollectionCreationEnabled = await GetOrganizationAbilityAsync(org) is { LimitCollectionCreation: true };
131-
var userIsOrgOwnerOrAdmin = org is { Type: OrganizationUserType.Owner or OrganizationUserType.Admin };
132-
// If the limit collection management setting is disabled, allow any user to create collections
133-
if (userIsMemberOfOrg && (!limitCollectionCreationEnabled || userIsOrgOwnerOrAdmin))
134-
{
135-
return true;
136-
}
137-
}
138-
else
126+
var organizationAbility = await GetOrganizationAbilityAsync(org);
127+
128+
var userIsMemberOfOrg = org is not null;
129+
var limitCollectionCreationEnabled = await GetOrganizationAbilityAsync(org) is { LimitCollectionCreation: true };
130+
var userIsOrgOwnerOrAdmin = org is { Type: OrganizationUserType.Owner or OrganizationUserType.Admin };
131+
// If the limit collection management setting is disabled, allow any user to create collections
132+
if (userIsMemberOfOrg && (!limitCollectionCreationEnabled || userIsOrgOwnerOrAdmin))
139133
{
140-
// If the limit collection management setting is disabled, allow any user to create collections
141-
if (await GetOrganizationAbilityAsync(org) is { LimitCollectionCreationDeletion: false })
142-
{
143-
return true;
144-
}
134+
return true;
145135
}
146136

147137
// Allow provider users to create collections if they are a provider for the target organization
@@ -267,29 +257,13 @@ private async Task<bool> CanDeleteAsync(ICollection<Collection> resources, Curre
267257
return true;
268258
}
269259

270-
if (_featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
260+
var userIsMemberOfOrg = org is not null;
261+
var limitCollectionDeletionEnabled = await GetOrganizationAbilityAsync(org) is { LimitCollectionDeletion: true };
262+
var userIsOrgOwnerOrAdmin = org is { Type: OrganizationUserType.Owner or OrganizationUserType.Admin };
263+
// If the limit collection management setting is disabled, allow any user to delete collections
264+
if (userIsMemberOfOrg && (!limitCollectionDeletionEnabled || userIsOrgOwnerOrAdmin) && await CanManageCollectionsAsync(resources, org))
271265
{
272-
var userIsMemberOfOrg = org is not null;
273-
var limitCollectionDeletionEnabled = await GetOrganizationAbilityAsync(org) is { LimitCollectionDeletion: true };
274-
var userIsOrgOwnerOrAdmin = org is { Type: OrganizationUserType.Owner or OrganizationUserType.Admin };
275-
// If the limit collection management setting is disabled, allow any user to delete collections
276-
if (userIsMemberOfOrg && (!limitCollectionDeletionEnabled || userIsOrgOwnerOrAdmin) && await CanManageCollectionsAsync(resources, org))
277-
{
278-
return true;
279-
}
280-
}
281-
else
282-
{
283-
// If LimitCollectionCreationDeletion is false, AllowAdminAccessToAllCollectionItems setting is irrelevant.
284-
// Ensure acting user has manage permissions for all collections being deleted
285-
// If LimitCollectionCreationDeletion is true, only Owners and Admins can delete collections they manage
286-
var organizationAbility = await GetOrganizationAbilityAsync(org);
287-
var canDeleteManagedCollections = organizationAbility is { LimitCollectionCreationDeletion: false } ||
288-
org is { Type: OrganizationUserType.Owner or OrganizationUserType.Admin };
289-
if (canDeleteManagedCollections && await CanManageCollectionsAsync(resources, org))
290-
{
291-
return true;
292-
}
266+
return true;
293267
}
294268

295269
// Allow providers to delete collections if they are a provider for the target organization

src/Core/AdminConsole/Entities/Organization.cs

-18
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,6 @@ public class Organization : ITableObject<Guid>, IStorableSubscriber, IRevisable,
9696
/// </summary>
9797
public bool LimitCollectionCreation { get; set; }
9898
public bool LimitCollectionDeletion { get; set; }
99-
// Deprecated by https://bitwarden.atlassian.net/browse/PM-10863. This
100-
// was replaced with `LimitCollectionCreation` and
101-
// `LimitCollectionDeletion`.
102-
public bool LimitCollectionCreationDeletion
103-
{
104-
get => LimitCollectionCreation || LimitCollectionDeletion;
105-
set
106-
{
107-
LimitCollectionCreation = value;
108-
LimitCollectionDeletion = value;
109-
}
110-
}
11199

112100
/// <summary>
113101
/// If set to true, admins, owners, and some custom users can read/write all collections and items in the Admin Console.
@@ -319,11 +307,5 @@ public void UpdateFromLicense(OrganizationLicense license, IFeatureService featu
319307
UseSecretsManager = license.UseSecretsManager;
320308
SmSeats = license.SmSeats;
321309
SmServiceAccounts = license.SmServiceAccounts;
322-
323-
if (!featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
324-
{
325-
LimitCollectionCreationDeletion = license.LimitCollectionCreationDeletion;
326-
AllowAdminAccessToAllCollectionItems = license.AllowAdminAccessToAllCollectionItems;
327-
}
328310
}
329311
}

src/Core/AdminConsole/Models/Data/Organizations/OrganizationAbility.cs

-4
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ public OrganizationAbility(Organization organization)
2323
UsePolicies = organization.UsePolicies;
2424
LimitCollectionCreation = organization.LimitCollectionCreation;
2525
LimitCollectionDeletion = organization.LimitCollectionDeletion;
26-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
27-
LimitCollectionCreationDeletion = organization.LimitCollectionCreationDeletion;
2826
AllowAdminAccessToAllCollectionItems = organization.AllowAdminAccessToAllCollectionItems;
2927
UseRiskInsights = organization.UseRiskInsights;
3028
}
@@ -43,8 +41,6 @@ public OrganizationAbility(Organization organization)
4341
public bool UsePolicies { get; set; }
4442
public bool LimitCollectionCreation { get; set; }
4543
public bool LimitCollectionDeletion { get; set; }
46-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
47-
public bool LimitCollectionCreationDeletion { get; set; }
4844
public bool AllowAdminAccessToAllCollectionItems { get; set; }
4945
public bool UseRiskInsights { get; set; }
5046
}

src/Core/AdminConsole/Models/Data/Organizations/OrganizationUsers/OrganizationUserOrganizationDetails.cs

-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ public class OrganizationUserOrganizationDetails
5656
public int? SmServiceAccounts { get; set; }
5757
public bool LimitCollectionCreation { get; set; }
5858
public bool LimitCollectionDeletion { get; set; }
59-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
60-
public bool LimitCollectionCreationDeletion { get; set; }
6159
public bool AllowAdminAccessToAllCollectionItems { get; set; }
6260
public bool UseRiskInsights { get; set; }
6361
}

src/Core/AdminConsole/Models/Data/Organizations/SelfHostedOrganizationDetails.cs

-2
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ public Organization ToOrganization()
146146
OwnersNotifiedOfAutoscaling = OwnersNotifiedOfAutoscaling,
147147
LimitCollectionCreation = LimitCollectionCreation,
148148
LimitCollectionDeletion = LimitCollectionDeletion,
149-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
150-
LimitCollectionCreationDeletion = LimitCollectionCreationDeletion,
151149
AllowAdminAccessToAllCollectionItems = AllowAdminAccessToAllCollectionItems,
152150
Status = Status
153151
};

src/Core/AdminConsole/Models/Data/Provider/ProviderUserOrganizationDetails.cs

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public class ProviderUserOrganizationDetails
4242
public PlanType PlanType { get; set; }
4343
public bool LimitCollectionCreation { get; set; }
4444
public bool LimitCollectionDeletion { get; set; }
45-
public bool LimitCollectionCreationDeletion { get; set; }
4645
public bool AllowAdminAccessToAllCollectionItems { get; set; }
4746
public bool UseRiskInsights { get; set; }
4847
}

src/Core/AdminConsole/Services/Implementations/OrganizationService.cs

-8
Original file line numberDiff line numberDiff line change
@@ -581,14 +581,6 @@ private async Task ValidateSignUpPoliciesAsync(Guid ownerId)
581581
SmServiceAccounts = license.SmServiceAccounts,
582582
};
583583

584-
// These fields are being removed from consideration when processing
585-
// licenses.
586-
if (!_featureService.IsEnabled(FeatureFlagKeys.LimitCollectionCreationDeletionSplit))
587-
{
588-
organization.LimitCollectionCreationDeletion = license.LimitCollectionCreationDeletion;
589-
organization.AllowAdminAccessToAllCollectionItems = license.AllowAdminAccessToAllCollectionItems;
590-
}
591-
592584
var result = await SignUpAsync(organization, owner.Id, ownerKey, collectionName, false);
593585

594586
var dir = $"{_globalSettings.LicenseDirectory}/organization";

src/Core/Billing/Licenses/Services/Implementations/OrganizationLicenseClaimsFactory.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ public Task<List<Claim>> GenerateClaims(Organization entity, LicenseContext lice
5252
new(nameof(OrganizationLicenseConstants.UseSecretsManager), entity.UseSecretsManager.ToString()),
5353
new(nameof(OrganizationLicenseConstants.SmSeats), entity.SmSeats.ToString()),
5454
new(nameof(OrganizationLicenseConstants.SmServiceAccounts), entity.SmServiceAccounts.ToString()),
55-
new(nameof(OrganizationLicenseConstants.LimitCollectionCreationDeletion), entity.LimitCollectionCreationDeletion.ToString()),
55+
// LimitCollectionCreationDeletion was split and removed from the
56+
// license. Left here with an assignment from the new values for
57+
// backwards compatibility.
58+
new(nameof(OrganizationLicenseConstants.LimitCollectionCreationDeletion),
59+
(entity.LimitCollectionCreation || entity.LimitCollectionDeletion).ToString()),
5660
new(nameof(OrganizationLicenseConstants.AllowAdminAccessToAllCollectionItems), entity.AllowAdminAccessToAllCollectionItems.ToString()),
5761
new(nameof(OrganizationLicenseConstants.Expires), expires.ToString(CultureInfo.InvariantCulture)),
5862
new(nameof(OrganizationLicenseConstants.Refresh), refresh.ToString(CultureInfo.InvariantCulture)),

src/Core/Constants.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public static class FeatureFlagKeys
144144
public const string AccessIntelligence = "pm-13227-access-intelligence";
145145
public const string VerifiedSsoDomainEndpoint = "pm-12337-refactor-sso-details-endpoint";
146146
public const string PM12275_MultiOrganizationEnterprises = "pm-12275-multi-organization-enterprises";
147-
public const string LimitCollectionCreationDeletionSplit = "pm-10863-limit-collection-creation-deletion-split";
147+
public const string Pm13322AddPolicyDefinitions = "pm-13322-add-policy-definitions";
148148
public const string GeneratorToolsModernization = "generator-tools-modernization";
149149
public const string NewDeviceVerification = "new-device-verification";
150150
public const string RiskInsightsCriticalApplication = "pm-14466-risk-insights-critical-application";

src/Core/Models/Business/OrganizationLicense.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public OrganizationLicense(Organization org, SubscriptionInfo subscriptionInfo,
5757
SmServiceAccounts = org.SmServiceAccounts;
5858

5959
// Deprecated. Left for backwards compatibility with old license versions.
60-
LimitCollectionCreationDeletion = org.LimitCollectionCreationDeletion;
60+
LimitCollectionCreationDeletion = org.LimitCollectionCreation || org.LimitCollectionDeletion;
6161
AllowAdminAccessToAllCollectionItems = org.AllowAdminAccessToAllCollectionItems;
6262
//
6363

src/Infrastructure.EntityFramework/AdminConsole/Models/Organization.cs

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ namespace Bit.Infrastructure.EntityFramework.AdminConsole.Models;
99

1010
public class Organization : Core.AdminConsole.Entities.Organization
1111
{
12+
// Shadow property. To be removed by
13+
// https://bitwarden.atlassian.net/browse/PM-10863.
14+
// This was replaced with `LimitCollectionCreation` and
15+
// `LimitCollectionDeletion`.
16+
public bool LimitCollectionCreationDeletion { get; set; }
1217
public virtual ICollection<Cipher> Ciphers { get; set; }
1318
public virtual ICollection<OrganizationUser> OrganizationUsers { get; set; }
1419
public virtual ICollection<Group> Groups { get; set; }
@@ -38,6 +43,7 @@ public OrganizationMapperProfile()
3843
.ForMember(org => org.ApiKeys, opt => opt.Ignore())
3944
.ForMember(org => org.Connections, opt => opt.Ignore())
4045
.ForMember(org => org.Domains, opt => opt.Ignore())
46+
.ForMember(org => org.LimitCollectionCreationDeletion, opt => opt.Ignore())
4147
.ReverseMap();
4248

4349
CreateProjection<Organization, SelfHostedOrganizationDetails>()

src/Infrastructure.EntityFramework/AdminConsole/Repositories/OrganizationRepository.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,8 @@ public async Task<ICollection<OrganizationAbility>> GetManyAbilitiesAsync()
101101
UsePolicies = e.UsePolicies,
102102
LimitCollectionCreation = e.LimitCollectionCreation,
103103
LimitCollectionDeletion = e.LimitCollectionDeletion,
104-
// Deprecated: https://bitwarden.atlassian.net/browse/PM-10863
105-
LimitCollectionCreationDeletion = e.LimitCollectionCreationDeletion,
106104
AllowAdminAccessToAllCollectionItems = e.AllowAdminAccessToAllCollectionItems,
107-
UseRiskInsights = e.UseRiskInsights,
105+
UseRiskInsights = e.UseRiskInsights
108106
}).ToListAsync();
109107
}
110108
}

0 commit comments

Comments
 (0)