mirror of
https://github.com/bitwarden/server.git
synced 2025-06-30 15:42:48 -05:00
[PM-14406] Security Task Notifications (#5344)
* initial commit of `CipherOrganizationPermission_GetManyByUserId` * create queries to get all of the security tasks that are actionable by a user - A task is "actionable" when the user has manage permissions for that cipher * rename query * return the user's email from the query as well * Add email notification for at-risk passwords - Added email layouts for security tasks * add push notification for security tasks * update entity framework to match stored procedure plus testing * update date of migration and remove orderby * add push service to security task controller * rename `SyncSecurityTasksCreated` to `SyncNotification` * remove duplicate return * remove unused directive * remove unneeded new notification type * use `createNotificationCommand` to alert all platforms * return the cipher id that is associated with the security task and store the security task id on the notification entry * Add `TaskId` to the output model of `GetUserSecurityTasksByCipherIdsAsync` * move notification logic to command * use TaskId from `_getSecurityTasksNotificationDetailsQuery` * add service * only push last notification for each user * formatting * refactor `CreateNotificationCommand` parameter to `sendPush` * flip boolean in test * update interface to match usage * do not push any of the security related notifications to the user * add `PendingSecurityTasks` push type * add push notification for pending security tasks
This commit is contained in:
@ -0,0 +1,68 @@
|
||||
CREATE OR ALTER PROCEDURE [dbo].[UserSecurityTasks_GetManyByCipherIds]
|
||||
@OrganizationId UNIQUEIDENTIFIER,
|
||||
@CipherIds AS [dbo].[GuidIdArray] READONLY
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
;WITH BaseCiphers AS (
|
||||
SELECT C.[Id], C.[OrganizationId]
|
||||
FROM [dbo].[Cipher] C
|
||||
INNER JOIN @CipherIds CI ON C.[Id] = CI.[Id]
|
||||
INNER JOIN [dbo].[Organization] O ON
|
||||
O.[Id] = C.[OrganizationId]
|
||||
AND O.[Id] = @OrganizationId
|
||||
AND O.[Enabled] = 1
|
||||
),
|
||||
UserPermissions AS (
|
||||
SELECT DISTINCT
|
||||
CC.[CipherId],
|
||||
OU.[UserId],
|
||||
COALESCE(CU.[Manage], 0) as [Manage]
|
||||
FROM [dbo].[CollectionCipher] CC
|
||||
INNER JOIN [dbo].[CollectionUser] CU ON
|
||||
CU.[CollectionId] = CC.[CollectionId]
|
||||
INNER JOIN [dbo].[OrganizationUser] OU ON
|
||||
CU.[OrganizationUserId] = OU.[Id]
|
||||
AND OU.[OrganizationId] = @OrganizationId
|
||||
WHERE COALESCE(CU.[Manage], 0) = 1
|
||||
),
|
||||
GroupPermissions AS (
|
||||
SELECT DISTINCT
|
||||
CC.[CipherId],
|
||||
OU.[UserId],
|
||||
COALESCE(CG.[Manage], 0) as [Manage]
|
||||
FROM [dbo].[CollectionCipher] CC
|
||||
INNER JOIN [dbo].[CollectionGroup] CG ON
|
||||
CG.[CollectionId] = CC.[CollectionId]
|
||||
INNER JOIN [dbo].[GroupUser] GU ON
|
||||
GU.[GroupId] = CG.[GroupId]
|
||||
INNER JOIN [dbo].[OrganizationUser] OU ON
|
||||
GU.[OrganizationUserId] = OU.[Id]
|
||||
AND OU.[OrganizationId] = @OrganizationId
|
||||
WHERE COALESCE(CG.[Manage], 0) = 1
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM UserPermissions UP
|
||||
WHERE UP.[CipherId] = CC.[CipherId]
|
||||
AND UP.[UserId] = OU.[UserId]
|
||||
)
|
||||
),
|
||||
CombinedPermissions AS (
|
||||
SELECT CipherId, UserId, [Manage]
|
||||
FROM UserPermissions
|
||||
UNION
|
||||
SELECT CipherId, UserId, [Manage]
|
||||
FROM GroupPermissions
|
||||
)
|
||||
SELECT
|
||||
P.[UserId],
|
||||
U.[Email],
|
||||
C.[Id] as CipherId
|
||||
FROM BaseCiphers C
|
||||
INNER JOIN CombinedPermissions P ON P.CipherId = C.[Id]
|
||||
INNER JOIN [dbo].[User] U ON U.[Id] = P.[UserId]
|
||||
WHERE P.[Manage] = 1
|
||||
ORDER BY U.[Email], C.[Id]
|
||||
END
|
||||
GO
|
Reference in New Issue
Block a user