Skip to content

Commit 28e9c24

Browse files
[PM-25584] [PM-25585] Remove feature flag - recover provider accounts (#6673)
* chore: remove ff from OrganizationUsersController, refs PM-25584 * chore: update tests with reference to ff, refs PM-25584 * chore: remove ff definition, refs PM-25585 * chore: dotnet format, refs PM-25584
1 parent ee26a70 commit 28e9c24

4 files changed

Lines changed: 6 additions & 103 deletions

File tree

src/Api/AdminConsole/Controllers/OrganizationUsersController.cs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -483,43 +483,10 @@ await _organizationService.UpdateUserResetPasswordEnrollmentAsync(
483483
}
484484
}
485485

486+
#nullable enable
486487
[HttpPut("{id}/reset-password")]
487488
[Authorize<ManageAccountRecoveryRequirement>]
488489
public async Task<IResult> PutResetPassword(Guid orgId, Guid id, [FromBody] OrganizationUserResetPasswordRequestModel model)
489-
{
490-
if (_featureService.IsEnabled(FeatureFlagKeys.AccountRecoveryCommand))
491-
{
492-
// TODO: remove legacy implementation after feature flag is enabled.
493-
return await PutResetPasswordNew(orgId, id, model);
494-
}
495-
496-
// Get the users role, since provider users aren't a member of the organization we use the owner check
497-
var orgUserType = await _currentContext.OrganizationOwner(orgId)
498-
? OrganizationUserType.Owner
499-
: _currentContext.Organizations?.FirstOrDefault(o => o.Id == orgId)?.Type;
500-
if (orgUserType == null)
501-
{
502-
return TypedResults.NotFound();
503-
}
504-
505-
var result = await _userService.AdminResetPasswordAsync(orgUserType.Value, orgId, id, model.NewMasterPasswordHash, model.Key);
506-
if (result.Succeeded)
507-
{
508-
return TypedResults.Ok();
509-
}
510-
511-
foreach (var error in result.Errors)
512-
{
513-
ModelState.AddModelError(string.Empty, error.Description);
514-
}
515-
516-
await Task.Delay(2000);
517-
return TypedResults.BadRequest(ModelState);
518-
}
519-
520-
#nullable enable
521-
// TODO: make sure the route and authorize attributes are maintained when the legacy implementation is removed.
522-
private async Task<IResult> PutResetPasswordNew(Guid orgId, Guid id, [FromBody] OrganizationUserResetPasswordRequestModel model)
523490
{
524491
var targetOrganizationUser = await _organizationUserRepository.GetByIdAsync(id);
525492
if (targetOrganizationUser == null || targetOrganizationUser.OrganizationId != orgId)

src/Core/Constants.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ public static class FeatureFlagKeys
140140
public const string CreateDefaultLocation = "pm-19467-create-default-location";
141141
public const string AutomaticConfirmUsers = "pm-19934-auto-confirm-organization-users";
142142
public const string PM23845_VNextApplicationCache = "pm-24957-refactor-memory-application-cache";
143-
public const string AccountRecoveryCommand = "pm-25581-prevent-provider-account-recovery";
144143
public const string BlockClaimedDomainAccountCreation = "pm-28297-block-uninvited-claimed-domain-registration";
145144
public const string PolicyValidatorsRefactor = "pm-26423-refactor-policy-side-effects";
146145
public const string IncreaseBulkReinviteLimitForCloud = "pm-28251-increase-bulk-reinvite-limit-for-cloud";

test/Api.IntegrationTest/AdminConsole/Controllers/OrganizationUsersControllerPutResetPasswordTests.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Bit.Api.IntegrationTest.Factories;
44
using Bit.Api.IntegrationTest.Helpers;
55
using Bit.Api.Models.Request.Organizations;
6-
using Bit.Core;
76
using Bit.Core.AdminConsole.Entities;
87
using Bit.Core.AdminConsole.Entities.Provider;
98
using Bit.Core.AdminConsole.Enums;
@@ -14,8 +13,6 @@
1413
using Bit.Core.Enums;
1514
using Bit.Core.Models.Api;
1615
using Bit.Core.Repositories;
17-
using Bit.Core.Services;
18-
using NSubstitute;
1916
using Xunit;
2017

2118
namespace Bit.Api.IntegrationTest.AdminConsole.Controllers;
@@ -32,12 +29,6 @@ public class OrganizationUsersControllerPutResetPasswordTests : IClassFixture<Ap
3229
public OrganizationUsersControllerPutResetPasswordTests(ApiApplicationFactory apiFactory)
3330
{
3431
_factory = apiFactory;
35-
_factory.SubstituteService<IFeatureService>(featureService =>
36-
{
37-
featureService
38-
.IsEnabled(FeatureFlagKeys.AccountRecoveryCommand)
39-
.Returns(true);
40-
});
4132
_client = _factory.CreateClient();
4233
_loginHelper = new LoginHelper(_factory, _client);
4334
}

test/Api.Test/AdminConsole/Controllers/OrganizationUsersControllerTests.cs

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -452,60 +452,10 @@ await sutProvider.GetDependency<IOrganizationService>().Received(0)
452452

453453
[Theory]
454454
[BitAutoData]
455-
public async Task PutResetPassword_WithFeatureFlagDisabled_CallsLegacyPath(
455+
public async Task PutResetPassword_WhenOrganizationUserNotFound_ReturnsNotFound(
456456
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model,
457457
SutProvider<OrganizationUsersController> sutProvider)
458458
{
459-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(false);
460-
sutProvider.GetDependency<ICurrentContext>().OrganizationOwner(orgId).Returns(true);
461-
sutProvider.GetDependency<IUserService>().AdminResetPasswordAsync(Arg.Any<OrganizationUserType>(), orgId, orgUserId, model.NewMasterPasswordHash, model.Key)
462-
.Returns(Microsoft.AspNetCore.Identity.IdentityResult.Success);
463-
464-
var result = await sutProvider.Sut.PutResetPassword(orgId, orgUserId, model);
465-
466-
Assert.IsType<Ok>(result);
467-
await sutProvider.GetDependency<IUserService>().Received(1)
468-
.AdminResetPasswordAsync(OrganizationUserType.Owner, orgId, orgUserId, model.NewMasterPasswordHash, model.Key);
469-
}
470-
471-
[Theory]
472-
[BitAutoData]
473-
public async Task PutResetPassword_WithFeatureFlagDisabled_WhenOrgUserTypeIsNull_ReturnsNotFound(
474-
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model,
475-
SutProvider<OrganizationUsersController> sutProvider)
476-
{
477-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(false);
478-
sutProvider.GetDependency<ICurrentContext>().OrganizationOwner(orgId).Returns(false);
479-
sutProvider.GetDependency<ICurrentContext>().Organizations.Returns(new List<CurrentContextOrganization>());
480-
481-
var result = await sutProvider.Sut.PutResetPassword(orgId, orgUserId, model);
482-
483-
Assert.IsType<Microsoft.AspNetCore.Http.HttpResults.NotFound>(result);
484-
}
485-
486-
[Theory]
487-
[BitAutoData]
488-
public async Task PutResetPassword_WithFeatureFlagDisabled_WhenAdminResetPasswordFails_ReturnsBadRequest(
489-
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model,
490-
SutProvider<OrganizationUsersController> sutProvider)
491-
{
492-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(false);
493-
sutProvider.GetDependency<ICurrentContext>().OrganizationOwner(orgId).Returns(true);
494-
sutProvider.GetDependency<IUserService>().AdminResetPasswordAsync(Arg.Any<OrganizationUserType>(), orgId, orgUserId, model.NewMasterPasswordHash, model.Key)
495-
.Returns(Microsoft.AspNetCore.Identity.IdentityResult.Failed(new Microsoft.AspNetCore.Identity.IdentityError { Description = "Error 1" }));
496-
497-
var result = await sutProvider.Sut.PutResetPassword(orgId, orgUserId, model);
498-
499-
Assert.IsType<BadRequest<ModelStateDictionary>>(result);
500-
}
501-
502-
[Theory]
503-
[BitAutoData]
504-
public async Task PutResetPassword_WithFeatureFlagEnabled_WhenOrganizationUserNotFound_ReturnsNotFound(
505-
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model,
506-
SutProvider<OrganizationUsersController> sutProvider)
507-
{
508-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(true);
509459
sutProvider.GetDependency<IOrganizationUserRepository>().GetByIdAsync(orgUserId).Returns((OrganizationUser)null);
510460

511461
var result = await sutProvider.Sut.PutResetPassword(orgId, orgUserId, model);
@@ -515,12 +465,11 @@ public async Task PutResetPassword_WithFeatureFlagEnabled_WhenOrganizationUserNo
515465

516466
[Theory]
517467
[BitAutoData]
518-
public async Task PutResetPassword_WithFeatureFlagEnabled_WhenOrganizationIdMismatch_ReturnsNotFound(
468+
public async Task PutResetPassword_WhenOrganizationIdMismatch_ReturnsNotFound(
519469
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model, OrganizationUser organizationUser,
520470
SutProvider<OrganizationUsersController> sutProvider)
521471
{
522472
organizationUser.OrganizationId = Guid.NewGuid();
523-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(true);
524473
sutProvider.GetDependency<IOrganizationUserRepository>().GetByIdAsync(orgUserId).Returns(organizationUser);
525474

526475
var result = await sutProvider.Sut.PutResetPassword(orgId, orgUserId, model);
@@ -530,12 +479,11 @@ public async Task PutResetPassword_WithFeatureFlagEnabled_WhenOrganizationIdMism
530479

531480
[Theory]
532481
[BitAutoData]
533-
public async Task PutResetPassword_WithFeatureFlagEnabled_WhenAuthorizationFails_ReturnsBadRequest(
482+
public async Task PutResetPassword_WhenAuthorizationFails_ReturnsBadRequest(
534483
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model, OrganizationUser organizationUser,
535484
SutProvider<OrganizationUsersController> sutProvider)
536485
{
537486
organizationUser.OrganizationId = orgId;
538-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(true);
539487
sutProvider.GetDependency<IOrganizationUserRepository>().GetByIdAsync(orgUserId).Returns(organizationUser);
540488
sutProvider.GetDependency<IAuthorizationService>()
541489
.AuthorizeAsync(
@@ -551,12 +499,11 @@ public async Task PutResetPassword_WithFeatureFlagEnabled_WhenAuthorizationFails
551499

552500
[Theory]
553501
[BitAutoData]
554-
public async Task PutResetPassword_WithFeatureFlagEnabled_WhenRecoverAccountSucceeds_ReturnsOk(
502+
public async Task PutResetPassword_WhenRecoverAccountSucceeds_ReturnsOk(
555503
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model, OrganizationUser organizationUser,
556504
SutProvider<OrganizationUsersController> sutProvider)
557505
{
558506
organizationUser.OrganizationId = orgId;
559-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(true);
560507
sutProvider.GetDependency<IOrganizationUserRepository>().GetByIdAsync(orgUserId).Returns(organizationUser);
561508
sutProvider.GetDependency<IAuthorizationService>()
562509
.AuthorizeAsync(
@@ -577,12 +524,11 @@ await sutProvider.GetDependency<IAdminRecoverAccountCommand>().Received(1)
577524

578525
[Theory]
579526
[BitAutoData]
580-
public async Task PutResetPassword_WithFeatureFlagEnabled_WhenRecoverAccountFails_ReturnsBadRequest(
527+
public async Task PutResetPassword_WhenRecoverAccountFails_ReturnsBadRequest(
581528
Guid orgId, Guid orgUserId, OrganizationUserResetPasswordRequestModel model, OrganizationUser organizationUser,
582529
SutProvider<OrganizationUsersController> sutProvider)
583530
{
584531
organizationUser.OrganizationId = orgId;
585-
sutProvider.GetDependency<IFeatureService>().IsEnabled(FeatureFlagKeys.AccountRecoveryCommand).Returns(true);
586532
sutProvider.GetDependency<IOrganizationUserRepository>().GetByIdAsync(orgUserId).Returns(organizationUser);
587533
sutProvider.GetDependency<IAuthorizationService>()
588534
.AuthorizeAsync(

0 commit comments

Comments
 (0)