From 4f23e6e4fc0edcdf151a701446d235e66383d9e5 Mon Sep 17 00:00:00 2001 From: PedroHenrique0713 Date: Thu, 23 Jul 2026 18:03:08 -0300 Subject: [PATCH] fix: null body crash, null config guard, and roles querystring schema mismatch fix(query): guard against null request body in errorOnEmptyQuery. request.body.query on null body caused TypeError instead of the intended 'query not found' error. fix(query): guard request.body.ast with optional chaining in /deparse. No validation or guard before accessing request.body.ast. fix(PostgresMetaRoles): guard config against null (not just undefined). config !== undefined allowed null through, causing config.map() TypeError. fix(roles): align querystring schema field name with handler. Schema declared include_system_schemas but handler read include_default_roles. --- src/lib/PostgresMetaRoles.ts | 2 +- src/server/routes/query.ts | 4 ++-- src/server/routes/roles.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/PostgresMetaRoles.ts b/src/lib/PostgresMetaRoles.ts index f25a851d4..f0ff2b261 100644 --- a/src/lib/PostgresMetaRoles.ts +++ b/src/lib/PostgresMetaRoles.ts @@ -223,7 +223,7 @@ COMMIT;` const passwordClause = password === undefined ? '' : `PASSWORD ${literal(password)}` const validUntilClause = valid_until === undefined ? '' : `VALID UNTIL ${literal(valid_until)}` let configClause = '' - if (config !== undefined) { + if (config != null) { const configSql = config.map((c) => { const { op, path, value } = c const k = path diff --git a/src/server/routes/query.ts b/src/server/routes/query.ts index b7e411338..af8afbc92 100644 --- a/src/server/routes/query.ts +++ b/src/server/routes/query.ts @@ -8,7 +8,7 @@ import { } from '../utils.js' const errorOnEmptyQuery = (request: FastifyRequest) => { - if (!(request.body as any).query) { + if (!request.body || !(request.body as any).query) { throw new Error('query not found') } } @@ -74,7 +74,7 @@ export default async (fastify: FastifyInstance) => { Headers: { pg: string; 'x-pg-application-name'?: string } Body: { ast: object } }>('/deparse', async (request, reply) => { - const { data, error } = await Parser.Deparse(request.body.ast) + const { data, error } = await Parser.Deparse(request.body?.ast ?? {}) if (error) { request.log.error({ error, request: extractRequestForLogging(request) }) diff --git a/src/server/routes/roles.ts b/src/server/routes/roles.ts index a8809be22..ae454e9ce 100644 --- a/src/server/routes/roles.ts +++ b/src/server/routes/roles.ts @@ -27,7 +27,7 @@ export default async (fastify: FastifyInstance) => { 'x-pg-application-name': Type.Optional(Type.String()), }), querystring: Type.Object({ - include_system_schemas: Type.Optional(Type.String()), + include_default_roles: Type.Optional(Type.String()), limit: Type.Optional(Type.String()), offset: Type.Optional(Type.String()), }),