mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
feat: resolved some more missing corner case in scim
This commit is contained in:
@@ -180,14 +180,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
|
|||||||
orgMembershipId: z.string().trim()
|
orgMembershipId: z.string().trim()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
200: ScimUserSchema.extend({
|
200: ScimUserSchema
|
||||||
groups: z.array(
|
|
||||||
z.object({
|
|
||||||
value: z.string().trim(),
|
|
||||||
display: z.string().trim()
|
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
||||||
@@ -284,6 +277,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
|
|||||||
})
|
})
|
||||||
.optional(),
|
.optional(),
|
||||||
displayName: z.string().trim(),
|
displayName: z.string().trim(),
|
||||||
|
emails: z
|
||||||
|
.array(
|
||||||
|
z.object({
|
||||||
|
primary: z.boolean(),
|
||||||
|
value: z.string().email(),
|
||||||
|
type: z.string().trim()
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.optional(),
|
||||||
active: z.boolean()
|
active: z.boolean()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
@@ -315,10 +317,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
|
|||||||
},
|
},
|
||||||
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
|
const primaryEmail = req.body.emails?.find((email) => email.primary)?.value;
|
||||||
const user = await req.server.services.scim.replaceScimUser({
|
const user = await req.server.services.scim.replaceScimUser({
|
||||||
orgMembershipId: req.params.orgMembershipId,
|
orgMembershipId: req.params.orgMembershipId,
|
||||||
orgId: req.permission.orgId,
|
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;
|
return user;
|
||||||
}
|
}
|
||||||
@@ -450,6 +457,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
|
|||||||
groupId: req.params.groupId,
|
groupId: req.params.groupId,
|
||||||
orgId: req.permission.orgId
|
orgId: req.permission.orgId
|
||||||
});
|
});
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -523,13 +531,11 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
|
|||||||
},
|
},
|
||||||
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
|
||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
console.log(JSON.stringify(req.body, null, 4));
|
|
||||||
const group = await req.server.services.scim.updateScimGroup({
|
const group = await req.server.services.scim.updateScimGroup({
|
||||||
groupId: req.params.groupId,
|
groupId: req.params.groupId,
|
||||||
orgId: req.permission.orgId,
|
orgId: req.permission.orgId,
|
||||||
operations: req.body.Operations
|
operations: req.body.Operations
|
||||||
});
|
});
|
||||||
console.log(group);
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ type TScimServiceFactoryDep = {
|
|||||||
TUserDALFactory,
|
TUserDALFactory,
|
||||||
"find" | "findOne" | "create" | "transaction" | "findUserEncKeyByUserIdsBatch" | "findById" | "updateById"
|
"find" | "findOne" | "create" | "transaction" | "findUserEncKeyByUserIdsBatch" | "findById" | "updateById"
|
||||||
>;
|
>;
|
||||||
userAliasDAL: Pick<TUserAliasDALFactory, "findOne" | "create" | "delete">;
|
userAliasDAL: Pick<TUserAliasDALFactory, "findOne" | "create" | "delete" | "update">;
|
||||||
orgDAL: Pick<
|
orgDAL: Pick<
|
||||||
TOrgDALFactory,
|
TOrgDALFactory,
|
||||||
| "createMembership"
|
| "createMembership"
|
||||||
@@ -259,11 +259,6 @@ export const scimServiceFactory = ({
|
|||||||
status: 403
|
status: 403
|
||||||
});
|
});
|
||||||
|
|
||||||
const groupMembershipsInOrg = await userGroupMembershipDAL.findGroupMembershipsByUserIdInOrg(
|
|
||||||
membership.userId,
|
|
||||||
orgId
|
|
||||||
);
|
|
||||||
|
|
||||||
return buildScimUser({
|
return buildScimUser({
|
||||||
orgMembershipId: membership.id,
|
orgMembershipId: membership.id,
|
||||||
username: membership.externalId ?? membership.username,
|
username: membership.externalId ?? membership.username,
|
||||||
@@ -271,10 +266,6 @@ export const scimServiceFactory = ({
|
|||||||
firstName: membership.firstName,
|
firstName: membership.firstName,
|
||||||
lastName: membership.lastName,
|
lastName: membership.lastName,
|
||||||
active: membership.isActive,
|
active: membership.isActive,
|
||||||
groups: groupMembershipsInOrg.map((group) => ({
|
|
||||||
value: group.groupId,
|
|
||||||
display: group.groupName
|
|
||||||
})),
|
|
||||||
createdAt: membership.createdAt,
|
createdAt: membership.createdAt,
|
||||||
updatedAt: membership.updatedAt
|
updatedAt: membership.updatedAt
|
||||||
});
|
});
|
||||||
@@ -475,7 +466,7 @@ export const scimServiceFactory = ({
|
|||||||
lastName: membership.lastName,
|
lastName: membership.lastName,
|
||||||
firstName: membership.firstName,
|
firstName: membership.firstName,
|
||||||
active: membership.isActive,
|
active: membership.isActive,
|
||||||
username: membership.username,
|
username: membership.externalId ?? membership.username,
|
||||||
createdAt: membership.createdAt,
|
createdAt: membership.createdAt,
|
||||||
updatedAt: membership.updatedAt
|
updatedAt: membership.updatedAt
|
||||||
});
|
});
|
||||||
@@ -512,7 +503,8 @@ export const scimServiceFactory = ({
|
|||||||
orgId,
|
orgId,
|
||||||
lastName,
|
lastName,
|
||||||
firstName,
|
firstName,
|
||||||
email
|
email,
|
||||||
|
externalId
|
||||||
}: TReplaceScimUserDTO) => {
|
}: TReplaceScimUserDTO) => {
|
||||||
const [membership] = await orgDAL
|
const [membership] = await orgDAL
|
||||||
.findMembership({
|
.findMembership({
|
||||||
@@ -540,6 +532,17 @@ export const scimServiceFactory = ({
|
|||||||
|
|
||||||
const serverCfg = await getServerCfg();
|
const serverCfg = await getServerCfg();
|
||||||
await userDAL.transaction(async (tx) => {
|
await userDAL.transaction(async (tx) => {
|
||||||
|
await userAliasDAL.update(
|
||||||
|
{
|
||||||
|
orgId,
|
||||||
|
aliasType: UserAliasType.SAML,
|
||||||
|
userId: membership.userId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
externalId
|
||||||
|
},
|
||||||
|
tx
|
||||||
|
);
|
||||||
await orgMembershipDAL.updateById(
|
await orgMembershipDAL.updateById(
|
||||||
membership.id,
|
membership.id,
|
||||||
{
|
{
|
||||||
@@ -561,7 +564,7 @@ export const scimServiceFactory = ({
|
|||||||
|
|
||||||
return buildScimUser({
|
return buildScimUser({
|
||||||
orgMembershipId: membership.id,
|
orgMembershipId: membership.id,
|
||||||
username: membership.externalId ?? membership.username,
|
username: externalId,
|
||||||
email: membership.email,
|
email: membership.email,
|
||||||
firstName: membership.firstName,
|
firstName: membership.firstName,
|
||||||
lastName: membership.lastName,
|
lastName: membership.lastName,
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export type TReplaceScimUserDTO = {
|
|||||||
email?: string;
|
email?: string;
|
||||||
firstName?: string;
|
firstName?: string;
|
||||||
lastName?: string;
|
lastName?: string;
|
||||||
|
externalId: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TDeleteScimUserDTO = {
|
export type TDeleteScimUserDTO = {
|
||||||
|
|||||||
Reference in New Issue
Block a user