From 3d58eba78c7012468823a94d000e1bf3205fbf15 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 10 Oct 2024 18:38:29 +0530 Subject: [PATCH 1/3] fix: resolved response schema mismatch for scim --- backend/src/lib/knex/scim.ts | 48 +++++++++---------- .../plugins/add-errors-to-response-schemas.ts | 5 +- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/backend/src/lib/knex/scim.ts b/backend/src/lib/knex/scim.ts index 530a7d45a..255d8778b 100644 --- a/backend/src/lib/knex/scim.ts +++ b/backend/src/lib/knex/scim.ts @@ -8,12 +8,11 @@ const appendParentToGroupingOperator = (parentPath: string, filter: Filter) => { return filter; }; -export const generateKnexQueryFromScim = ( +const processDynamicQuery = ( rootQuery: Knex.QueryBuilder, - rootScimFilter: string, + scimRootFilterAst: Filter, getAttributeField: (attr: string) => string | null ) => { - const scimRootFilterAst = parse(rootScimFilter); const stack = [ { scimFilterAst: scimRootFilterAst, @@ -75,42 +74,34 @@ export const generateKnexQueryFromScim = ( break; } case "and": { - void query.andWhere((subQueryBuilder) => { - scimFilterAst.filters.forEach((el) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: el - }); + scimFilterAst.filters.forEach((el) => { + void query.andWhere((subQueryBuilder) => { + processDynamicQuery(subQueryBuilder, el, getAttributeField); }); }); break; } case "or": { - void query.orWhere((subQueryBuilder) => { - scimFilterAst.filters.forEach((el) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: el - }); + scimFilterAst.filters.forEach((el) => { + void query.orWhere((subQueryBuilder) => { + processDynamicQuery(subQueryBuilder, el, getAttributeField); }); }); break; } case "not": { void query.whereNot((subQueryBuilder) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: scimFilterAst.filter - }); + processDynamicQuery(subQueryBuilder, scimFilterAst.filter, getAttributeField); }); break; } case "[]": { - void query.whereNot((subQueryBuilder) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter) - }); + void query.where((subQueryBuilder) => { + processDynamicQuery( + subQueryBuilder, + appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter), + getAttributeField + ); }); break; } @@ -119,3 +110,12 @@ export const generateKnexQueryFromScim = ( } } }; + +export const generateKnexQueryFromScim = ( + rootQuery: Knex.QueryBuilder, + rootScimFilter: string, + getAttributeField: (attr: string) => string | null +) => { + const scimRootFilterAst = parse(rootScimFilter); + return processDynamicQuery(rootQuery, scimRootFilterAst, getAttributeField); +}; diff --git a/backend/src/server/plugins/add-errors-to-response-schemas.ts b/backend/src/server/plugins/add-errors-to-response-schemas.ts index 75844040c..8eb358a1b 100644 --- a/backend/src/server/plugins/add-errors-to-response-schemas.ts +++ b/backend/src/server/plugins/add-errors-to-response-schemas.ts @@ -3,9 +3,12 @@ import fp from "fastify-plugin"; import { DefaultResponseErrorsSchema } from "../routes/sanitizedSchemas"; +const isScimRoutes = (pathname: string) => + pathname.startsWith("/api/v1/scim/Users") || pathname.startsWith("/api/v1/scim/Groups"); + export const addErrorsToResponseSchemas = fp(async (server) => { server.addHook("onRoute", (routeOptions) => { - if (routeOptions.schema && routeOptions.schema.response) { + if (routeOptions.schema && routeOptions.schema.response && !isScimRoutes(routeOptions.path)) { routeOptions.schema.response = { ...DefaultResponseErrorsSchema, ...routeOptions.schema.response From e042f9b5e29ba9acf22249ee8749a9e255ac7d70 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 11 Oct 2024 01:42:38 +0530 Subject: [PATCH 2/3] feat: made missing errors as internal server error and added depth in scim knex --- backend/src/lib/knex/scim.ts | 14 +++++++++----- backend/src/server/plugins/error-handler.ts | 6 +++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/backend/src/lib/knex/scim.ts b/backend/src/lib/knex/scim.ts index 255d8778b..0caf8c491 100644 --- a/backend/src/lib/knex/scim.ts +++ b/backend/src/lib/knex/scim.ts @@ -11,8 +11,11 @@ const appendParentToGroupingOperator = (parentPath: string, filter: Filter) => { const processDynamicQuery = ( rootQuery: Knex.QueryBuilder, scimRootFilterAst: Filter, - getAttributeField: (attr: string) => string | null + getAttributeField: (attr: string) => string | null, + depth = 0 ) => { + if (depth > 10) return; + const stack = [ { scimFilterAst: scimRootFilterAst, @@ -76,7 +79,7 @@ const processDynamicQuery = ( case "and": { scimFilterAst.filters.forEach((el) => { void query.andWhere((subQueryBuilder) => { - processDynamicQuery(subQueryBuilder, el, getAttributeField); + processDynamicQuery(subQueryBuilder, el, getAttributeField, depth + 1); }); }); break; @@ -84,14 +87,14 @@ const processDynamicQuery = ( case "or": { scimFilterAst.filters.forEach((el) => { void query.orWhere((subQueryBuilder) => { - processDynamicQuery(subQueryBuilder, el, getAttributeField); + processDynamicQuery(subQueryBuilder, el, getAttributeField, depth + 1); }); }); break; } case "not": { void query.whereNot((subQueryBuilder) => { - processDynamicQuery(subQueryBuilder, scimFilterAst.filter, getAttributeField); + processDynamicQuery(subQueryBuilder, scimFilterAst.filter, getAttributeField, depth + 1); }); break; } @@ -100,7 +103,8 @@ const processDynamicQuery = ( processDynamicQuery( subQueryBuilder, appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter), - getAttributeField + getAttributeField, + depth + 1 ); }); break; diff --git a/backend/src/server/plugins/error-handler.ts b/backend/src/server/plugins/error-handler.ts index 03681b1c8..76bfa9023 100644 --- a/backend/src/server/plugins/error-handler.ts +++ b/backend/src/server/plugins/error-handler.ts @@ -97,7 +97,11 @@ export const fastifyErrHandler = fastifyPlugin(async (server: FastifyZodProvider message }); } else { - void res.send(error); + void res.status(HttpStatusCodes.InternalServerError).send({ + statusCode: HttpStatusCodes.InternalServerError, + error: "InternalServerError", + message: "Something went wrong" + }); } }); }); From 3163adf486af7abc9c515b5b4e81b3bf71c74af9 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 10 Oct 2024 13:50:03 -0700 Subject: [PATCH 3/3] increase depth count --- backend/src/lib/knex/scim.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/lib/knex/scim.ts b/backend/src/lib/knex/scim.ts index 0caf8c491..64f7fc2f6 100644 --- a/backend/src/lib/knex/scim.ts +++ b/backend/src/lib/knex/scim.ts @@ -14,7 +14,7 @@ const processDynamicQuery = ( getAttributeField: (attr: string) => string | null, depth = 0 ) => { - if (depth > 10) return; + if (depth > 20) return; const stack = [ {