Skip to content

Commit 2009d7f

Browse files
fix(refactor): [PM-34246] Rename Set Password to Finalize Onboarding - Initial set of renames take two.
1 parent 89f6e43 commit 2009d7f

8 files changed

Lines changed: 56 additions & 54 deletions

File tree

src/Api/Auth/Controllers/AccountsController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class AccountsController : Controller
3939
private readonly IUserService _userService;
4040
private readonly IPolicyService _policyService;
4141
private readonly ISetInitialMasterPasswordCommandV1 _setInitialMasterPasswordCommandV1;
42-
private readonly ISetInitialMasterPasswordCommand _setInitialMasterPasswordCommand;
42+
private readonly IFinishSsoJitProvisionMasterPasswordCommand _finishSsoJitProvisionMasterPasswordCommand;
4343
private readonly ITdeSetPasswordCommand _tdeSetPasswordCommand;
4444
private readonly ITdeOffboardingPasswordCommand _tdeOffboardingPasswordCommand;
4545
private readonly ITwoFactorIsEnabledQuery _twoFactorIsEnabledQuery;
@@ -55,7 +55,7 @@ public AccountsController(
5555
IProviderUserRepository providerUserRepository,
5656
IUserService userService,
5757
IPolicyService policyService,
58-
ISetInitialMasterPasswordCommand setInitialMasterPasswordCommand,
58+
IFinishSsoJitProvisionMasterPasswordCommand finishSsoJitProvisionMasterPasswordCommand,
5959
ISetInitialMasterPasswordCommandV1 setInitialMasterPasswordCommandV1,
6060
ITdeSetPasswordCommand tdeSetPasswordCommand,
6161
ITdeOffboardingPasswordCommand tdeOffboardingPasswordCommand,
@@ -72,7 +72,7 @@ IUserRepository userRepository
7272
_providerUserRepository = providerUserRepository;
7373
_userService = userService;
7474
_policyService = policyService;
75-
_setInitialMasterPasswordCommand = setInitialMasterPasswordCommand;
75+
_finishSsoJitProvisionMasterPasswordCommand = finishSsoJitProvisionMasterPasswordCommand;
7676
_setInitialMasterPasswordCommandV1 = setInitialMasterPasswordCommandV1;
7777
_tdeSetPasswordCommand = tdeSetPasswordCommand;
7878
_tdeOffboardingPasswordCommand = tdeOffboardingPasswordCommand;
@@ -230,7 +230,7 @@ public async Task PostSetPasswordAsync([FromBody] SetInitialPasswordRequestModel
230230
}
231231
else
232232
{
233-
await _setInitialMasterPasswordCommand.SetInitialMasterPasswordAsync(user, model.ToData());
233+
await _finishSsoJitProvisionMasterPasswordCommand.FinishSsoJitProvisionMasterPasswordAsync(user, model.ToData());
234234
}
235235
}
236236
else

src/Core/Auth/UserFeatures/UserMasterPassword/SetInitialMasterPasswordCommand.cs renamed to src/Core/Auth/UserFeatures/UserMasterPassword/FinishSsoJitProvisionMasterPasswordCommandCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace Bit.Core.Auth.UserFeatures.UserMasterPassword;
1212

