fix: use proxy on metadata permissions check to handle missing keys

This commit is contained in:
Scott Wilson
2024-11-14 11:36:07 -08:00
parent ccad684ab2
commit c79f84c064
2 changed files with 31 additions and 12 deletions
@@ -29,4 +29,18 @@ function validateOrgSSO(actorAuthMethod: ActorAuthMethod, isOrgSsoEnforced: TOrg
} }
} }
export { isAuthMethodSaml, validateOrgSSO }; const escapeHandlebarsMissingMetadata = (obj: Record<string, string>) => {
const handler = {
get(target: Record<string, string>, prop: string) {
if (!(prop in target)) {
// eslint-disable-next-line no-param-reassign
target[prop] = `{{identity.metadata.${prop}}}`; // Add missing key as an "own" property
}
return target[prop];
}
};
return new Proxy(obj, handler);
};
export { escapeHandlebarsMissingMetadata, isAuthMethodSaml, validateOrgSSO };
@@ -21,7 +21,7 @@ import { TServiceTokenDALFactory } from "@app/services/service-token/service-tok
import { orgAdminPermissions, orgMemberPermissions, orgNoAccessPermissions, OrgPermissionSet } from "./org-permission"; import { orgAdminPermissions, orgMemberPermissions, orgNoAccessPermissions, OrgPermissionSet } from "./org-permission";
import { TPermissionDALFactory } from "./permission-dal"; import { TPermissionDALFactory } from "./permission-dal";
import { validateOrgSSO } from "./permission-fns"; import { escapeHandlebarsMissingMetadata, validateOrgSSO } from "./permission-fns";
import { TBuildOrgPermissionDTO, TBuildProjectPermissionDTO } from "./permission-service-types"; import { TBuildOrgPermissionDTO, TBuildProjectPermissionDTO } from "./permission-service-types";
import { import {
buildServiceTokenProjectPermission, buildServiceTokenProjectPermission,
@@ -227,11 +227,13 @@ export const permissionServiceFactory = ({
})) || []; })) || [];
const rules = buildProjectPermissionRules(rolePermissions.concat(additionalPrivileges)); const rules = buildProjectPermissionRules(rolePermissions.concat(additionalPrivileges));
const templatedRules = handlebars.compile(JSON.stringify(rules), { data: false, strict: true }); const templatedRules = handlebars.compile(JSON.stringify(rules), { data: false });
const metadataKeyValuePair = objectify( const metadataKeyValuePair = escapeHandlebarsMissingMetadata(
userProjectPermission.metadata, objectify(
(i) => i.key, userProjectPermission.metadata,
(i) => i.value (i) => i.key,
(i) => i.value
)
); );
const interpolateRules = templatedRules( const interpolateRules = templatedRules(
{ {
@@ -292,12 +294,15 @@ export const permissionServiceFactory = ({
})) || []; })) || [];
const rules = buildProjectPermissionRules(rolePermissions.concat(additionalPrivileges)); const rules = buildProjectPermissionRules(rolePermissions.concat(additionalPrivileges));
const templatedRules = handlebars.compile(JSON.stringify(rules), { data: false, strict: true }); const templatedRules = handlebars.compile(JSON.stringify(rules), { data: false });
const metadataKeyValuePair = objectify( const metadataKeyValuePair = escapeHandlebarsMissingMetadata(
identityProjectPermission.metadata, objectify(
(i) => i.key, identityProjectPermission.metadata,
(i) => i.value (i) => i.key,
(i) => i.value
)
); );
const interpolateRules = templatedRules( const interpolateRules = templatedRules(
{ {
identity: { identity: {