From ca116c7488e5eae33b21b6352cdf399fa50a5649 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 6 Apr 2026 14:42:25 -0500 Subject: [PATCH 1/3] Remove code around sso/details --- .../OrganizationDomainController.cs | 14 --------- ...ganizationDomainSsoDetailsResponseModel.cs | 26 ---------------- .../OrganizationDomainSsoDetailsData.cs | 15 ---------- .../IOrganizationDomainRepository.cs | 1 - .../OrganizationDomainRepository.cs | 14 --------- .../OrganizationDomainRepository.cs | 26 ---------------- .../OrganizationDomainControllerTests.cs | 30 +++---------------- 7 files changed, 4 insertions(+), 122 deletions(-) delete mode 100644 src/Api/AdminConsole/Models/Response/Organizations/OrganizationDomainSsoDetailsResponseModel.cs delete mode 100644 src/Core/Models/Data/Organizations/OrganizationDomainSsoDetailsData.cs diff --git a/src/Api/AdminConsole/Controllers/OrganizationDomainController.cs b/src/Api/AdminConsole/Controllers/OrganizationDomainController.cs index 15cfafe240ec..534e27121cdc 100644 --- a/src/Api/AdminConsole/Controllers/OrganizationDomainController.cs +++ b/src/Api/AdminConsole/Controllers/OrganizationDomainController.cs @@ -125,20 +125,6 @@ public async Task PostRemoveDomain(Guid orgId, Guid id) await RemoveDomain(orgId, id); } - [AllowAnonymous] - [HttpPost("domain/sso/details")] // must be post to accept email cleanly - public async Task GetOrgDomainSsoDetails( - [FromBody] OrganizationDomainSsoDetailsRequestModel model) - { - var ssoResult = await _organizationDomainRepository.GetOrganizationDomainSsoDetailsAsync(model.Email); - if (ssoResult is null) - { - throw new NotFoundException("Claimed org domain not found"); - } - - return new OrganizationDomainSsoDetailsResponseModel(ssoResult); - } - [AllowAnonymous] [HttpPost("domain/sso/verified")] public async Task GetVerifiedOrgDomainSsoDetailsAsync( diff --git a/src/Api/AdminConsole/Models/Response/Organizations/OrganizationDomainSsoDetailsResponseModel.cs b/src/Api/AdminConsole/Models/Response/Organizations/OrganizationDomainSsoDetailsResponseModel.cs deleted file mode 100644 index 0b232010a1e2..000000000000 --- a/src/Api/AdminConsole/Models/Response/Organizations/OrganizationDomainSsoDetailsResponseModel.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Bit.Core.Models.Api; -using Bit.Core.Models.Data.Organizations; - -namespace Bit.Api.AdminConsole.Models.Response.Organizations; - -public class OrganizationDomainSsoDetailsResponseModel : ResponseModel -{ - public OrganizationDomainSsoDetailsResponseModel(OrganizationDomainSsoDetailsData data, string obj = "organizationDomainSsoDetails") - : base(obj) - { - if (data == null) - { - throw new ArgumentNullException(nameof(data)); - } - - SsoAvailable = data.SsoAvailable; - DomainName = data.DomainName; - OrganizationIdentifier = data.OrganizationIdentifier; - VerifiedDate = data.VerifiedDate; - } - - public bool SsoAvailable { get; private set; } - public string DomainName { get; private set; } - public string OrganizationIdentifier { get; private set; } - public DateTime? VerifiedDate { get; private set; } -} diff --git a/src/Core/Models/Data/Organizations/OrganizationDomainSsoDetailsData.cs b/src/Core/Models/Data/Organizations/OrganizationDomainSsoDetailsData.cs deleted file mode 100644 index 31f82e19a6ff..000000000000 --- a/src/Core/Models/Data/Organizations/OrganizationDomainSsoDetailsData.cs +++ /dev/null @@ -1,15 +0,0 @@ -// FIXME: Update this file to be null safe and then delete the line below -#nullable disable - -namespace Bit.Core.Models.Data.Organizations; - -public class OrganizationDomainSsoDetailsData -{ - public Guid OrganizationId { get; set; } - public string OrganizationName { get; set; } - public string DomainName { get; set; } - public bool SsoAvailable { get; set; } - public string OrganizationIdentifier { get; set; } - public DateTime? VerifiedDate { get; set; } - public bool OrganizationEnabled { get; set; } -} diff --git a/src/Core/Repositories/IOrganizationDomainRepository.cs b/src/Core/Repositories/IOrganizationDomainRepository.cs index b993cd42fa42..6c51407693f6 100644 --- a/src/Core/Repositories/IOrganizationDomainRepository.cs +++ b/src/Core/Repositories/IOrganizationDomainRepository.cs @@ -10,7 +10,6 @@ public interface IOrganizationDomainRepository : IRepository> GetClaimedDomainsByDomainNameAsync(string domainName); Task> GetDomainsByOrganizationIdAsync(Guid orgId); Task> GetManyByNextRunDateAsync(DateTime date); - Task GetOrganizationDomainSsoDetailsAsync(string email); Task> GetVerifiedOrganizationDomainSsoDetailsAsync(string email); Task> GetVerifiedDomainsByOrganizationIdsAsync(IEnumerable organizationIds); Task GetDomainByIdOrganizationIdAsync(Guid id, Guid organizationId); diff --git a/src/Infrastructure.Dapper/Repositories/OrganizationDomainRepository.cs b/src/Infrastructure.Dapper/Repositories/OrganizationDomainRepository.cs index a8171c286b2d..15ccfec8b43b 100644 --- a/src/Infrastructure.Dapper/Repositories/OrganizationDomainRepository.cs +++ b/src/Infrastructure.Dapper/Repositories/OrganizationDomainRepository.cs @@ -71,20 +71,6 @@ public async Task> GetManyByNextRunDateAsync(Dat return results.ToList(); } - public async Task GetOrganizationDomainSsoDetailsAsync(string email) - { - using (var connection = new SqlConnection(ConnectionString)) - { - var results = await connection - .QueryAsync( - $"[{Schema}].[OrganizationDomainSsoDetails_ReadByEmail]", - new { Email = email }, - commandType: CommandType.StoredProcedure); - - return results.SingleOrDefault(); - } - } - public async Task> GetVerifiedOrganizationDomainSsoDetailsAsync(string email) { await using var connection = new SqlConnection(ConnectionString); diff --git a/src/Infrastructure.EntityFramework/Repositories/OrganizationDomainRepository.cs b/src/Infrastructure.EntityFramework/Repositories/OrganizationDomainRepository.cs index d337a5e856e2..08fd9779d27b 100644 --- a/src/Infrastructure.EntityFramework/Repositories/OrganizationDomainRepository.cs +++ b/src/Infrastructure.EntityFramework/Repositories/OrganizationDomainRepository.cs @@ -59,32 +59,6 @@ public OrganizationDomainRepository(IServiceScopeFactory serviceScopeFactory, IM return Mapper.Map>(pastDomains); } - public async Task GetOrganizationDomainSsoDetailsAsync(string email) - { - var domainName = new MailAddress(email).Host; - - using var scope = ServiceScopeFactory.CreateScope(); - var dbContext = GetDatabaseContext(scope); - var ssoDetails = await (from o in dbContext.Organizations - from od in o.Domains - join s in dbContext.SsoConfigs on o.Id equals s.OrganizationId into sJoin - from s in sJoin.DefaultIfEmpty() - where od.DomainName == domainName && o.Enabled - select new OrganizationDomainSsoDetailsData - { - OrganizationId = o.Id, - OrganizationName = o.Name, - SsoAvailable = o.SsoConfigs.Any(sc => sc.Enabled), - OrganizationIdentifier = o.Identifier, - VerifiedDate = od.VerifiedDate, - DomainName = od.DomainName - }) - .AsNoTracking() - .SingleOrDefaultAsync(); - - return ssoDetails; - } - public async Task> GetVerifiedOrganizationDomainSsoDetailsAsync(string email) { var domainName = new MailAddress(email).Host; diff --git a/test/Api.Test/AdminConsole/Controllers/OrganizationDomainControllerTests.cs b/test/Api.Test/AdminConsole/Controllers/OrganizationDomainControllerTests.cs index f81221c60539..738224727ac6 100644 --- a/test/Api.Test/AdminConsole/Controllers/OrganizationDomainControllerTests.cs +++ b/test/Api.Test/AdminConsole/Controllers/OrganizationDomainControllerTests.cs @@ -294,37 +294,15 @@ await sutProvider.GetDependency().Received(1) } [Theory, BitAutoData] - public async Task GetOrgDomainSsoDetails_ShouldThrowNotFound_WhenEmailHasNotClaimedDomain( - OrganizationDomainSsoDetailsRequestModel model, SutProvider sutProvider) - { - sutProvider.GetDependency() - .GetOrganizationDomainSsoDetailsAsync(model.Email).ReturnsNull(); - - var requestAction = async () => await sutProvider.Sut.GetOrgDomainSsoDetails(model); - - await Assert.ThrowsAsync(requestAction); - } - - [Theory, BitAutoData] - public async Task GetOrgDomainSsoDetails_ShouldReturnOrganizationDomainSsoDetails_WhenEmailHasClaimedDomain( - OrganizationDomainSsoDetailsRequestModel model, OrganizationDomainSsoDetailsData ssoDetailsData, SutProvider sutProvider) - { - sutProvider.GetDependency() - .GetOrganizationDomainSsoDetailsAsync(model.Email).Returns(ssoDetailsData); - - var result = await sutProvider.Sut.GetOrgDomainSsoDetails(model); - - Assert.IsType(result); - } - - [Theory, BitAutoData] - public async Task GetVerifiedOrgDomainSsoDetails_ShouldThrowNotFound_WhenEmailHasNotClaimedDomain( + public async Task GetVerifiedOrgDomainSsoDetails_ShouldReturnEmptyList_WhenEmailHasNoVerifiedDomain( OrganizationDomainSsoDetailsRequestModel model, SutProvider sutProvider) { sutProvider.GetDependency() .GetVerifiedOrganizationDomainSsoDetailsAsync(model.Email).Returns(Array.Empty()); - await Assert.ThrowsAsync(() => sutProvider.Sut.GetOrgDomainSsoDetails(model)); + var result = await sutProvider.Sut.GetVerifiedOrgDomainSsoDetailsAsync(model); + + Assert.IsType(result); } [Theory, BitAutoData] From 0fbd9b4b92d5ddefe2a5855022c9fe00a3f04e58 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 6 Apr 2026 14:43:10 -0500 Subject: [PATCH 2/3] Remove unused sproc --- ...ganizationDomainSsoDetails_ReadByEmail.sql | 26 ------------------- ...rganizationDomainSsoDetailsReadByEmail.sql | 5 ++++ 2 files changed, 5 insertions(+), 26 deletions(-) delete mode 100644 src/Sql/dbo/Stored Procedures/OrganizationDomainSsoDetails_ReadByEmail.sql create mode 100644 util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql diff --git a/src/Sql/dbo/Stored Procedures/OrganizationDomainSsoDetails_ReadByEmail.sql b/src/Sql/dbo/Stored Procedures/OrganizationDomainSsoDetails_ReadByEmail.sql deleted file mode 100644 index 262d4bfd8d8f..000000000000 --- a/src/Sql/dbo/Stored Procedures/OrganizationDomainSsoDetails_ReadByEmail.sql +++ /dev/null @@ -1,26 +0,0 @@ -CREATE PROCEDURE [dbo].[OrganizationDomainSsoDetails_ReadByEmail] - @Email NVARCHAR(256) -AS -BEGIN - SET NOCOUNT ON - - DECLARE @Domain NVARCHAR(256) - - SELECT @Domain = SUBSTRING(@Email, CHARINDEX( '@', @Email) + 1, LEN(@Email)) - - SELECT - O.Id AS OrganizationId, - O.[Name] AS OrganizationName, - S.Enabled AS SsoAvailable, - O.Identifier AS OrganizationIdentifier, - OD.VerifiedDate, - OD.DomainName - FROM - [dbo].[OrganizationView] O - INNER JOIN [dbo].[OrganizationDomainView] OD - ON O.Id = OD.OrganizationId - LEFT JOIN [dbo].[SsoConfig] S - ON O.Id = S.OrganizationId - WHERE OD.DomainName = @Domain - AND O.Enabled = 1 -END diff --git a/util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql b/util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql new file mode 100644 index 000000000000..659555fd5660 --- /dev/null +++ b/util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql @@ -0,0 +1,5 @@ +IF OBJECT_ID('[dbo].[OrganizationDomainSsoDetails_ReadByEmail]') IS NOT NULL +BEGIN + DROP PROCEDURE [dbo].[OrganizationDomainSsoDetails_ReadByEmail] +END +GO From a71e47cd8b8bc3f7868158cb1e66c607967c2b8c Mon Sep 17 00:00:00 2001 From: Sven Date: Wed, 15 Apr 2026 14:39:20 -0500 Subject: [PATCH 3/3] adjust migration file --- ...2026-04-15_00_DropOrganizationDomainSsoDetailsReadByEmail.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename util/Migrator/DbScripts/{2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql => 2026-04-15_00_DropOrganizationDomainSsoDetailsReadByEmail.sql} (100%) diff --git a/util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql b/util/Migrator/DbScripts/2026-04-15_00_DropOrganizationDomainSsoDetailsReadByEmail.sql similarity index 100% rename from util/Migrator/DbScripts/2026-04-06_00_DropOrganizationDomainSsoDetailsReadByEmail.sql rename to util/Migrator/DbScripts/2026-04-15_00_DropOrganizationDomainSsoDetailsReadByEmail.sql