13-
public class SetInitialMasterPasswordCommand : ISetInitialMasterPasswordCommand
13+
public class FinishSsoJitProvisionMasterPasswordCommandCommand : IFinishSsoJitProvisionMasterPasswordCommand
1414
{
1515
private readonly IUserService _userService;
1616
private readonly IUserRepository _userRepository;
@@ -20,7 +20,7 @@ public class SetInitialMasterPasswordCommand : ISetInitialMasterPasswordCommand
2020
private readonly IPasswordHasher<User> _passwordHasher;
2121
private readonly IEventService _eventService;
2222

23-
public SetInitialMasterPasswordCommand(IUserService userService, IUserRepository userRepository,
23+
public FinishSsoJitProvisionMasterPasswordCommandCommand(IUserService userService, IUserRepository userRepository,
2424
IAcceptOrgUserCommand acceptOrgUserCommand, IOrganizationUserRepository organizationUserRepository,
2525
IOrganizationRepository organizationRepository, IPasswordHasher<User> passwordHasher,
2626
IEventService eventService)
@@ -34,7 +34,7 @@ public SetInitialMasterPasswordCommand(IUserService userService, IUserRepository
3434
_eventService = eventService;
3535
}
3636

37-
public async Task SetInitialMasterPasswordAsync(User user,
37+
public async Task FinishSsoJitProvisionMasterPasswordAsync(User user,
3838
SetInitialMasterPasswordDataModel masterPasswordDataModel)
3939
{
4040
if (user.Key != null)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Bit.Core.Auth.Models.Data;
2+
using Bit.Core.Entities;
3+
using Bit.Core.Exceptions;
4+
5+
namespace Bit.Core.Auth.UserFeatures.UserMasterPassword.Interfaces;
6+
7+
/// <summary>
8+
/// <para>Finalizes onboarding for an organization user by setting their initial master password and account keys,
9+
/// then accepting their organization membership.</para>
10+
/// <para>Applies to organizations configured with Single Sign-On (SSO) and master password decryption,
11+
/// where just-in-time (JIT) provisioned users are required to establish a master password upon first SSO login.</para>
12+
/// </summary>
13+
public interface IFinishSsoJitProvisionMasterPasswordCommand
14+
{
15+
/// <summary>
16+
/// Sets the initial master password and account keys for the specified user and accepts their pending
17+
/// organization membership.
18+
/// </summary>
19+
/// <param name="user">User to finalize onboarding for. Must not already have a master password set.</param>
20+
/// <param name="masterPasswordDataModel">Master password, account keys, and org SSO identifier</param>
21+
/// <returns>A task that completes when the operation succeeds</returns>
22+
/// <exception cref="BadRequestException">
23+
/// Thrown if the user's master password is already set, account keys are missing, the organization
24+
/// SSO identifier is invalid, or the user is not a member of the organization.
25+
/// </exception>
26+
public Task FinishSsoJitProvisionMasterPasswordAsync(User user, SetInitialMasterPasswordDataModel masterPasswordDataModel);
27+
}

src/Core/Auth/UserFeatures/UserMasterPassword/Interfaces/ISetInitialMasterPasswordCommand.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/Core/Auth/UserFeatures/UserServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static void AddUserKeyCommands(this IServiceCollection services, IGlobalS
5252

5353
private static void AddUserPasswordCommands(this IServiceCollection services)
5454
{
55-
services.AddScoped<ISetInitialMasterPasswordCommand, SetInitialMasterPasswordCommand>();
55+
services.AddScoped<IFinishSsoJitProvisionMasterPasswordCommand, FinishSsoJitProvisionMasterPasswordCommandCommand>();
5656
services.AddScoped<ISetInitialMasterPasswordCommandV1, SetInitialMasterPasswordCommandV1>();
5757
services.AddScoped<ITdeSetPasswordCommand, TdeSetPasswordCommand>();
5858
}

test/Api.Test/Auth/Controllers/AccountsControllerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class AccountsControllerTests : IDisposable
3434
private readonly IUserService _userService;
3535
private readonly IProviderUserRepository _providerUserRepository;
3636
private readonly IPolicyService _policyService;
37-
private readonly ISetInitialMasterPasswordCommand _setInitialMasterPasswordCommand;
37+
private readonly IFinishSsoJitProvisionMasterPasswordCommand _finishSsoJitProvisionMasterPasswordCommand;
3838
private readonly ISetInitialMasterPasswordCommandV1 _setInitialMasterPasswordCommandV1;
3939
private readonly ITwoFactorIsEnabledQuery _twoFactorIsEnabledQuery;
4040
private readonly ITdeSetPasswordCommand _tdeSetPasswordCommand;
@@ -52,7 +52,7 @@ public AccountsControllerTests()
5252
_organizationUserRepository = Substitute.For<IOrganizationUserRepository>();
5353
_providerUserRepository = Substitute.For<IProviderUserRepository>();
5454
_policyService = Substitute.For<IPolicyService>();
55-
_setInitialMasterPasswordCommand = Substitute.For<ISetInitialMasterPasswordCommand>();
55+
_finishSsoJitProvisionMasterPasswordCommand = Substitute.For<IFinishSsoJitProvisionMasterPasswordCommand>();
5656
_setInitialMasterPasswordCommandV1 = Substitute.For<ISetInitialMasterPasswordCommandV1>();
5757
_twoFactorIsEnabledQuery = Substitute.For<ITwoFactorIsEnabledQuery>();
5858
_tdeSetPasswordCommand = Substitute.For<ITdeSetPasswordCommand>();
@@ -69,7 +69,7 @@ public AccountsControllerTests()
6969
_providerUserRepository,
7070
_userService,
7171
_policyService,
72-
_setInitialMasterPasswordCommand,
72+
_finishSsoJitProvisionMasterPasswordCommand,
7373
_setInitialMasterPasswordCommandV1,
7474
_tdeSetPasswordCommand,
7575
_tdeOffboardingPasswordCommand,
@@ -870,15 +870,15 @@ public async Task PostSetPasswordAsync_V2_WhenUserExistsAndSettingPasswordSuccee
870870
// Arrange
871871
UpdateSetInitialPasswordRequestModelToV2(setInitialPasswordRequestModel);
872872
_userService.GetUserByPrincipalAsync(Arg.Any<ClaimsPrincipal>()).Returns(Task.FromResult(user));
873-
_setInitialMasterPasswordCommand.SetInitialMasterPasswordAsync(user, Arg.Any<SetInitialMasterPasswordDataModel>())
873+
_finishSsoJitProvisionMasterPasswordCommand.FinishSsoJitProvisionMasterPasswordAsync(user, Arg.Any<SetInitialMasterPasswordDataModel>())
874874
.Returns(Task.CompletedTask);
875875

876876
// Act
877877
await _sut.PostSetPasswordAsync(setInitialPasswordRequestModel);
878878

879879
// Assert
880-
await _setInitialMasterPasswordCommand.Received(1)
881-
.SetInitialMasterPasswordAsync(
880+
await _finishSsoJitProvisionMasterPasswordCommand.Received(1)
881+
.FinishSsoJitProvisionMasterPasswordAsync(
882882
Arg.Is<User>(u => u == user),
883883
Arg.Is<SetInitialMasterPasswordDataModel>(d =>
884884
d.MasterPasswordAuthentication != null &&
@@ -935,7 +935,7 @@ public async Task PostSetPasswordAsync_V2_WhenSettingPasswordFails_ShouldThrowEx
935935
// Arrange
936936
UpdateSetInitialPasswordRequestModelToV2(setInitialPasswordRequestModel);
937937
_userService.GetUserByPrincipalAsync(Arg.Any<ClaimsPrincipal>()).Returns(Task.FromResult(user));
938-
_setInitialMasterPasswordCommand.SetInitialMasterPasswordAsync(user, Arg.Any<SetInitialMasterPasswordDataModel>())
938+
_finishSsoJitProvisionMasterPasswordCommand.FinishSsoJitProvisionMasterPasswordAsync(user, Arg.Any<SetInitialMasterPasswordDataModel>())
939939
.Returns(Task.FromException(new Exception("Setting password failed")));
940940

941941
// Act & Assert

test/Core.Test/Auth/UserFeatures/UserMasterPassword/SetInitialMasterPasswordCommandTests.cs renamed to test/Core.Test/Auth/UserFeatures/UserMasterPassword/FinishSsoJitProvisionMasterPasswordCommandCommandTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
namespace Bit.Core.Test.Auth.UserFeatures.UserMasterPassword;
1919

2020
[SutProviderCustomize]
21-
public class SetInitialMasterPasswordCommandTests
21+
public class FinishSsoJitProvisionMasterPasswordCommandCommandTests
2222
{
2323
[Theory]
2424
[BitAutoData]
25-
public async Task SetInitialMasterPassword_Success(SutProvider<SetInitialMasterPasswordCommand> sutProvider,
25+
public async Task SetInitialMasterPassword_Success(SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
2626
User user, UserAccountKeysData accountKeys, KdfSettings kdfSettings,
2727
Organization org, OrganizationUser orgUser, string serverSideHash, string masterPasswordHint)
2828
{
@@ -49,7 +49,7 @@ public async Task SetInitialMasterPassword_Success(SutProvider<SetInitialMasterP
4949
.Returns(mockUpdateUserData);
5050

5151
// Act
52-
await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model);
52+
await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model);
5353

5454
// Assert
5555
await sutProvider.GetDependency<IUserRepository>().Received(1)
@@ -73,7 +73,7 @@ await sutProvider.GetDependency<IAcceptOrgUserCommand>().Received(1)
7373
[Theory]
7474
[BitAutoData]
7575
public async Task SetInitialMasterPassword_UserAlreadyHasPassword_ThrowsBadRequestException(
76-
SutProvider<SetInitialMasterPasswordCommand> sutProvider,
76+
SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
7777
User user, UserAccountKeysData accountKeys, KdfSettings kdfSettings, string orgSsoIdentifier, string masterPasswordHint)
7878
{
7979
// Arrange
@@ -82,14 +82,14 @@ public async Task SetInitialMasterPassword_UserAlreadyHasPassword_ThrowsBadReque
8282

8383
// Act & Assert
8484
var exception = await Assert.ThrowsAsync<BadRequestException>(
85-
async () => await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model));
85+
async () => await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model));
8686
Assert.Equal("User already has a master password set.", exception.Message);
8787
}
8888

8989
[Theory]
9090
[BitAutoData]
9191
public async Task SetInitialMasterPassword_AccountKeysNull_ThrowsBadRequestException(
92-
SutProvider<SetInitialMasterPasswordCommand> sutProvider,
92+
SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
9393
User user, KdfSettings kdfSettings, string orgSsoIdentifier, string masterPasswordHint)
9494
{
9595
// Arrange
@@ -98,7 +98,7 @@ public async Task SetInitialMasterPassword_AccountKeysNull_ThrowsBadRequestExcep
9898

9999
// Act & Assert
100100
var exception = await Assert.ThrowsAsync<BadRequestException>(
101-
async () => await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model));
101+
async () => await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model));
102102
Assert.Equal("Account keys are required.", exception.Message);
103103
}
104104

@@ -108,7 +108,7 @@ public async Task SetInitialMasterPassword_AccountKeysNull_ThrowsBadRequestExcep
108108
[BitAutoData("wrong-salt", "different-wrong-salt")]
109109
public async Task SetInitialMasterPassword_InvalidSalt_ThrowsBadRequestException(
110110
string? authSaltOverride, string? unlockSaltOverride,
111-
SutProvider<SetInitialMasterPasswordCommand> sutProvider,
111+
SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
112112
User user, UserAccountKeysData accountKeys, KdfSettings kdfSettings, string orgSsoIdentifier, string masterPasswordHint)
113113
{
114114
// Arrange
@@ -135,14 +135,14 @@ public async Task SetInitialMasterPassword_InvalidSalt_ThrowsBadRequestException
135135

136136
// Act & Assert
137137
var exception = await Assert.ThrowsAsync<BadRequestException>(
138-
async () => await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model));
138+
async () => await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model));
139139
Assert.Equal("Invalid master password salt.", exception.Message);
140140
}
141141

142142
[Theory]
143143
[BitAutoData]
144144
public async Task SetInitialMasterPassword_InvalidOrgSsoIdentifier_ThrowsBadRequestException(
145-
SutProvider<SetInitialMasterPasswordCommand> sutProvider,
145+
SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
146146
User user, UserAccountKeysData accountKeys, KdfSettings kdfSettings, string orgSsoIdentifier, string masterPasswordHint)
147147
{
148148
// Arrange
@@ -155,14 +155,14 @@ public async Task SetInitialMasterPassword_InvalidOrgSsoIdentifier_ThrowsBadRequ
155155

156156
// Act & Assert
157157
var exception = await Assert.ThrowsAsync<BadRequestException>(
158-
async () => await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model));
158+
async () => await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model));
159159
Assert.Equal("Organization SSO identifier is invalid.", exception.Message);
160160
}
161161

