diff --git a/.changeset/fluffy-teeth-decide.md b/.changeset/fluffy-teeth-decide.md new file mode 100644 index 00000000000..735400fa9ad --- /dev/null +++ b/.changeset/fluffy-teeth-decide.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Bug fix: Remove padding when parsing permissions from the JWT v2 format. diff --git a/packages/shared/src/__tests__/jwtPayloadParser.test.ts b/packages/shared/src/__tests__/jwtPayloadParser.test.ts index 8290050df65..d5113aa76b5 100644 --- a/packages/shared/src/__tests__/jwtPayloadParser.test.ts +++ b/packages/shared/src/__tests__/jwtPayloadParser.test.ts @@ -183,6 +183,61 @@ describe('JWTPayloadToAuthObjectProperties', () => { ['org:memberships:read', 'org:memberships:manage'].sort(), ); }); + + test('org permissions are constructed correctly case 2', () => { + const { sessionClaims: v2Claims, ...signedInAuthObject } = JWTPayloadToAuthObjectProperties({ + ...baseClaims, + v: 2, + fea: 'o:billing,o:email,o:fraud,o:instance,o:staging_plans', + o: { + id: 'org_id', + rol: 'admin', + slg: 'org_slug', + per: 'manage,read', + fpm: '3,3,3,3,1', + }, + }); + + expect(signedInAuthObject.orgPermissions?.sort()).toEqual( + [ + 'org:billing:manage', + 'org:billing:read', + 'org:email:manage', + 'org:email:read', + 'org:fraud:manage', + 'org:fraud:read', + 'org:instance:manage', + 'org:instance:read', + 'org:staging_plans:manage', + ].sort(), + ); + }); + + test('org permissions are constructed correctly case 3', () => { + const { sessionClaims: v2Claims, ...signedInAuthObject } = JWTPayloadToAuthObjectProperties({ + ...baseClaims, + v: 2, + fea: 'o:repositories,o:projects', + o: { + id: 'org_id', + rol: 'admin', + slg: 'org_slug', + per: 'read,create,update,delete,revoke', + fpm: '7,21', + }, + }); + + expect(signedInAuthObject.orgPermissions?.sort()).toEqual( + [ + 'org:repositories:read', + 'org:repositories:create', + 'org:repositories:update', + 'org:projects:read', + 'org:projects:update', + 'org:projects:revoke', + ].sort(), + ); + }); }); describe('splitByScope ', () => { diff --git a/packages/shared/src/jwtPayloadParser.ts b/packages/shared/src/jwtPayloadParser.ts index 129512c5fb2..6b373f93a6f 100644 --- a/packages/shared/src/jwtPayloadParser.ts +++ b/packages/shared/src/jwtPayloadParser.ts @@ -21,7 +21,6 @@ export const parsePermissions = ({ per, fpm }: { per?: string; fpm?: string }) = .map((permission: number) => permission .toString(2) - .padStart(permissions.length, '0') .split('') .map(bit => Number.parseInt(bit, 10)), )