From 64848c963cdc7198a6fc877c1c39686a72dc3e29 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 19 Oct 2022 16:24:41 -0400 Subject: [PATCH] fix(PermissionClient): fix rules schema to handle optional params Signed-off-by: Phil Kuang --- .changeset/real-swans-repair.md | 5 +++ .../src/PermissionClient.test.ts | 34 +++++++++++++++++++ .../permission-common/src/PermissionClient.ts | 2 +- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .changeset/real-swans-repair.md diff --git a/.changeset/real-swans-repair.md b/.changeset/real-swans-repair.md new file mode 100644 index 0000000000..67eafc9999 --- /dev/null +++ b/.changeset/real-swans-repair.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-common': patch +--- + +Properly handle rules that have no parameters in `PermissionClient` diff --git a/plugins/permission-common/src/PermissionClient.test.ts b/plugins/permission-common/src/PermissionClient.test.ts index bcc6ddd6f6..75eb2b1ff3 100644 --- a/plugins/permission-common/src/PermissionClient.test.ts +++ b/plugins/permission-common/src/PermissionClient.test.ts @@ -310,6 +310,40 @@ describe('PermissionClient', () => { ).rejects.toThrow(/request failed with 401/i); }); + it('should handle reponses with rules with no params', async () => { + mockPolicyDecisionHandler.mockImplementationOnce( + (req, res, { json }: RestContext) => { + const responses = req.body.items.map( + (a: IdentifiedPermissionMessage) => ({ + id: a.id, + pluginId: 'test-plugin', + resourceType: 'test-resource', + result: AuthorizeResult.CONDITIONAL, + conditions: { + resourceType: 'test-resource', + rule: 'FOO', + }, + }), + ); + + return res(json({ items: responses })); + }, + ); + + const response = await client.authorizeConditional([ + mockResourceAuthorizeConditional, + ]); + expect(response[0]).toEqual( + expect.objectContaining({ + result: AuthorizeResult.CONDITIONAL, + conditions: { + rule: 'FOO', + resourceType: 'test-resource', + }, + }), + ); + }); + it('should reject responses with missing ids', async () => { mockPolicyDecisionHandler.mockImplementationOnce( (_req, res, { json }: RestContext) => { diff --git a/plugins/permission-common/src/PermissionClient.ts b/plugins/permission-common/src/PermissionClient.ts index c5f56be159..a5d08205d8 100644 --- a/plugins/permission-common/src/PermissionClient.ts +++ b/plugins/permission-common/src/PermissionClient.ts @@ -41,7 +41,7 @@ const permissionCriteriaSchema: z.ZodSchema< .object({ rule: z.string(), resourceType: z.string(), - params: z.record(z.any()), + params: z.record(z.any()).optional(), }) .or(z.object({ anyOf: z.array(permissionCriteriaSchema).nonempty() })) .or(z.object({ allOf: z.array(permissionCriteriaSchema).nonempty() }))