From 58bab4d163891cbbf23e3dafc8beee2b829ee06e Mon Sep 17 00:00:00 2001 From: = Date: Mon, 2 Sep 2024 13:42:38 +0530 Subject: [PATCH] feat: resolved some more missing corner case in scim --- backend/src/ee/routes/v1/scim-router.ts | 28 +++++++++++-------- backend/src/ee/services/scim/scim-service.ts | 29 +++++++++++--------- backend/src/ee/services/scim/scim-types.ts | 1 + 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/backend/src/ee/routes/v1/scim-router.ts b/backend/src/ee/routes/v1/scim-router.ts index c4e03094c..72d2b241e 100644 --- a/backend/src/ee/routes/v1/scim-router.ts +++ b/backend/src/ee/routes/v1/scim-router.ts @@ -180,14 +180,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => { orgMembershipId: z.string().trim() }), response: { - 200: ScimUserSchema.extend({ - groups: z.array( - z.object({ - value: z.string().trim(), - display: z.string().trim() - }) - ) - }) + 200: ScimUserSchema } }, onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), @@ -284,6 +277,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => { }) .optional(), displayName: z.string().trim(), + emails: z + .array( + z.object({ + primary: z.boolean(), + value: z.string().email(), + type: z.string().trim() + }) + ) + .optional(), active: z.boolean() }), response: { @@ -315,10 +317,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), handler: async (req) => { + const primaryEmail = req.body.emails?.find((email) => email.primary)?.value; const user = await req.server.services.scim.replaceScimUser({ orgMembershipId: req.params.orgMembershipId, orgId: req.permission.orgId, - active: req.body.active + firstName: req.body?.name?.givenName, + lastName: req.body?.name?.familyName, + active: req.body?.active, + email: primaryEmail, + externalId: req.body.userName }); return user; } @@ -450,6 +457,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => { groupId: req.params.groupId, orgId: req.permission.orgId }); + return group; } }); @@ -523,13 +531,11 @@ export const registerScimRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), handler: async (req) => { - console.log(JSON.stringify(req.body, null, 4)); const group = await req.server.services.scim.updateScimGroup({ groupId: req.params.groupId, orgId: req.permission.orgId, operations: req.body.Operations }); - console.log(group); return group; } }); diff --git a/backend/src/ee/services/scim/scim-service.ts b/backend/src/ee/services/scim/scim-service.ts index 956919cf1..ec9ce5aa4 100644 --- a/backend/src/ee/services/scim/scim-service.ts +++ b/backend/src/ee/services/scim/scim-service.ts @@ -59,7 +59,7 @@ type TScimServiceFactoryDep = { TUserDALFactory, "find" | "findOne" | "create" | "transaction" | "findUserEncKeyByUserIdsBatch" | "findById" | "updateById" >; - userAliasDAL: Pick; + userAliasDAL: Pick; orgDAL: Pick< TOrgDALFactory, | "createMembership" @@ -259,11 +259,6 @@ export const scimServiceFactory = ({ status: 403 }); - const groupMembershipsInOrg = await userGroupMembershipDAL.findGroupMembershipsByUserIdInOrg( - membership.userId, - orgId - ); - return buildScimUser({ orgMembershipId: membership.id, username: membership.externalId ?? membership.username, @@ -271,10 +266,6 @@ export const scimServiceFactory = ({ firstName: membership.firstName, lastName: membership.lastName, active: membership.isActive, - groups: groupMembershipsInOrg.map((group) => ({ - value: group.groupId, - display: group.groupName - })), createdAt: membership.createdAt, updatedAt: membership.updatedAt }); @@ -475,7 +466,7 @@ export const scimServiceFactory = ({ lastName: membership.lastName, firstName: membership.firstName, active: membership.isActive, - username: membership.username, + username: membership.externalId ?? membership.username, createdAt: membership.createdAt, updatedAt: membership.updatedAt }); @@ -512,7 +503,8 @@ export const scimServiceFactory = ({ orgId, lastName, firstName, - email + email, + externalId }: TReplaceScimUserDTO) => { const [membership] = await orgDAL .findMembership({ @@ -540,6 +532,17 @@ export const scimServiceFactory = ({ const serverCfg = await getServerCfg(); await userDAL.transaction(async (tx) => { + await userAliasDAL.update( + { + orgId, + aliasType: UserAliasType.SAML, + userId: membership.userId + }, + { + externalId + }, + tx + ); await orgMembershipDAL.updateById( membership.id, { @@ -561,7 +564,7 @@ export const scimServiceFactory = ({ return buildScimUser({ orgMembershipId: membership.id, - username: membership.externalId ?? membership.username, + username: externalId, email: membership.email, firstName: membership.firstName, lastName: membership.lastName, diff --git a/backend/src/ee/services/scim/scim-types.ts b/backend/src/ee/services/scim/scim-types.ts index 9caa44a03..4d23b5f0b 100644 --- a/backend/src/ee/services/scim/scim-types.ts +++ b/backend/src/ee/services/scim/scim-types.ts @@ -54,6 +54,7 @@ export type TReplaceScimUserDTO = { email?: string; firstName?: string; lastName?: string; + externalId: string; }; export type TDeleteScimUserDTO = {