Skip to content

Commit eb0539f

Browse files
authored
Merge branch 'main' into ac/pm-33919-automatically-confirm-pending-users-on-admin-login
2 parents b655c4f + 28bd286 commit eb0539f

90 files changed

Lines changed: 24125 additions & 118 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bitwarden_license/src/Scim/Models/ScimUserRequestModel.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// FIXME: Update this file to be null safe and then delete the line below
22
#nullable disable
33

4+
using Bit.Core.AdminConsole.Entities;
45
using Bit.Core.AdminConsole.Enums;
5-
using Bit.Core.AdminConsole.Models.Business;
66
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
77
using Bit.Core.Enums;
88
using Bit.Core.Exceptions;
@@ -34,7 +34,7 @@ public OrganizationUserInvite ToOrganizationUserInvite(ScimProviderType scimProv
3434

3535
public InviteOrganizationUsersRequest ToRequest(
3636
ScimProviderType scimProvider,
37-
InviteOrganization inviteOrganization,
37+
Organization organization,
3838
DateTimeOffset performedAt)
3939
{
4040
var email = EmailForInvite(scimProvider);
@@ -52,7 +52,7 @@ public InviteOrganizationUsersRequest ToRequest(
5252
externalId: ExternalIdForInvite()
5353
)
5454
],
55-
inviteOrganization: inviteOrganization,
55+
organization: organization,
5656
performedBy: Guid.Empty, // SCIM does not have a user id
5757
performedAt: performedAt);
5858
}

