@backstage-community/plugin-rbac-backend
Version:
213 lines (209 loc) • 7.56 kB
JavaScript
;
var lodash = require('lodash');
var auditor = require('./auditor/auditor.cjs.js');
function policyToString(policy) {
return `[${policy.join(", ")}]`;
}
function typedPolicyToString(policy, type) {
return `${type}, ${policy.join(", ")}`;
}
function policiesToString(policies) {
const policiesString = policies.map((policy) => policyToString(policy)).join(",");
return `[${policiesString}]`;
}
function typedPoliciesToString(policies, type) {
const policiesString = policies.map((policy) => {
return policy.length !== 0 ? typedPolicyToString(policy, type) : "";
}).join("\n");
return `
${policiesString}
`;
}
function metadataStringToPolicy(policy) {
return policy.replace("[", "").replace("]", "").split(", ");
}
async function removeTheDifference(originalGroup, addedGroup, source, roleEntityRef, enf, auditor$1, modifiedBy) {
originalGroup.sort((a, b) => a.localeCompare(b));
addedGroup.sort((a, b) => a.localeCompare(b));
const missing = lodash.difference(originalGroup, addedGroup);
const groupPolicies = [];
for (const missingRole of missing) {
groupPolicies.push([missingRole, roleEntityRef]);
}
if (groupPolicies.length === 0) {
return;
}
const roleMetadata = { source, modifiedBy, roleEntityRef };
const existingMembers = await enf.getFilteredGroupingPolicy(1, roleEntityRef);
const actionType = existingMembers.length === missing.length ? auditor.ActionType.DELETE : auditor.ActionType.UPDATE;
const auditorMeta = {
...roleMetadata,
members: groupPolicies.map((gp) => gp[0])
};
const auditorEvent = await auditor$1.createEvent({
eventId: auditor.RoleEvents.ROLE_WRITE,
severityLevel: "medium",
meta: { actionType, source: auditorMeta.source }
});
try {
await enf.removeGroupingPolicies(groupPolicies, roleMetadata, false);
await auditorEvent.success({ meta: auditorMeta });
} catch (error) {
await auditorEvent.fail({
error,
meta: auditorMeta
});
throw error;
}
}
function transformArrayToPolicy(policyArray) {
const [entityReference, permission, policy, effect] = policyArray;
return { entityReference, permission, policy, effect };
}
function transformPolicyGroupToLowercase(policyArray) {
if (policyArray.length > 1 && policyArray[0].startsWith("g") && (policyArray[1].startsWith("user") || policyArray[1].startsWith("group"))) {
policyArray[1] = policyArray[1].toLocaleLowerCase("en-US");
}
}
function transformRolesGroupToLowercase(roles) {
return roles.map(
(role) => role.length >= 1 ? [role[0].toLocaleLowerCase("en-US"), ...role.slice(1)] : role
);
}
function deepSortedEqual(obj1, obj2, excludeFields) {
let copyObj1;
let copyObj2;
if (excludeFields) {
const excludeFieldsPredicate = (_value, key) => {
for (const field of excludeFields) {
if (key === field) {
return true;
}
}
return false;
};
copyObj1 = lodash.omitBy(obj1, excludeFieldsPredicate);
copyObj2 = lodash.omitBy(obj2, excludeFieldsPredicate);
}
const sortedObj1 = lodash.sortBy(lodash.toPairs(copyObj1 || obj1), ([key]) => key);
const sortedObj2 = lodash.sortBy(lodash.toPairs(copyObj2 || obj2), ([key]) => key);
return lodash.isEqual(sortedObj1, sortedObj2);
}
function isPermissionAction(action) {
return ["create", "read", "update", "delete", "use"].includes(
action
);
}
async function buildRoleSourceMap(policies, roleMetadata) {
return await policies.reduce(
async (acc, policy) => {
const roleEntityRef = policy[0];
const acummulator = await acc;
if (!acummulator.has(roleEntityRef)) {
const metadata = await roleMetadata.findRoleMetadata(roleEntityRef);
acummulator.set(roleEntityRef, metadata?.source);
}
return acummulator;
},
Promise.resolve(/* @__PURE__ */ new Map())
);
}
function mergeRoleMetadata(currentMetadata, newMetadata) {
const mergedMetaData = { ...currentMetadata };
mergedMetaData.lastModified = newMetadata.lastModified ?? (/* @__PURE__ */ new Date()).toUTCString();
mergedMetaData.modifiedBy = newMetadata.modifiedBy;
mergedMetaData.description = newMetadata.description ?? currentMetadata.description;
mergedMetaData.roleEntityRef = newMetadata.roleEntityRef;
mergedMetaData.source = newMetadata.source;
mergedMetaData.owner = newMetadata.owner ?? currentMetadata.owner;
return mergedMetaData;
}
async function processConditionMapping(roleConditionPolicy, pluginPermMetaData, auth) {
const { token } = await auth.getPluginRequestToken({
onBehalfOf: await auth.getOwnServiceCredentials(),
targetPluginId: roleConditionPolicy.pluginId
});
const rule = await pluginPermMetaData.getMetadataByPluginId(
roleConditionPolicy.pluginId,
token
);
if (!rule?.permissions) {
throw new Error(
`Unable to get permission list for plugin ${roleConditionPolicy.pluginId}`
);
}
const permInfo = [];
for (const action of roleConditionPolicy.permissionMapping) {
const perm = rule.permissions.find((permission) => {
if (permission.type === "resource") {
const isCorrectResourceType = permission.resourceType === roleConditionPolicy.resourceType;
const isCorrectAction = action === permission.attributes.action;
const undefinedAction = action === "use" && permission.attributes.action === undefined;
return isCorrectResourceType && (isCorrectAction || undefinedAction);
}
return false;
});
if (!perm) {
throw new Error(
`Unable to find permission to get permission name for resource type '${roleConditionPolicy.resourceType}' and action ${JSON.stringify(action)}`
);
}
permInfo.push({ name: perm.name, action });
}
return {
...roleConditionPolicy,
permissionMapping: permInfo
};
}
function deepSort(value) {
if (lodash.isArray(value)) {
return lodash.sortBy(value.map(deepSort));
} else if (lodash.isPlainObject(value)) {
return lodash.fromPairs(
lodash.sortBy(
lodash.toPairs(value).map(([k, v]) => [k, deepSort(v)]),
0
)
);
}
return value;
}
function deepSortEqual(obj1, obj2) {
return lodash.isEqual(deepSort(obj1), deepSort(obj2));
}
const matches = (role, filters) => {
if (!filters) {
return true;
}
if (!role) {
return false;
}
if ("allOf" in filters) {
return filters.allOf.every((filter) => matches(role, filter));
}
if ("anyOf" in filters) {
return filters.anyOf.some((filter) => matches(role, filter));
}
if ("not" in filters) {
return !matches(role, filters.not);
}
return filters.values.includes(role.owner);
};
exports.buildRoleSourceMap = buildRoleSourceMap;
exports.deepSort = deepSort;
exports.deepSortEqual = deepSortEqual;
exports.deepSortedEqual = deepSortedEqual;
exports.isPermissionAction = isPermissionAction;
exports.matches = matches;
exports.mergeRoleMetadata = mergeRoleMetadata;
exports.metadataStringToPolicy = metadataStringToPolicy;
exports.policiesToString = policiesToString;
exports.policyToString = policyToString;
exports.processConditionMapping = processConditionMapping;
exports.removeTheDifference = removeTheDifference;
exports.transformArrayToPolicy = transformArrayToPolicy;
exports.transformPolicyGroupToLowercase = transformPolicyGroupToLowercase;
exports.transformRolesGroupToLowercase = transformRolesGroupToLowercase;
exports.typedPoliciesToString = typedPoliciesToString;
exports.typedPolicyToString = typedPolicyToString;
//# sourceMappingURL=helper.cjs.js.map