mirror of
https://github.com/bitwarden/server.git
synced 2025-04-22 21:45:15 -05:00
sync org policies to client devices
This commit is contained in:
parent
82be2ae06b
commit
725522128c
@ -25,6 +25,7 @@ namespace Bit.Api.Controllers
|
|||||||
private readonly ICollectionRepository _collectionRepository;
|
private readonly ICollectionRepository _collectionRepository;
|
||||||
private readonly ICollectionCipherRepository _collectionCipherRepository;
|
private readonly ICollectionCipherRepository _collectionCipherRepository;
|
||||||
private readonly IOrganizationUserRepository _organizationUserRepository;
|
private readonly IOrganizationUserRepository _organizationUserRepository;
|
||||||
|
private readonly IPolicyRepository _policyRepository;
|
||||||
private readonly GlobalSettings _globalSettings;
|
private readonly GlobalSettings _globalSettings;
|
||||||
|
|
||||||
public SyncController(
|
public SyncController(
|
||||||
@ -34,6 +35,7 @@ namespace Bit.Api.Controllers
|
|||||||
ICollectionRepository collectionRepository,
|
ICollectionRepository collectionRepository,
|
||||||
ICollectionCipherRepository collectionCipherRepository,
|
ICollectionCipherRepository collectionCipherRepository,
|
||||||
IOrganizationUserRepository organizationUserRepository,
|
IOrganizationUserRepository organizationUserRepository,
|
||||||
|
IPolicyRepository policyRepository,
|
||||||
GlobalSettings globalSettings)
|
GlobalSettings globalSettings)
|
||||||
{
|
{
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
@ -42,6 +44,7 @@ namespace Bit.Api.Controllers
|
|||||||
_collectionRepository = collectionRepository;
|
_collectionRepository = collectionRepository;
|
||||||
_collectionCipherRepository = collectionCipherRepository;
|
_collectionCipherRepository = collectionCipherRepository;
|
||||||
_organizationUserRepository = organizationUserRepository;
|
_organizationUserRepository = organizationUserRepository;
|
||||||
|
_policyRepository = policyRepository;
|
||||||
_globalSettings = globalSettings;
|
_globalSettings = globalSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,16 +65,18 @@ namespace Bit.Api.Controllers
|
|||||||
|
|
||||||
IEnumerable<CollectionDetails> collections = null;
|
IEnumerable<CollectionDetails> collections = null;
|
||||||
IDictionary<Guid, IGrouping<Guid, CollectionCipher>> collectionCiphersGroupDict = null;
|
IDictionary<Guid, IGrouping<Guid, CollectionCipher>> collectionCiphersGroupDict = null;
|
||||||
|
IEnumerable<Policy> policies = null;
|
||||||
if(hasEnabledOrgs)
|
if(hasEnabledOrgs)
|
||||||
{
|
{
|
||||||
collections = await _collectionRepository.GetManyByUserIdAsync(user.Id);
|
collections = await _collectionRepository.GetManyByUserIdAsync(user.Id);
|
||||||
var collectionCiphers = await _collectionCipherRepository.GetManyByUserIdAsync(user.Id);
|
var collectionCiphers = await _collectionCipherRepository.GetManyByUserIdAsync(user.Id);
|
||||||
collectionCiphersGroupDict = collectionCiphers.GroupBy(c => c.CipherId).ToDictionary(s => s.Key);
|
collectionCiphersGroupDict = collectionCiphers.GroupBy(c => c.CipherId).ToDictionary(s => s.Key);
|
||||||
|
policies = await _policyRepository.GetManyByUserIdAsync(user.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
var userTwoFactorEnabled = await _userService.TwoFactorIsEnabledAsync(user);
|
var userTwoFactorEnabled = await _userService.TwoFactorIsEnabledAsync(user);
|
||||||
var response = new SyncResponseModel(_globalSettings, user, userTwoFactorEnabled, organizationUserDetails,
|
var response = new SyncResponseModel(_globalSettings, user, userTwoFactorEnabled, organizationUserDetails,
|
||||||
folders, collections, ciphers, collectionCiphersGroupDict, excludeDomains);
|
folders, collections, ciphers, collectionCiphersGroupDict, excludeDomains, policies);
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,8 @@ namespace Bit.Core.Models.Api
|
|||||||
IEnumerable<CollectionDetails> collections,
|
IEnumerable<CollectionDetails> collections,
|
||||||
IEnumerable<CipherDetails> ciphers,
|
IEnumerable<CipherDetails> ciphers,
|
||||||
IDictionary<Guid, IGrouping<Guid, CollectionCipher>> collectionCiphersDict,
|
IDictionary<Guid, IGrouping<Guid, CollectionCipher>> collectionCiphersDict,
|
||||||
bool excludeDomains)
|
bool excludeDomains,
|
||||||
|
IEnumerable<Policy> policies)
|
||||||
: base("sync")
|
: base("sync")
|
||||||
{
|
{
|
||||||
Profile = new ProfileResponseModel(user, organizationUserDetails, userTwoFactorEnabled);
|
Profile = new ProfileResponseModel(user, organizationUserDetails, userTwoFactorEnabled);
|
||||||
@ -27,6 +28,7 @@ namespace Bit.Core.Models.Api
|
|||||||
Collections = collections?.Select(
|
Collections = collections?.Select(
|
||||||
c => new CollectionDetailsResponseModel(c)) ?? new List<CollectionDetailsResponseModel>();
|
c => new CollectionDetailsResponseModel(c)) ?? new List<CollectionDetailsResponseModel>();
|
||||||
Domains = excludeDomains ? null : new DomainsResponseModel(user, false);
|
Domains = excludeDomains ? null : new DomainsResponseModel(user, false);
|
||||||
|
Policies = policies.Select(p => new PolicyResponseModel(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProfileResponseModel Profile { get; set; }
|
public ProfileResponseModel Profile { get; set; }
|
||||||
@ -34,5 +36,6 @@ namespace Bit.Core.Models.Api
|
|||||||
public IEnumerable<CollectionDetailsResponseModel> Collections { get; set; }
|
public IEnumerable<CollectionDetailsResponseModel> Collections { get; set; }
|
||||||
public IEnumerable<CipherDetailsResponseModel> Ciphers { get; set; }
|
public IEnumerable<CipherDetailsResponseModel> Ciphers { get; set; }
|
||||||
public DomainsResponseModel Domains { get; set; }
|
public DomainsResponseModel Domains { get; set; }
|
||||||
|
public IEnumerable<PolicyResponseModel> Policies { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,5 +10,6 @@ namespace Bit.Core.Repositories
|
|||||||
{
|
{
|
||||||
Task<Policy> GetByOrganizationIdTypeAsync(Guid organizationId, PolicyType type);
|
Task<Policy> GetByOrganizationIdTypeAsync(Guid organizationId, PolicyType type);
|
||||||
Task<ICollection<Policy>> GetManyByOrganizationIdAsync(Guid organizationId);
|
Task<ICollection<Policy>> GetManyByOrganizationIdAsync(Guid organizationId);
|
||||||
|
Task<ICollection<Policy>> GetManyByUserIdAsync(Guid userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,5 +44,18 @@ namespace Bit.Core.Repositories.SqlServer
|
|||||||
return results.ToList();
|
return results.ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<ICollection<Policy>> GetManyByUserIdAsync(Guid userId)
|
||||||
|
{
|
||||||
|
using(var connection = new SqlConnection(ConnectionString))
|
||||||
|
{
|
||||||
|
var results = await connection.QueryAsync<Policy>(
|
||||||
|
$"[{Schema}].[{Table}_ReadByUserId]",
|
||||||
|
new { UserId = userId },
|
||||||
|
commandType: CommandType.StoredProcedure);
|
||||||
|
|
||||||
|
return results.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,5 +260,6 @@
|
|||||||
<Build Include="dbo\Stored Procedures\Policy_Update.sql" />
|
<Build Include="dbo\Stored Procedures\Policy_Update.sql" />
|
||||||
<Build Include="dbo\Views\PolicyView.sql" />
|
<Build Include="dbo\Views\PolicyView.sql" />
|
||||||
<Build Include="dbo\Stored Procedures\Policy_ReadByOrganizationIdType.sql" />
|
<Build Include="dbo\Stored Procedures\Policy_ReadByOrganizationIdType.sql" />
|
||||||
|
<Build Include="dbo\Stored Procedures\Policy_ReadByUserId.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
15
src/Sql/dbo/Stored Procedures/Policy_ReadByUserId.sql
Normal file
15
src/Sql/dbo/Stored Procedures/Policy_ReadByUserId.sql
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
CREATE PROCEDURE [dbo].[Policy_ReadByUserId]
|
||||||
|
@UserId UNIQUEIDENTIFIER
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
P.*
|
||||||
|
FROM
|
||||||
|
[dbo].[PolicyView] P
|
||||||
|
INNER JOIN
|
||||||
|
[dbo].[OrganizationUser] OU ON P.[OrganizationId] = OU.[OrganizationId]
|
||||||
|
WHERE
|
||||||
|
OU.[UserId] = @UserId
|
||||||
|
END
|
@ -557,3 +557,26 @@ BEGIN
|
|||||||
[Id] = @Id
|
[Id] = @Id
|
||||||
END
|
END
|
||||||
GO
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID('[dbo].[Policy_ReadByUserId]') IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
DROP PROCEDURE [dbo].[Policy_ReadByUserId]
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE PROCEDURE [dbo].[Policy_ReadByUserId]
|
||||||
|
@UserId UNIQUEIDENTIFIER
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
P.*
|
||||||
|
FROM
|
||||||
|
[dbo].[PolicyView] P
|
||||||
|
INNER JOIN
|
||||||
|
[dbo].[OrganizationUser] OU ON P.[OrganizationId] = OU.[OrganizationId]
|
||||||
|
WHERE
|
||||||
|
OU.[UserId] = @UserId
|
||||||
|
END
|
||||||
|
GO
|
Loading…
x
Reference in New Issue
Block a user