bitwarden_license/src/Scim/Users/PostUserCommand.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
using Bit.Core;
44
using Bit.Core.AdminConsole.Enums;
5-
using Bit.Core.AdminConsole.Models.Business;
65
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
76
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
87
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
98
using Bit.Core.AdminConsole.Utilities.Commands;
10-
using Bit.Core.Billing.Pricing;
119
using Bit.Core.Billing.Services;
1210
using Bit.Core.Enums;
1311
using Bit.Core.Exceptions;
@@ -29,8 +27,7 @@ public class PostUserCommand(
2927
IScimContext scimContext,
3028
IFeatureService featureService,
3129
IInviteOrganizationUsersCommand inviteOrganizationUsersCommand,
32-
TimeProvider timeProvider,
33-
IPricingClient pricingClient)
30+
TimeProvider timeProvider)
3431
: IPostUserCommand
3532
{
3633
public async Task<OrganizationUserUserDetails?> PostUserAsync(Guid organizationId, ScimUserRequestModel model)
@@ -55,15 +52,13 @@ public class PostUserCommand(
5552
throw new NotFoundException();
5653
}
5754

58-
var plan = await pricingClient.GetPlanOrThrow(organization.PlanType);
59-
6055
var request = model.ToRequest(
6156
scimProvider: scimProvider,
62-
inviteOrganization: new InviteOrganization(organization, plan),
57+
organization: organization,
6358
performedAt: timeProvider.GetUtcNow());
6459

6560
var orgUsers = await organizationUserRepository
66-
.GetManyDetailsByOrganizationAsync(request.InviteOrganization.OrganizationId);
61+
.GetManyDetailsByOrganizationAsync(request.Organization.Id);
6762

6863
if (orgUsers.Any(existingUser =>
6964
request.Invites.First().Email.Equals(existingUser.Email, StringComparison.OrdinalIgnoreCase) ||

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ protected BaseProfileOrganizationResponseModel(
5252
UseDisableSMAdsForUsers = organizationDetails.UseDisableSMAdsForUsers;
5353
UsePasswordManager = organizationDetails.UsePasswordManager;
5454
UseMyItems = organizationDetails.UseMyItems;
55+
UseInviteLinks = organizationDetails.UseInviteLinks;
5556
SelfHost = organizationDetails.SelfHost;
5657
Seats = organizationDetails.Seats;
5758
MaxCollections = organizationDetails.MaxCollections;
@@ -106,6 +107,7 @@ protected BaseProfileOrganizationResponseModel(
106107
public bool UseDisableSMAdsForUsers { get; set; }
107108
public bool UsePhishingBlocker { get; set; }
108109
public bool UseMyItems { get; set; }
110+
public bool UseInviteLinks { get; set; }
109111
public bool SelfHost { get; set; }
110112
public int? Seats { get; set; }
111113
public short? MaxCollections { get; set; }

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public OrganizationResponseModel(
7777
UseDisableSmAdsForUsers = organization.UseDisableSmAdsForUsers;
7878
UsePhishingBlocker = organization.UsePhishingBlocker;
7979
UseMyItems = organization.UseMyItems;
80+
UseInviteLinks = organization.UseInviteLinks;
8081
}
8182

8283
public Guid Id { get; set; }
@@ -129,6 +130,7 @@ public OrganizationResponseModel(
129130
public bool UseDisableSmAdsForUsers { get; set; }
130131
public bool UsePhishingBlocker { get; set; }
131132
public bool UseMyItems { get; set; }
133+
public bool UseInviteLinks { get; set; }
132134
}
133135

134136
public class OrganizationSubscriptionResponseModel : OrganizationResponseModel

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public OrganizationUserUserDetailsResponseModel((OrganizationUserUserDetails Org
147147
// Prevent reset password when using key connector.
148148
ResetPasswordEnrolled = ResetPasswordEnrolled && !data.OrgUser.UsesKeyConnector;
149149
ClaimedByOrganization = data.ClaimedByOrganization;
150+
RevocationReason = data.OrgUser.RevocationReason;
150151
}
151152

152153
public OrganizationUserUserDetailsResponseModel(OrganizationUserUserDetails organizationUser,
@@ -168,6 +169,7 @@ public OrganizationUserUserDetailsResponseModel(OrganizationUserUserDetails orga
168169
// Prevent reset password when using key connector.
169170
ResetPasswordEnrolled = ResetPasswordEnrolled && !organizationUser.UsesKeyConnector;
170171
ClaimedByOrganization = claimedByOrganization;
172+
RevocationReason = organizationUser.RevocationReason;
171173
}
172174

173175
public string Name { get; set; }
@@ -188,6 +190,11 @@ public bool ManagedByOrganization
188190
public bool ClaimedByOrganization { get; set; }
189191
public IEnumerable<SelectionReadOnlyResponseModel> Collections { get; set; }
190192
public IEnumerable<Guid> Groups { get; set; }
193+
/// <summary>
194+
/// The reason the user is revoked. Null if the user is not revoked, or was revoked before
195+
/// revocation reasons were tracked.
196+
/// </summary>
197+
public RevocationReason? RevocationReason { get; set; }
191198
}
192199

193200
public class OrganizationUserResetPasswordDetailsResponseModel : ResponseModel

src/Api/AdminConsole/Public/Controllers/MembersController.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Bit.Api.AdminConsole.Public.Models.Response;
44
using Bit.Api.Models.Public.Response;
55
using Bit.Core;
6-
using Bit.Core.AdminConsole.Models.Business;
76
using Bit.Core.AdminConsole.Models.Data;
87
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
98
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
@@ -14,7 +13,6 @@
1413
using Bit.Core.AdminConsole.Repositories;
1514
using Bit.Core.AdminConsole.Utilities.Commands;
1615
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
17-
using Bit.Core.Billing.Pricing;
1816
using Bit.Core.Billing.Services;
1917
using Bit.Core.Context;
2018
using Bit.Core.Enums;
@@ -46,7 +44,6 @@ public class MembersController : Controller
4644
private readonly IRestoreOrganizationUserCommand _restoreOrganizationUserCommand;
4745
private readonly IFeatureService _featureService;
4846
private readonly IInviteOrganizationUsersCommand _inviteOrganizationUsersCommand;
49-
private readonly IPricingClient _pricingClient;
5047
private readonly TimeProvider _timeProvider;
5148

5249
public MembersController(
@@ -65,7 +62,6 @@ public MembersController(
6562
IRestoreOrganizationUserCommand restoreOrganizationUserCommand,
6663
IFeatureService featureService,
6764
IInviteOrganizationUsersCommand inviteOrganizationUsersCommand,
68-
IPricingClient pricingClient,
6965
TimeProvider timeProvider)
7066
{
7167
_organizationUserRepository = organizationUserRepository;
@@ -83,7 +79,6 @@ public MembersController(
8379
_restoreOrganizationUserCommand = restoreOrganizationUserCommand;
8480
_featureService = featureService;
8581
_inviteOrganizationUsersCommand = inviteOrganizationUsersCommand;
86-
_pricingClient = pricingClient;
8782
_timeProvider = timeProvider;
8883
}
8984

@@ -194,9 +189,7 @@ private async Task<IActionResult> PostInviteUserAsync_vNext(
194189
Core.AdminConsole.Entities.Organization organization,
195190
bool hasStandaloneSecretsManager)
196191
{
197-
var plan = await _pricingClient.GetPlanOrThrow(organization.PlanType);
198-
var inviteOrganization = new InviteOrganization(organization, plan);
199-
var request = model.ToInviteRequest(inviteOrganization, hasStandaloneSecretsManager, Guid.Empty, _timeProvider.GetUtcNow());
192+
var request = model.ToInviteRequest(organization, hasStandaloneSecretsManager, Guid.Empty, _timeProvider.GetUtcNow());
200193

201194
var result = await _inviteOrganizationUsersCommand.InviteImportedOrganizationUsersAsync(request);
202195

src/Api/AdminConsole/Public/Models/Request/MemberCreateRequestModel.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#nullable disable
33

44
using System.ComponentModel.DataAnnotations;
5-
using Bit.Core.AdminConsole.Models.Business;
5+
using Bit.Core.AdminConsole.Entities;
66
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
77
using Bit.Core.Entities;
88
using Bit.Core.Enums;
@@ -48,7 +48,7 @@ public OrganizationUserInvite ToOrganizationUserInvite()
4848
}
4949

5050
public InviteOrganizationUsersRequest ToInviteRequest(
51-
InviteOrganization inviteOrganization,
51+
Organization organization,
5252
bool accessSecretsManager,
5353
Guid performedBy,
5454
DateTimeOffset performedAt)
@@ -70,7 +70,7 @@ public InviteOrganizationUsersRequest ToInviteRequest(
7070
externalId: ExternalId,
7171
accessSecretsManager: accessSecretsManager)
7272
],
73-
inviteOrganization: inviteOrganization,
73+
organization: organization,
7474
performedBy: performedBy,
7575
performedAt: performedAt);
7676
}

src/Api/Auth/Controllers/WebAuthnController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ private async Task ValidateIfUserCanUsePasskeyLogin(Guid userId)
159159
public async Task UpdateCredential([FromBody] WebAuthnLoginCredentialUpdateRequestModel model)
160160
{
161161
var tokenable = _assertionOptionsDataProtector.Unprotect(model.Token);
162-
if (!tokenable.TokenIsValid(WebAuthnLoginAssertionOptionsScope.UpdateKeySet))
162+
if (!tokenable.TokenIsValid(WebAuthnLoginAssertionOptionsScope.UpdateKeySet) || tokenable.Options == null)
163163
{
164164
throw new BadRequestException("The token associated with your request is invalid or has expired. A valid token is required to continue.");
165165
}

src/Api/Models/Response/PlanResponseModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public PlanResponseModel(Plan plan, string obj = "plan")
3939
HasResetPassword = plan.HasResetPassword;
4040
UsersGetPremium = plan.UsersGetPremium;
4141
HasMyItems = plan.HasMyItems;
42+
HasInviteLinks = plan.HasInviteLinks;
4243
UpgradeSortOrder = plan.UpgradeSortOrder;
4344
DisplaySortOrder = plan.DisplaySortOrder;
4445
LegacyYear = plan.LegacyYear;
@@ -80,6 +81,7 @@ public PlanResponseModel(Organization organization, string obj = "plan") : base(
8081
public bool HasResetPassword { get; set; }
8182
public bool UsersGetPremium { get; set; }
8283
public bool HasMyItems { get; set; }
84+
public bool HasInviteLinks { get; set; }
8385

8486
public int UpgradeSortOrder { get; set; }
8587
public int DisplaySortOrder { get; set; }

src/Core/AdminConsole/Entities/Organization.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ public class Organization : ITableObject<Guid>, IStorableSubscriber, IRevisable
150150
/// </summary>
151151
public bool UseMyItems { get; set; }
152152

153+
/// <summary>
154+
/// If set to true, the organization can generate invite links to invite users to the organization.
155+
/// This is an Enterprise-only feature.
156+
/// </summary>
157+
public bool UseInviteLinks { get; set; }
158+
153159
/// <summary>
154160
/// When set to <see langword="true"/>, the organization is excluded from automated billing
155161
/// lifecycle operations such as subscription cancellation and disabling for non-payment.
@@ -337,6 +343,7 @@ public void UpdateFromLicense(OrganizationLicense license, IFeatureService featu
337343
UseApi = license.UseApi;
338344
UsePolicies = license.UsePolicies;
339345
UseMyItems = license.UseMyItems;
346+
UseInviteLinks = license.UseInviteLinks;
340347
UseSso = license.UseSso;
341348
UseKeyConnector = license.UseKeyConnector;
342349
UseScim = license.UseScim;

0 commit comments

Comments
 (0)