1
0
mirror of https://github.com/bitwarden/server synced 2025-12-15 07:43:54 +00:00

[PM-22405] Add debugging instrument for finding invalid OrganizationUser state. (#5955)

This commit is contained in:
Jimmy Vo
2025-06-30 09:45:15 -04:00
committed by GitHub
parent 4eb2134e10
commit 1da39aa2b8
4 changed files with 198 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ using System.Text.Json;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Enums;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
using Bit.Core.AdminConsole.Utilities.DebuggingInstruments;
using Bit.Core.Entities;
using Bit.Core.Enums;
using Bit.Core.KeyManagement.UserKey;
@@ -12,6 +13,7 @@ using Bit.Core.Repositories;
using Bit.Core.Settings;
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Logging;
#nullable enable
@@ -25,8 +27,9 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
/// https://github.com/dotnet/SqlClient/issues/54
/// </summary>
private string _marsConnectionString;
private readonly ILogger<OrganizationUserRepository> _logger;
public OrganizationUserRepository(GlobalSettings globalSettings)
public OrganizationUserRepository(GlobalSettings globalSettings, ILogger<OrganizationUserRepository> logger)
: base(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString)
{
var builder = new SqlConnectionStringBuilder(ConnectionString)
@@ -34,6 +37,7 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
MultipleActiveResultSets = true,
};
_marsConnectionString = builder.ToString();
_logger = logger;
}
public async Task<int> GetCountByOrganizationIdAsync(Guid organizationId)
@@ -305,6 +309,8 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
public async Task<Guid> CreateAsync(OrganizationUser obj, IEnumerable<CollectionAccessSelection> collections)
{
_logger.LogUserInviteStateDiagnostics(obj);
obj.SetNewId();
var objWithCollections = JsonSerializer.Deserialize<OrganizationUserWithCollections>(
JsonSerializer.Serialize(obj))!;
@@ -323,6 +329,8 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
public async Task ReplaceAsync(OrganizationUser obj, IEnumerable<CollectionAccessSelection> collections)
{
_logger.LogUserInviteStateDiagnostics(obj);
var objWithCollections = JsonSerializer.Deserialize<OrganizationUserWithCollections>(
JsonSerializer.Serialize(obj))!;
objWithCollections.Collections = collections.ToArrayTVP();
@@ -406,6 +414,8 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
public async Task<ICollection<Guid>?> CreateManyAsync(IEnumerable<OrganizationUser> organizationUsers)
{
_logger.LogUserInviteStateDiagnostics(organizationUsers);
organizationUsers = organizationUsers.ToList();
if (!organizationUsers.Any())
{
@@ -430,6 +440,8 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
public async Task ReplaceManyAsync(IEnumerable<OrganizationUser> organizationUsers)
{
_logger.LogUserInviteStateDiagnostics(organizationUsers);
organizationUsers = organizationUsers.ToList();
if (!organizationUsers.Any())
{