mirror of
https://github.com/bitwarden/server
synced 2025-12-22 19:23:45 +00:00
[PM-24278] Fix sproc to return UserId (#6203)
This commit is contained in:
@@ -52,6 +52,7 @@ BEGIN
|
|||||||
-- Return policy details for each matching organization user.
|
-- Return policy details for each matching organization user.
|
||||||
SELECT
|
SELECT
|
||||||
OU.[OrganizationUserId],
|
OU.[OrganizationUserId],
|
||||||
|
OU.[UserId],
|
||||||
P.[OrganizationId],
|
P.[OrganizationId],
|
||||||
P.[Type] AS [PolicyType],
|
P.[Type] AS [PolicyType],
|
||||||
P.[Data] AS [PolicyData],
|
P.[Data] AS [PolicyData],
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ public class GetPolicyDetailsByOrganizationIdAsyncTests
|
|||||||
|
|
||||||
Assert.True(results.Single().IsProvider);
|
Assert.True(results.Single().IsProvider);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId });
|
||||||
|
await userRepository.DeleteAsync(user);
|
||||||
|
|
||||||
async Task ArrangeProvider()
|
async Task ArrangeProvider()
|
||||||
{
|
{
|
||||||
var provider = await providerRepository.CreateAsync(new Provider
|
var provider = await providerRepository.CreateAsync(new Provider
|
||||||
@@ -86,6 +90,11 @@ public class GetPolicyDetailsByOrganizationIdAsyncTests
|
|||||||
Assert.Contains(results, result => result.OrganizationUserId == userOrgConnectedDirectly.Id
|
Assert.Contains(results, result => result.OrganizationUserId == userOrgConnectedDirectly.Id
|
||||||
&& result.OrganizationId == userOrgConnectedDirectly.OrganizationId);
|
&& result.OrganizationId == userOrgConnectedDirectly.OrganizationId);
|
||||||
Assert.DoesNotContain(results, result => result.OrganizationId == notConnectedOrg.Id);
|
Assert.DoesNotContain(results, result => result.OrganizationId == notConnectedOrg.Id);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(new Organization { Id = userOrgConnectedDirectly.OrganizationId });
|
||||||
|
await organizationRepository.DeleteAsync(notConnectedOrg);
|
||||||
|
await userRepository.DeleteAsync(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
[DatabaseTheory, DatabaseData]
|
[DatabaseTheory, DatabaseData]
|
||||||
@@ -115,6 +124,10 @@ public class GetPolicyDetailsByOrganizationIdAsyncTests
|
|||||||
&& result.PolicyType == inputPolicyType);
|
&& result.PolicyType == inputPolicyType);
|
||||||
|
|
||||||
Assert.DoesNotContain(results, result => result.PolicyType == notInputPolicyType);
|
Assert.DoesNotContain(results, result => result.PolicyType == notInputPolicyType);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(new Organization { Id = orgUser.OrganizationId });
|
||||||
|
await userRepository.DeleteAsync(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -143,6 +156,12 @@ public class GetPolicyDetailsByOrganizationIdAsyncTests
|
|||||||
Assert.Equal(expectedCount, results.Count);
|
Assert.Equal(expectedCount, results.Count);
|
||||||
|
|
||||||
AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId);
|
AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId });
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId });
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId });
|
||||||
|
await userRepository.DeleteAsync(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
[DatabaseTheory, DatabaseData]
|
[DatabaseTheory, DatabaseData]
|
||||||
@@ -167,8 +186,52 @@ public class GetPolicyDetailsByOrganizationIdAsyncTests
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId);
|
AssertPolicyDetailUserConnections(results, userOrgConnectedDirectly, userOrgConnectedByEmail, userOrgConnectedByUserId);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedDirectly.OrganizationId });
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByEmail.OrganizationId });
|
||||||
|
await organizationRepository.DeleteAsync(new Organization() { Id = userOrgConnectedByUserId.OrganizationId });
|
||||||
|
await userRepository.DeleteAsync(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DatabaseTheory, DatabaseData]
|
||||||
|
public async Task ShouldReturnUserIds(
|
||||||
|
IUserRepository userRepository,
|
||||||
|
IOrganizationUserRepository organizationUserRepository,
|
||||||
|
IOrganizationRepository organizationRepository,
|
||||||
|
IPolicyRepository policyRepository)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var user1 = await userRepository.CreateTestUserAsync();
|
||||||
|
var user2 = await userRepository.CreateTestUserAsync();
|
||||||
|
const PolicyType policyType = PolicyType.SingleOrg;
|
||||||
|
|
||||||
|
var organization = await CreateEnterpriseOrg(organizationRepository);
|
||||||
|
await policyRepository.CreateAsync(new Policy { OrganizationId = organization.Id, Enabled = true, Type = policyType });
|
||||||
|
|
||||||
|
var orgUser1 = await organizationUserRepository.CreateTestOrganizationUserAsync(organization, user1);
|
||||||
|
var orgUser2 = await organizationUserRepository.CreateTestOrganizationUserAsync(organization, user2);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var results = (await policyRepository.GetPolicyDetailsByOrganizationIdAsync(organization.Id, policyType)).ToList();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(2, results.Count);
|
||||||
|
|
||||||
|
Assert.Contains(results, result => result.OrganizationUserId == orgUser1.Id
|
||||||
|
&& result.UserId == orgUser1.UserId
|
||||||
|
&& result.OrganizationId == orgUser1.OrganizationId);
|
||||||
|
|
||||||
|
Assert.Contains(results, result => result.OrganizationUserId == orgUser2.Id
|
||||||
|
&& result.UserId == orgUser2.UserId
|
||||||
|
&& result.OrganizationId == orgUser2.OrganizationId);
|
||||||
|
|
||||||
|
// Annul
|
||||||
|
await organizationRepository.DeleteAsync(organization);
|
||||||
|
await userRepository.DeleteManyAsync([user1, user2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task<OrganizationUser> ArrangeOtherOrgConnectedByUserIdAsync(IOrganizationUserRepository organizationUserRepository,
|
private async Task<OrganizationUser> ArrangeOtherOrgConnectedByUserIdAsync(IOrganizationUserRepository organizationUserRepository,
|
||||||
IOrganizationRepository organizationRepository, IPolicyRepository policyRepository, User user,
|
IOrganizationRepository organizationRepository, IPolicyRepository policyRepository, User user,
|
||||||
PolicyType policyType)
|
PolicyType policyType)
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
CREATE OR ALTER PROCEDURE [dbo].[PolicyDetails_ReadByOrganizationId]
|
||||||
|
@OrganizationId UNIQUEIDENTIFIER,
|
||||||
|
@PolicyType TINYINT
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
-- Get users in the given organization (@OrganizationId) by matching either on UserId or Email.
|
||||||
|
;WITH GivenOrgUsers AS (
|
||||||
|
SELECT
|
||||||
|
OU.[UserId],
|
||||||
|
U.[Email]
|
||||||
|
FROM [dbo].[OrganizationUserView] OU
|
||||||
|
INNER JOIN [dbo].[UserView] U ON U.[Id] = OU.[UserId]
|
||||||
|
WHERE OU.[OrganizationId] = @OrganizationId
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
U.[Id] AS [UserId],
|
||||||
|
U.[Email]
|
||||||
|
FROM [dbo].[OrganizationUserView] OU
|
||||||
|
INNER JOIN [dbo].[UserView] U ON U.[Email] = OU.[Email]
|
||||||
|
WHERE OU.[OrganizationId] = @OrganizationId
|
||||||
|
),
|
||||||
|
|
||||||
|
-- Retrieve all organization users that match on either UserId or Email from GivenOrgUsers.
|
||||||
|
AllOrgUsers AS (
|
||||||
|
SELECT
|
||||||
|
OU.[Id] AS [OrganizationUserId],
|
||||||
|
OU.[UserId],
|
||||||
|
OU.[OrganizationId],
|
||||||
|
AU.[Email],
|
||||||
|
OU.[Type] AS [OrganizationUserType],
|
||||||
|
OU.[Status] AS [OrganizationUserStatus],
|
||||||
|
OU.[Permissions] AS [OrganizationUserPermissionsData]
|
||||||
|
FROM [dbo].[OrganizationUserView] OU
|
||||||
|
INNER JOIN GivenOrgUsers AU ON AU.[UserId] = OU.[UserId]
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
OU.[Id] AS [OrganizationUserId],
|
||||||
|
AU.[UserId],
|
||||||
|
OU.[OrganizationId],
|
||||||
|
AU.[Email],
|
||||||
|
OU.[Type] AS [OrganizationUserType],
|
||||||
|
OU.[Status] AS [OrganizationUserStatus],
|
||||||
|
OU.[Permissions] AS [OrganizationUserPermissionsData]
|
||||||
|
FROM [dbo].[OrganizationUserView] OU
|
||||||
|
INNER JOIN GivenOrgUsers AU ON AU.[Email] = OU.[Email]
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Return policy details for each matching organization user.
|
||||||
|
SELECT
|
||||||
|
OU.[OrganizationUserId],
|
||||||
|
OU.[UserId],
|
||||||
|
P.[OrganizationId],
|
||||||
|
P.[Type] AS [PolicyType],
|
||||||
|
P.[Data] AS [PolicyData],
|
||||||
|
OU.[OrganizationUserType],
|
||||||
|
OU.[OrganizationUserStatus],
|
||||||
|
OU.[OrganizationUserPermissionsData],
|
||||||
|
-- Check if user is a provider for the organization
|
||||||
|
CASE
|
||||||
|
WHEN EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM [dbo].[ProviderUserView] PU
|
||||||
|
INNER JOIN [dbo].[ProviderOrganizationView] PO ON PO.[ProviderId] = PU.[ProviderId]
|
||||||
|
WHERE PU.[UserId] = OU.[UserId]
|
||||||
|
AND PO.[OrganizationId] = P.[OrganizationId]
|
||||||
|
) THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END AS [IsProvider]
|
||||||
|
FROM [dbo].[PolicyView] P
|
||||||
|
INNER JOIN [dbo].[OrganizationView] O ON P.[OrganizationId] = O.[Id]
|
||||||
|
INNER JOIN AllOrgUsers OU ON OU.[OrganizationId] = O.[Id]
|
||||||
|
WHERE P.[Enabled] = 1
|
||||||
|
AND O.[Enabled] = 1
|
||||||
|
AND O.[UsePolicies] = 1
|
||||||
|
AND P.[Type] = @PolicyType
|
||||||
|
|
||||||
|
END
|
||||||
|
GO
|
||||||
Reference in New Issue
Block a user