UNPKG

@backstage-community/plugin-rbac-backend

Version:
158 lines (154 loc) 5.13 kB
'use strict'; var auditor = require('../auditor/auditor.cjs.js'); var helper = require('../helper.cjs.js'); var policiesValidation = require('../validation/policies-validation.cjs.js'); const ADMIN_ROLE_NAME = "role:default/rbac_admin"; const ADMIN_ROLE_AUTHOR = "application configuration"; const DEF_ADMIN_ROLE_DESCRIPTION = "The default permission policy for the admin role allows for the creation, deletion, updating, and reading of roles and permission policies."; const getAdminRoleMetadata = () => { const currentDate = /* @__PURE__ */ new Date(); return { source: "configuration", roleEntityRef: ADMIN_ROLE_NAME, description: DEF_ADMIN_ROLE_DESCRIPTION, author: ADMIN_ROLE_AUTHOR, modifiedBy: ADMIN_ROLE_AUTHOR, lastModified: currentDate.toUTCString(), createdAt: currentDate.toUTCString() }; }; const useAdminsFromConfig = async (admins, enf, auditor$1, roleMetadataStorage, knex) => { const addedGroupPolicies = /* @__PURE__ */ new Map(); const newGroupPolicies = /* @__PURE__ */ new Map(); for (const admin of admins) { const entityRef = admin.getString("name").toLocaleLowerCase("en-US"); policiesValidation.validateEntityReference(entityRef); addedGroupPolicies.set(entityRef, ADMIN_ROLE_NAME); if (!await enf.hasGroupingPolicy(...[entityRef, ADMIN_ROLE_NAME])) { newGroupPolicies.set(entityRef, ADMIN_ROLE_NAME); } } const adminRoleMeta = await roleMetadataStorage.findRoleMetadata(ADMIN_ROLE_NAME); const addedRoleMembers = Array.from(newGroupPolicies.entries()); const meta = { ...getAdminRoleMetadata(), members: addedRoleMembers.map((gp) => gp[0]) }; const auditorEvent = await auditor$1.createEvent({ eventId: auditor.RoleEvents.ROLE_WRITE, severityLevel: "medium", meta: { actionType: adminRoleMeta ? auditor.ActionType.UPDATE : auditor.ActionType.CREATE, source: meta.source } }); const trx = await knex.transaction(); try { if (!adminRoleMeta) { await roleMetadataStorage.createRoleMetadata(getAdminRoleMetadata(), trx); } else if (adminRoleMeta.source === "legacy") { await roleMetadataStorage.updateRoleMetadata( getAdminRoleMetadata(), ADMIN_ROLE_NAME, trx ); } await enf.addGroupingPolicies( addedRoleMembers, getAdminRoleMetadata(), void 0, trx ); await trx.commit(); await auditorEvent.success({ meta }); } catch (error) { await trx.rollback(error); await auditorEvent.fail({ error, meta }); throw error; } const configGroupPolicies = await enf.getFilteredGroupingPolicy( 1, ADMIN_ROLE_NAME ); await helper.removeTheDifference( configGroupPolicies.map((gp) => gp[0]), Array.from(addedGroupPolicies.keys()), "configuration", ADMIN_ROLE_NAME, enf, auditor$1, ADMIN_ROLE_AUTHOR ); }; const addAdminPermissions = async (policies, enf, auditor$1) => { const policiesToAdd = []; for (const policy of policies) { if (!await enf.hasPolicy(...policy)) { policiesToAdd.push(policy); } } const auditorEvent = await auditor$1.createEvent({ eventId: auditor.PermissionEvents.POLICY_WRITE, severityLevel: "medium", meta: { actionType: auditor.ActionType.CREATE, source: "configuration" } }); try { await enf.addPolicies(policiesToAdd); await auditorEvent.success({ meta: { policies: policiesToAdd } }); } catch (error) { await auditorEvent.fail({ error, meta: { policies: policiesToAdd } }); } }; const removeOldCreateAdminPermissions = async (enf, auditor$1) => { const policyEntityCreate = [ "role:default/rbac_admin", "policy-entity", "create", "allow" ]; if (await enf.hasPolicy(...policyEntityCreate)) { const auditorEvent = await auditor$1.createEvent({ eventId: auditor.PermissionEvents.POLICY_WRITE, severityLevel: "medium", meta: { actionType: auditor.ActionType.DELETE, source: "configuration" } }); try { await enf.removePolicy(policyEntityCreate); await auditorEvent.success({ meta: { policy: policyEntityCreate } }); } catch (error) { await auditorEvent.fail({ error, meta: { policy: policyEntityCreate } }); } } }; const setAdminPermissions = async (enf, auditor) => { await removeOldCreateAdminPermissions(enf, auditor); const adminPermissions = [ [ADMIN_ROLE_NAME, "policy-entity", "read", "allow"], [ADMIN_ROLE_NAME, "policy.entity.create", "create", "allow"], [ADMIN_ROLE_NAME, "policy-entity", "delete", "allow"], [ADMIN_ROLE_NAME, "policy-entity", "update", "allow"], // Needed for the RBAC frontend plugin. [ADMIN_ROLE_NAME, "catalog-entity", "read", "allow"] ]; await addAdminPermissions(adminPermissions, enf, auditor); }; exports.ADMIN_ROLE_AUTHOR = ADMIN_ROLE_AUTHOR; exports.ADMIN_ROLE_NAME = ADMIN_ROLE_NAME; exports.setAdminPermissions = setAdminPermissions; exports.useAdminsFromConfig = useAdminsFromConfig; //# sourceMappingURL=admin-creation.cjs.js.map