162162
[Theory]
163163
[BitAutoData]
164164
public async Task SetInitialMasterPassword_UserNotFoundInOrganization_ThrowsBadRequestException(
165-
SutProvider<SetInitialMasterPasswordCommand> sutProvider,
165+
SutProvider<FinishSsoJitProvisionMasterPasswordCommandCommand> sutProvider,
166166
User user, UserAccountKeysData accountKeys, KdfSettings kdfSettings, Organization org, string masterPasswordHint)
167167
{
168168
// Arrange
@@ -179,7 +179,7 @@ public async Task SetInitialMasterPassword_UserNotFoundInOrganization_ThrowsBadR
179179

180180
// Act & Assert
181181
var exception = await Assert.ThrowsAsync<BadRequestException>(
182-
async () => await sutProvider.Sut.SetInitialMasterPasswordAsync(user, model));
182+
async () => await sutProvider.Sut.FinishSsoJitProvisionMasterPasswordAsync(user, model));
183183
Assert.Equal("User not found within organization.", exception.Message);
184184
}
185185

test/Infrastructure.IntegrationTest/Repositories/UserRepositoryTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ public async Task CreateAsync_ShouldSetMasterPasswordSaltToNullWhenNoMasterPassw
627627
/// <summary>
628628
/// In this test we are testing that the MasterPasswordUnlockData set's the password data correctly.
629629
/// including setting the masterPasswordSalt.
630-
/// <see cref="TdeSetPasswordCommand.SetMasterPasswordAsync"/> and <see cref="SetInitialMasterPasswordCommand.SetInitialMasterPasswordAsync"/> for reference.
630+
/// <see cref="TdeSetPasswordCommand.SetMasterPasswordAsync"/> and <see cref="FinishSsoJitProvisionMasterPasswordCommandCommand.FinishSsoJitProvisionMasterPasswordAsync"/> for reference.
631631
/// </summary>
632632
[Theory, DatabaseData]
633633
public async Task UpdateMasterPassword_MasterPasswordSaltIsUpdated(

0 commit comments

Comments
 (0)