@backstage-community/plugin-rbac 1.34.0 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +9 -9
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionRule.esm.js +1 -1
- package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js +1 -1
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +5 -5
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -1
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +5 -5
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -1
- package/dist/components/CreateRole/AddMembersForm.esm.js +1 -1
- package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +5 -5
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +1 -1
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -1
- package/dist/components/CreateRole/RoleForm.esm.js +2 -2
- package/dist/components/CreateRole/RoleForm.esm.js.map +1 -1
- package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -1
- package/dist/components/RoleOverview/PermissionsListColumns.esm.js.map +1 -1
- package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -1
- package/dist/hooks/useConditionRules.esm.js +1 -1
- package/dist/hooks/useConditionRules.esm.js.map +1 -1
- package/dist/hooks/useMembers.esm.js +2 -2
- package/dist/hooks/useMembers.esm.js.map +1 -1
- package/dist/hooks/usePermissionPolicies.esm.js +2 -2
- package/dist/hooks/usePermissionPolicies.esm.js.map +1 -1
- package/dist/hooks/useRole.esm.js +1 -1
- package/dist/hooks/useRole.esm.js.map +1 -1
- package/dist/hooks/useSelectedMembers.esm.js +1 -1
- package/dist/hooks/useSelectedMembers.esm.js.map +1 -1
- package/dist/utils/conditional-access-utils.esm.js +2 -2
- package/dist/utils/conditional-access-utils.esm.js.map +1 -1
- package/dist/utils/create-role-utils.esm.js +3 -3
- package/dist/utils/create-role-utils.esm.js.map +1 -1
- package/dist/utils/rbac-utils.esm.js +1 -1
- package/dist/utils/rbac-utils.esm.js.map +1 -1
- package/package.json +21 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConditionRules.esm.js","sources":["../../src/hooks/useConditionRules.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport {\n ConditionRules,\n ConditionRulesData,\n ResourceTypeRuleData,\n RulesData,\n} from '../components/ConditionalAccess/types';\nimport { ConditionRule, PluginConditionRules } from '../types';\nimport { uniqBy } from '../utils/create-role-utils';\n\nconst getPluginsResourceTypes = (\n conditionRules: PluginConditionRules[],\n): { [plugin: string]: string[] } => {\n return conditionRules.reduce((acc, pluginRules) => {\n return {\n ...acc,\n [`${pluginRules.pluginId}`]: uniqBy(\n pluginRules.rules.map(rule => rule.resourceType),\n val => val,\n ),\n };\n }, {});\n};\n\nconst getRuleData = (pluginRules: PluginConditionRules, resType: string) => {\n return pluginRules.rules.reduce(\n (ruleAcc: RulesData, rule: ConditionRule) => {\n return rule.resourceType === resType\n ? {\n ...ruleAcc,\n [`${rule.name}`]: {\n schema: rule.paramsSchema,\n description: rule.description,\n },\n rules: [...ruleAcc.rules, rule.name],\n }\n : ruleAcc;\n },\n { rules: [] },\n );\n};\n\nconst getConditionRulesData = (conditionRules: PluginConditionRules[]) => {\n const pluginsResourceTypes = getPluginsResourceTypes(conditionRules);\n\n return conditionRules.reduce((acc: ConditionRulesData, pluginRules) => {\n return {\n ...acc,\n [`${pluginRules.pluginId}`]: pluginsResourceTypes[\n pluginRules.pluginId\n ].reduce((resAcc: ResourceTypeRuleData, resType: string) => {\n return {\n ...resAcc,\n [`${resType}`]: getRuleData(pluginRules, resType),\n };\n }, {}),\n };\n }, {});\n};\n\nexport const useConditionRules = (): ConditionRules => {\n const rbacApi = useApi(rbacApiRef);\n\n const {\n value: conditionRules,\n loading: conditionRulesLoading,\n error: conditionRulesErr,\n } = useAsync(async () => {\n return await rbacApi.getPluginsConditionRules();\n });\n\n const isConditionRulesAvailable =\n !conditionRulesLoading && Array.isArray(conditionRules);\n\n const conditionRulesData = isConditionRulesAvailable\n ? getConditionRulesData(conditionRules)\n : undefined;\n\n return {\n data: conditionRulesData,\n error: conditionRulesErr,\n };\n};\n"],"names":[],"mappings":";;;;;AA6BA,MAAM,uBAAA,GAA0B,CAC9B,cACmC,KAAA;AACnC,EAAA,OAAO,cAAe,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,WAAgB,KAAA;AACjD,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,CAAC,CAAA,EAAG,WAAY,CAAA,QAAQ,EAAE,GAAG,MAAA;AAAA,QAC3B,WAAY,CAAA,KAAA,CAAM,GAAI,CAAA,CAAA,IAAA,KAAQ,KAAK,YAAY,CAAA;AAAA,QAC/C,CAAO,GAAA,KAAA;AAAA;AACT,KACF;AAAA,GACF,EAAG,EAAE,CAAA;AACP,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,WAAA,EAAmC,OAAoB,KAAA;AAC1E,EAAA,OAAO,YAAY,KAAM,CAAA,MAAA;AAAA,IACvB,CAAC,SAAoB,IAAwB,KAAA;AAC3C,MAAO,OAAA,IAAA,CAAK,iBAAiB,OACzB,GAAA;AAAA,QACE,GAAG,OAAA;AAAA,QACH,CAAC,CAAA,EAAG,IAAK,CAAA,IAAI,EAAE,GAAG;AAAA,UAChB,QAAQ,IAAK,CAAA,YAAA;AAAA,UACb,aAAa,IAAK,CAAA;AAAA,SACpB;AAAA,QACA,OAAO,CAAC,GAAG,OAAQ,CAAA,KAAA,EAAO,KAAK,IAAI;AAAA,OAErC,GAAA,OAAA;AAAA,KACN;AAAA,IACA,EAAE,KAAO,EAAA,EAAG;AAAA,GACd;AACF,CAAA;AAEA,MAAM,qBAAA,GAAwB,CAAC,cAA2C,KAAA;AACxE,EAAM,MAAA,oBAAA,GAAuB,wBAAwB,cAAc,CAAA;AAEnE,EAAA,OAAO,cAAe,CAAA,MAAA,CAAO,CAAC,GAAA,EAAyB,WAAgB,KAAA;AACrE,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,CAAC,CAAA,EAAG,WAAY,CAAA,QAAQ,CAAE,CAAA,GAAG,oBAC3B,CAAA,WAAA,CAAY,QACd,CAAA,CAAE,MAAO,CAAA,CAAC,QAA8B,OAAoB,KAAA;AAC1D,QAAO,OAAA;AAAA,UACL,GAAG,MAAA;AAAA,UACH,CAAC,CAAG,EAAA,OAAO,EAAE,GAAG,WAAA,CAAY,aAAa,OAAO;AAAA,SAClD;AAAA,OACF,EAAG,EAAE;AAAA,KACP;AAAA,GACF,EAAG,EAAE,CAAA;AACP,CAAA;AAEO,MAAM,oBAAoB,MAAsB;AACrD,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,cAAA;AAAA,IACP,OAAS,EAAA,qBAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAO,OAAA,MAAM,QAAQ,wBAAyB,EAAA;AAAA,GAC/C,CAAA;AAED,EAAA,MAAM,yBACJ,GAAA,CAAC,qBAAyB,IAAA,KAAA,CAAM,QAAQ,cAAc,CAAA;AAExD,EAAA,MAAM,kBAAqB,GAAA,yBAAA,GACvB,qBAAsB,CAAA,cAAc,CACpC,GAAA,
|
|
1
|
+
{"version":3,"file":"useConditionRules.esm.js","sources":["../../src/hooks/useConditionRules.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport {\n ConditionRules,\n ConditionRulesData,\n ResourceTypeRuleData,\n RulesData,\n} from '../components/ConditionalAccess/types';\nimport { ConditionRule, PluginConditionRules } from '../types';\nimport { uniqBy } from '../utils/create-role-utils';\n\nconst getPluginsResourceTypes = (\n conditionRules: PluginConditionRules[],\n): { [plugin: string]: string[] } => {\n return conditionRules.reduce((acc, pluginRules) => {\n return {\n ...acc,\n [`${pluginRules.pluginId}`]: uniqBy(\n pluginRules.rules.map(rule => rule.resourceType),\n val => val,\n ),\n };\n }, {});\n};\n\nconst getRuleData = (pluginRules: PluginConditionRules, resType: string) => {\n return pluginRules.rules.reduce(\n (ruleAcc: RulesData, rule: ConditionRule) => {\n return rule.resourceType === resType\n ? {\n ...ruleAcc,\n [`${rule.name}`]: {\n schema: rule.paramsSchema,\n description: rule.description,\n },\n rules: [...ruleAcc.rules, rule.name],\n }\n : ruleAcc;\n },\n { rules: [] },\n );\n};\n\nconst getConditionRulesData = (conditionRules: PluginConditionRules[]) => {\n const pluginsResourceTypes = getPluginsResourceTypes(conditionRules);\n\n return conditionRules.reduce((acc: ConditionRulesData, pluginRules) => {\n return {\n ...acc,\n [`${pluginRules.pluginId}`]: pluginsResourceTypes[\n pluginRules.pluginId\n ].reduce((resAcc: ResourceTypeRuleData, resType: string) => {\n return {\n ...resAcc,\n [`${resType}`]: getRuleData(pluginRules, resType),\n };\n }, {}),\n };\n }, {});\n};\n\nexport const useConditionRules = (): ConditionRules => {\n const rbacApi = useApi(rbacApiRef);\n\n const {\n value: conditionRules,\n loading: conditionRulesLoading,\n error: conditionRulesErr,\n } = useAsync(async () => {\n return await rbacApi.getPluginsConditionRules();\n });\n\n const isConditionRulesAvailable =\n !conditionRulesLoading && Array.isArray(conditionRules);\n\n const conditionRulesData = isConditionRulesAvailable\n ? getConditionRulesData(conditionRules)\n : undefined;\n\n return {\n data: conditionRulesData,\n error: conditionRulesErr,\n };\n};\n"],"names":[],"mappings":";;;;;AA6BA,MAAM,uBAAA,GAA0B,CAC9B,cACmC,KAAA;AACnC,EAAA,OAAO,cAAe,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,WAAgB,KAAA;AACjD,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,CAAC,CAAA,EAAG,WAAY,CAAA,QAAQ,EAAE,GAAG,MAAA;AAAA,QAC3B,WAAY,CAAA,KAAA,CAAM,GAAI,CAAA,CAAA,IAAA,KAAQ,KAAK,YAAY,CAAA;AAAA,QAC/C,CAAO,GAAA,KAAA;AAAA;AACT,KACF;AAAA,GACF,EAAG,EAAE,CAAA;AACP,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,WAAA,EAAmC,OAAoB,KAAA;AAC1E,EAAA,OAAO,YAAY,KAAM,CAAA,MAAA;AAAA,IACvB,CAAC,SAAoB,IAAwB,KAAA;AAC3C,MAAO,OAAA,IAAA,CAAK,iBAAiB,OACzB,GAAA;AAAA,QACE,GAAG,OAAA;AAAA,QACH,CAAC,CAAA,EAAG,IAAK,CAAA,IAAI,EAAE,GAAG;AAAA,UAChB,QAAQ,IAAK,CAAA,YAAA;AAAA,UACb,aAAa,IAAK,CAAA;AAAA,SACpB;AAAA,QACA,OAAO,CAAC,GAAG,OAAQ,CAAA,KAAA,EAAO,KAAK,IAAI;AAAA,OAErC,GAAA,OAAA;AAAA,KACN;AAAA,IACA,EAAE,KAAO,EAAA,EAAG;AAAA,GACd;AACF,CAAA;AAEA,MAAM,qBAAA,GAAwB,CAAC,cAA2C,KAAA;AACxE,EAAM,MAAA,oBAAA,GAAuB,wBAAwB,cAAc,CAAA;AAEnE,EAAA,OAAO,cAAe,CAAA,MAAA,CAAO,CAAC,GAAA,EAAyB,WAAgB,KAAA;AACrE,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,CAAC,CAAA,EAAG,WAAY,CAAA,QAAQ,CAAE,CAAA,GAAG,oBAC3B,CAAA,WAAA,CAAY,QACd,CAAA,CAAE,MAAO,CAAA,CAAC,QAA8B,OAAoB,KAAA;AAC1D,QAAO,OAAA;AAAA,UACL,GAAG,MAAA;AAAA,UACH,CAAC,CAAG,EAAA,OAAO,EAAE,GAAG,WAAA,CAAY,aAAa,OAAO;AAAA,SAClD;AAAA,OACF,EAAG,EAAE;AAAA,KACP;AAAA,GACF,EAAG,EAAE,CAAA;AACP,CAAA;AAEO,MAAM,oBAAoB,MAAsB;AACrD,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,cAAA;AAAA,IACP,OAAS,EAAA,qBAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAO,OAAA,MAAM,QAAQ,wBAAyB,EAAA;AAAA,GAC/C,CAAA;AAED,EAAA,MAAM,yBACJ,GAAA,CAAC,qBAAyB,IAAA,KAAA,CAAM,QAAQ,cAAc,CAAA;AAExD,EAAA,MAAM,kBAAqB,GAAA,yBAAA,GACvB,qBAAsB,CAAA,cAAc,CACpC,GAAA,SAAA;AAEJ,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,kBAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACT;AACF;;;;"}
|
|
@@ -15,7 +15,7 @@ const getErrorText = (role, members) => {
|
|
|
15
15
|
message: `Unable to fetch members: ${members.statusText}`
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
return
|
|
18
|
+
return undefined;
|
|
19
19
|
};
|
|
20
20
|
const getMemberData = (memberResource, ref) => {
|
|
21
21
|
if (memberResource) {
|
|
@@ -65,7 +65,7 @@ const useMembers = (roleName, pollInterval) => {
|
|
|
65
65
|
() => Array.isArray(role) ? role[0].memberReferences.reduce((acc, ref) => {
|
|
66
66
|
const memberResource = Array.isArray(
|
|
67
67
|
members
|
|
68
|
-
) ? members.find((member) => stringifyEntityRef(member) === ref) :
|
|
68
|
+
) ? members.find((member) => stringifyEntityRef(member) === ref) : undefined;
|
|
69
69
|
const memberData = getMemberData(memberResource, ref);
|
|
70
70
|
acc.push(memberData);
|
|
71
71
|
return acc;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMembers.esm.js","sources":["../../src/hooks/useMembers.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useAsyncRetry, useInterval } from 'react-use';\n\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { MemberEntity, MembersData } from '../types';\nimport { getMembersFromGroup } from '../utils/rbac-utils';\n\nexport type MembersInfo = {\n loading: boolean;\n data: MembersData[];\n retry: { roleRetry: () => void; membersRetry: () => void };\n error?: { message: string };\n canReadUsersAndGroups: boolean;\n};\n\nconst getErrorText = (\n role: any,\n members: any,\n): { message: string } | undefined => {\n if (!Array.isArray(role) && (role as Response)?.statusText) {\n return {\n message: `Unable to fetch role: ${(role as Response).statusText}`,\n };\n } else if (!Array.isArray(members) && (members as Response)?.statusText) {\n return {\n message: `Unable to fetch members: ${(members as Response).statusText}`,\n };\n }\n return undefined;\n};\n\nconst getMemberData = (\n memberResource: MemberEntity | undefined,\n ref: string,\n) => {\n if (memberResource) {\n return {\n name:\n memberResource.spec.profile?.displayName ??\n memberResource.metadata.name,\n type: memberResource.kind,\n ref: {\n namespace: memberResource.metadata.namespace as string,\n kind: memberResource.kind.toLocaleLowerCase('en-US'),\n name: memberResource.metadata.name,\n },\n members:\n memberResource.kind === 'Group'\n ? getMembersFromGroup(memberResource)\n : 0,\n };\n }\n const { kind, namespace, name } = parseEntityRef(ref);\n return {\n name,\n type: kind === 'user' ? 'User' : ('Group' as 'User' | 'Group'),\n ref: {\n namespace,\n kind,\n name,\n },\n members: 0,\n };\n};\n\nexport const useMembers = (\n roleName: string,\n pollInterval?: number,\n): MembersInfo => {\n const rbacApi = useApi(rbacApiRef);\n let data: MembersData[] = [];\n const {\n value: role,\n retry: roleRetry,\n error: roleError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getRole(roleName);\n });\n\n const {\n value: members,\n retry: membersRetry,\n error: membersError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getMembers();\n });\n\n const canReadUsersAndGroups =\n !membersError && Array.isArray(members) && members.length > 0;\n\n const loading = !roleError && !membersError && !role && !members;\n\n data = React.useMemo(\n () =>\n Array.isArray(role)\n ? role[0].memberReferences.reduce((acc: MembersData[], ref: string) => {\n const memberResource: MemberEntity | undefined = Array.isArray(\n members,\n )\n ? members.find(member => stringifyEntityRef(member) === ref)\n : undefined;\n const memberData = getMemberData(memberResource, ref);\n acc.push(memberData);\n return acc;\n }, [])\n : [],\n [role, members],\n );\n\n useInterval(\n () => {\n roleRetry();\n membersRetry();\n },\n loading ? null : pollInterval || 10000,\n );\n\n return {\n loading,\n data,\n retry: { roleRetry, membersRetry },\n error: getErrorText(role, members) || roleError || membersError,\n canReadUsersAndGroups,\n };\n};\n"],"names":[],"mappings":";;;;;;;AAiCA,MAAM,YAAA,GAAe,CACnB,IAAA,EACA,OACoC,KAAA;AACpC,EAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA,IAAM,MAAmB,UAAY,EAAA;AAC1D,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,CAA0B,sBAAA,EAAA,IAAA,CAAkB,UAAU,CAAA;AAAA,KACjE;AAAA,aACS,CAAC,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAM,SAAsB,UAAY,EAAA;AACvE,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,CAA6B,yBAAA,EAAA,OAAA,CAAqB,UAAU,CAAA;AAAA,KACvE;AAAA;AAEF,EAAO,OAAA,
|
|
1
|
+
{"version":3,"file":"useMembers.esm.js","sources":["../../src/hooks/useMembers.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useAsyncRetry, useInterval } from 'react-use';\n\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { MemberEntity, MembersData } from '../types';\nimport { getMembersFromGroup } from '../utils/rbac-utils';\n\nexport type MembersInfo = {\n loading: boolean;\n data: MembersData[];\n retry: { roleRetry: () => void; membersRetry: () => void };\n error?: { message: string };\n canReadUsersAndGroups: boolean;\n};\n\nconst getErrorText = (\n role: any,\n members: any,\n): { message: string } | undefined => {\n if (!Array.isArray(role) && (role as Response)?.statusText) {\n return {\n message: `Unable to fetch role: ${(role as Response).statusText}`,\n };\n } else if (!Array.isArray(members) && (members as Response)?.statusText) {\n return {\n message: `Unable to fetch members: ${(members as Response).statusText}`,\n };\n }\n return undefined;\n};\n\nconst getMemberData = (\n memberResource: MemberEntity | undefined,\n ref: string,\n) => {\n if (memberResource) {\n return {\n name:\n memberResource.spec.profile?.displayName ??\n memberResource.metadata.name,\n type: memberResource.kind,\n ref: {\n namespace: memberResource.metadata.namespace as string,\n kind: memberResource.kind.toLocaleLowerCase('en-US'),\n name: memberResource.metadata.name,\n },\n members:\n memberResource.kind === 'Group'\n ? getMembersFromGroup(memberResource)\n : 0,\n };\n }\n const { kind, namespace, name } = parseEntityRef(ref);\n return {\n name,\n type: kind === 'user' ? 'User' : ('Group' as 'User' | 'Group'),\n ref: {\n namespace,\n kind,\n name,\n },\n members: 0,\n };\n};\n\nexport const useMembers = (\n roleName: string,\n pollInterval?: number,\n): MembersInfo => {\n const rbacApi = useApi(rbacApiRef);\n let data: MembersData[] = [];\n const {\n value: role,\n retry: roleRetry,\n error: roleError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getRole(roleName);\n });\n\n const {\n value: members,\n retry: membersRetry,\n error: membersError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getMembers();\n });\n\n const canReadUsersAndGroups =\n !membersError && Array.isArray(members) && members.length > 0;\n\n const loading = !roleError && !membersError && !role && !members;\n\n data = React.useMemo(\n () =>\n Array.isArray(role)\n ? role[0].memberReferences.reduce((acc: MembersData[], ref: string) => {\n const memberResource: MemberEntity | undefined = Array.isArray(\n members,\n )\n ? members.find(member => stringifyEntityRef(member) === ref)\n : undefined;\n const memberData = getMemberData(memberResource, ref);\n acc.push(memberData);\n return acc;\n }, [])\n : [],\n [role, members],\n );\n\n useInterval(\n () => {\n roleRetry();\n membersRetry();\n },\n loading ? null : pollInterval || 10000,\n );\n\n return {\n loading,\n data,\n retry: { roleRetry, membersRetry },\n error: getErrorText(role, members) || roleError || membersError,\n canReadUsersAndGroups,\n };\n};\n"],"names":[],"mappings":";;;;;;;AAiCA,MAAM,YAAA,GAAe,CACnB,IAAA,EACA,OACoC,KAAA;AACpC,EAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA,IAAM,MAAmB,UAAY,EAAA;AAC1D,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,CAA0B,sBAAA,EAAA,IAAA,CAAkB,UAAU,CAAA;AAAA,KACjE;AAAA,aACS,CAAC,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAM,SAAsB,UAAY,EAAA;AACvE,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,CAA6B,yBAAA,EAAA,OAAA,CAAqB,UAAU,CAAA;AAAA,KACvE;AAAA;AAEF,EAAO,OAAA,SAAA;AACT,CAAA;AAEA,MAAM,aAAA,GAAgB,CACpB,cAAA,EACA,GACG,KAAA;AACH,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,MACE,cAAe,CAAA,IAAA,CAAK,OAAS,EAAA,WAAA,IAC7B,eAAe,QAAS,CAAA,IAAA;AAAA,MAC1B,MAAM,cAAe,CAAA,IAAA;AAAA,MACrB,GAAK,EAAA;AAAA,QACH,SAAA,EAAW,eAAe,QAAS,CAAA,SAAA;AAAA,QACnC,IAAM,EAAA,cAAA,CAAe,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QACnD,IAAA,EAAM,eAAe,QAAS,CAAA;AAAA,OAChC;AAAA,MACA,SACE,cAAe,CAAA,IAAA,KAAS,OACpB,GAAA,mBAAA,CAAoB,cAAc,CAClC,GAAA;AAAA,KACR;AAAA;AAEF,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,GAAG,CAAA;AACpD,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,IAAA,EAAM,IAAS,KAAA,MAAA,GAAS,MAAU,GAAA,OAAA;AAAA,IAClC,GAAK,EAAA;AAAA,MACH,SAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAS,EAAA;AAAA,GACX;AACF,CAAA;AAEa,MAAA,UAAA,GAAa,CACxB,QAAA,EACA,YACgB,KAAA;AAChB,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,IAAI,OAAsB,EAAC;AAC3B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT,GAAI,cAAc,YAAY;AAC5B,IAAO,OAAA,MAAM,OAAQ,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,GACtC,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,OAAA;AAAA,IACP,KAAO,EAAA,YAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT,GAAI,cAAc,YAAY;AAC5B,IAAO,OAAA,MAAM,QAAQ,UAAW,EAAA;AAAA,GACjC,CAAA;AAED,EAAM,MAAA,qBAAA,GACJ,CAAC,YAAgB,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAK,QAAQ,MAAS,GAAA,CAAA;AAE9D,EAAA,MAAM,UAAU,CAAC,SAAA,IAAa,CAAC,YAAgB,IAAA,CAAC,QAAQ,CAAC,OAAA;AAEzD,EAAA,IAAA,GAAO,KAAM,CAAA,OAAA;AAAA,IACX,MACE,KAAA,CAAM,OAAQ,CAAA,IAAI,CACd,GAAA,IAAA,CAAK,CAAC,CAAA,CAAE,gBAAiB,CAAA,MAAA,CAAO,CAAC,GAAA,EAAoB,GAAgB,KAAA;AACnE,MAAA,MAAM,iBAA2C,KAAM,CAAA,OAAA;AAAA,QACrD;AAAA,OACF,GACI,QAAQ,IAAK,CAAA,CAAA,MAAA,KAAU,mBAAmB,MAAM,CAAA,KAAM,GAAG,CACzD,GAAA,SAAA;AACJ,MAAM,MAAA,UAAA,GAAa,aAAc,CAAA,cAAA,EAAgB,GAAG,CAAA;AACpD,MAAA,GAAA,CAAI,KAAK,UAAU,CAAA;AACnB,MAAO,OAAA,GAAA;AAAA,KACN,EAAA,EAAE,CAAA,GACL,EAAC;AAAA,IACP,CAAC,MAAM,OAAO;AAAA,GAChB;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAU,SAAA,EAAA;AACV,MAAa,YAAA,EAAA;AAAA,KACf;AAAA,IACA,OAAA,GAAU,OAAuB;AAAA,GACnC;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,EAAE,SAAA,EAAW,YAAa,EAAA;AAAA,IACjC,KAAO,EAAA,YAAA,CAAa,IAAM,EAAA,OAAO,KAAK,SAAa,IAAA,YAAA;AAAA,IACnD;AAAA,GACF;AACF;;;;"}
|
|
@@ -22,7 +22,7 @@ const getErrorText = (policies, permissionPolicies, conditionalPolicies) => {
|
|
|
22
22
|
message: `Error fetching the conditional permission policies. ${conditionalPolicies.statusText}`
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
return
|
|
25
|
+
return undefined;
|
|
26
26
|
};
|
|
27
27
|
const usePermissionPolicies = (entityReference, pollInterval) => {
|
|
28
28
|
const rbacApi = useApi(rbacApiRef);
|
|
@@ -57,7 +57,7 @@ const usePermissionPolicies = (entityReference, pollInterval) => {
|
|
|
57
57
|
}, [allPermissionPolicies, policies]);
|
|
58
58
|
const conditionsData = React.useMemo(() => {
|
|
59
59
|
const cpp = Array.isArray(conditionalPolicies) ? conditionalPolicies : [];
|
|
60
|
-
const pluginsPermissionsPoliciesData = allPermissionPolicies.length > 0 ? getPluginsPermissionPoliciesData(allPermissionPolicies) :
|
|
60
|
+
const pluginsPermissionsPoliciesData = allPermissionPolicies.length > 0 ? getPluginsPermissionPoliciesData(allPermissionPolicies) : undefined;
|
|
61
61
|
return pluginsPermissionsPoliciesData ? getConditionalPermissionsData(cpp, pluginsPermissionsPoliciesData) : [];
|
|
62
62
|
}, [allPermissionPolicies, conditionalPolicies]);
|
|
63
63
|
useInterval(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePermissionPolicies.esm.js","sources":["../../src/hooks/usePermissionPolicies.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useAsyncRetry, useInterval } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { getPluginsPermissionPoliciesData } from '../utils/create-role-utils';\nimport {\n getConditionalPermissionsData,\n getPermissionsData,\n} from '../utils/rbac-utils';\n\nconst getErrorText = (\n policies: any,\n permissionPolicies: any,\n conditionalPolicies: any,\n): { name: number; message: string } | undefined => {\n if (!Array.isArray(policies) && (policies as Response)?.statusText) {\n return {\n name: (policies as Response).status,\n message: `Error fetching policies. ${(policies as Response).statusText}`,\n };\n } else if (\n !Array.isArray(permissionPolicies) &&\n (permissionPolicies as Response)?.statusText\n ) {\n return {\n name: (permissionPolicies as Response).status,\n message: `Error fetching the plugins. ${\n (permissionPolicies as Response).statusText\n }`,\n };\n } else if (\n !Array.isArray(conditionalPolicies) &&\n (conditionalPolicies as Response)?.statusText\n ) {\n return {\n name: (conditionalPolicies as Response).status,\n message: `Error fetching the conditional permission policies. ${\n (conditionalPolicies as Response).statusText\n }`,\n };\n }\n return undefined;\n};\n\nexport const usePermissionPolicies = (\n entityReference: string,\n pollInterval?: number,\n) => {\n const rbacApi = useApi(rbacApiRef);\n const {\n value: policies,\n retry: policiesRetry,\n error: policiesError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getAssociatedPolicies(entityReference);\n });\n\n const {\n value: conditionalPolicies,\n retry: conditionalPoliciesRetry,\n error: conditionalPoliciesError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getRoleConditions(entityReference);\n });\n\n const {\n value: permissionPolicies,\n error: permissionPoliciesError,\n retry: permissionPoliciesRetry,\n } = useAsyncRetry(async () => {\n return await rbacApi.listPermissions();\n });\n\n const loading =\n !permissionPoliciesError &&\n !policiesError &&\n !conditionalPoliciesError &&\n (!permissionPolicies || !policies || !conditionalPolicies);\n\n const allPermissionPolicies = React.useMemo(\n () => (Array.isArray(permissionPolicies) ? permissionPolicies : []),\n [permissionPolicies],\n );\n\n const data = React.useMemo(() => {\n return Array.isArray(policies)\n ? getPermissionsData(policies, allPermissionPolicies)\n : [];\n }, [allPermissionPolicies, policies]);\n\n const conditionsData = React.useMemo(() => {\n const cpp = Array.isArray(conditionalPolicies) ? conditionalPolicies : [];\n const pluginsPermissionsPoliciesData =\n allPermissionPolicies.length > 0\n ? getPluginsPermissionPoliciesData(allPermissionPolicies)\n : undefined;\n return pluginsPermissionsPoliciesData\n ? getConditionalPermissionsData(cpp, pluginsPermissionsPoliciesData)\n : [];\n }, [allPermissionPolicies, conditionalPolicies]);\n\n useInterval(\n () => {\n policiesRetry();\n permissionPoliciesRetry();\n conditionalPoliciesRetry();\n },\n loading ? null : pollInterval || null,\n );\n return {\n loading,\n data: [...conditionsData, ...data],\n retry: { policiesRetry, permissionPoliciesRetry, conditionalPoliciesRetry },\n error:\n policiesError ||\n permissionPoliciesError ||\n conditionalPoliciesError ||\n getErrorText(policies, permissionPolicies, conditionalPolicies),\n };\n};\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,YAAe,GAAA,CACnB,QACA,EAAA,kBAAA,EACA,mBACkD,KAAA;AAClD,EAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA,IAAM,UAAuB,UAAY,EAAA;AAClE,IAAO,OAAA;AAAA,MACL,MAAO,QAAsB,CAAA,MAAA;AAAA,MAC7B,OAAA,EAAS,CAA6B,yBAAA,EAAA,QAAA,CAAsB,UAAU,CAAA;AAAA,KACxE;AAAA,aAEA,CAAC,KAAA,CAAM,QAAQ,kBAAkB,CAAA,IAChC,oBAAiC,UAClC,EAAA;AACA,IAAO,OAAA;AAAA,MACL,MAAO,kBAAgC,CAAA,MAAA;AAAA,MACvC,OAAA,EAAS,CACN,4BAAA,EAAA,kBAAA,CAAgC,UACnC,CAAA;AAAA,KACF;AAAA,aAEA,CAAC,KAAA,CAAM,QAAQ,mBAAmB,CAAA,IACjC,qBAAkC,UACnC,EAAA;AACA,IAAO,OAAA;AAAA,MACL,MAAO,mBAAiC,CAAA,MAAA;AAAA,MACxC,OAAA,EAAS,CACN,oDAAA,EAAA,mBAAA,CAAiC,UACpC,CAAA;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,
|
|
1
|
+
{"version":3,"file":"usePermissionPolicies.esm.js","sources":["../../src/hooks/usePermissionPolicies.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { useAsyncRetry, useInterval } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { getPluginsPermissionPoliciesData } from '../utils/create-role-utils';\nimport {\n getConditionalPermissionsData,\n getPermissionsData,\n} from '../utils/rbac-utils';\n\nconst getErrorText = (\n policies: any,\n permissionPolicies: any,\n conditionalPolicies: any,\n): { name: number; message: string } | undefined => {\n if (!Array.isArray(policies) && (policies as Response)?.statusText) {\n return {\n name: (policies as Response).status,\n message: `Error fetching policies. ${(policies as Response).statusText}`,\n };\n } else if (\n !Array.isArray(permissionPolicies) &&\n (permissionPolicies as Response)?.statusText\n ) {\n return {\n name: (permissionPolicies as Response).status,\n message: `Error fetching the plugins. ${\n (permissionPolicies as Response).statusText\n }`,\n };\n } else if (\n !Array.isArray(conditionalPolicies) &&\n (conditionalPolicies as Response)?.statusText\n ) {\n return {\n name: (conditionalPolicies as Response).status,\n message: `Error fetching the conditional permission policies. ${\n (conditionalPolicies as Response).statusText\n }`,\n };\n }\n return undefined;\n};\n\nexport const usePermissionPolicies = (\n entityReference: string,\n pollInterval?: number,\n) => {\n const rbacApi = useApi(rbacApiRef);\n const {\n value: policies,\n retry: policiesRetry,\n error: policiesError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getAssociatedPolicies(entityReference);\n });\n\n const {\n value: conditionalPolicies,\n retry: conditionalPoliciesRetry,\n error: conditionalPoliciesError,\n } = useAsyncRetry(async () => {\n return await rbacApi.getRoleConditions(entityReference);\n });\n\n const {\n value: permissionPolicies,\n error: permissionPoliciesError,\n retry: permissionPoliciesRetry,\n } = useAsyncRetry(async () => {\n return await rbacApi.listPermissions();\n });\n\n const loading =\n !permissionPoliciesError &&\n !policiesError &&\n !conditionalPoliciesError &&\n (!permissionPolicies || !policies || !conditionalPolicies);\n\n const allPermissionPolicies = React.useMemo(\n () => (Array.isArray(permissionPolicies) ? permissionPolicies : []),\n [permissionPolicies],\n );\n\n const data = React.useMemo(() => {\n return Array.isArray(policies)\n ? getPermissionsData(policies, allPermissionPolicies)\n : [];\n }, [allPermissionPolicies, policies]);\n\n const conditionsData = React.useMemo(() => {\n const cpp = Array.isArray(conditionalPolicies) ? conditionalPolicies : [];\n const pluginsPermissionsPoliciesData =\n allPermissionPolicies.length > 0\n ? getPluginsPermissionPoliciesData(allPermissionPolicies)\n : undefined;\n return pluginsPermissionsPoliciesData\n ? getConditionalPermissionsData(cpp, pluginsPermissionsPoliciesData)\n : [];\n }, [allPermissionPolicies, conditionalPolicies]);\n\n useInterval(\n () => {\n policiesRetry();\n permissionPoliciesRetry();\n conditionalPoliciesRetry();\n },\n loading ? null : pollInterval || null,\n );\n return {\n loading,\n data: [...conditionsData, ...data],\n retry: { policiesRetry, permissionPoliciesRetry, conditionalPoliciesRetry },\n error:\n policiesError ||\n permissionPoliciesError ||\n conditionalPoliciesError ||\n getErrorText(policies, permissionPolicies, conditionalPolicies),\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ const useRole = (roleEntityRef) => {
|
|
|
11
11
|
} = useAsync(async () => await rbacApi.getRole(roleEntityRef));
|
|
12
12
|
return {
|
|
13
13
|
loading,
|
|
14
|
-
role: Array.isArray(roles) ? roles[0] :
|
|
14
|
+
role: Array.isArray(roles) ? roles[0] : undefined,
|
|
15
15
|
roleError: roleError || {
|
|
16
16
|
name: roles?.status,
|
|
17
17
|
message: `Error fetching the role. ${roles?.statusText}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRole.esm.js","sources":["../../src/hooks/useRole.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { Role } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\n\nexport const useRole = (\n roleEntityRef: string,\n): {\n loading: boolean;\n role: Role | undefined;\n roleError: Error;\n} => {\n const rbacApi = useApi(rbacApiRef);\n const {\n value: roles,\n loading,\n error: roleError,\n } = useAsync(async () => await rbacApi.getRole(roleEntityRef));\n\n return {\n loading,\n role: Array.isArray(roles) ? roles[0] : undefined,\n roleError: (roleError as Error) || {\n name: (roles as Response)?.status,\n message: `Error fetching the role. ${(roles as Response)?.statusText}`,\n },\n };\n};\n"],"names":[],"mappings":";;;;AAuBa,MAAA,OAAA,GAAU,CACrB,aAKG,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,KAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAO,EAAA;AAAA,MACL,QAAS,CAAA,YAAY,MAAM,OAAQ,CAAA,OAAA,CAAQ,aAAa,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,MAAM,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAI,GAAA,KAAA,CAAM,CAAC,CAAI,GAAA,
|
|
1
|
+
{"version":3,"file":"useRole.esm.js","sources":["../../src/hooks/useRole.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { Role } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\n\nexport const useRole = (\n roleEntityRef: string,\n): {\n loading: boolean;\n role: Role | undefined;\n roleError: Error;\n} => {\n const rbacApi = useApi(rbacApiRef);\n const {\n value: roles,\n loading,\n error: roleError,\n } = useAsync(async () => await rbacApi.getRole(roleEntityRef));\n\n return {\n loading,\n role: Array.isArray(roles) ? roles[0] : undefined,\n roleError: (roleError as Error) || {\n name: (roles as Response)?.status,\n message: `Error fetching the role. ${(roles as Response)?.statusText}`,\n },\n };\n};\n"],"names":[],"mappings":";;;;AAuBa,MAAA,OAAA,GAAU,CACrB,aAKG,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,KAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAO,EAAA;AAAA,MACL,QAAS,CAAA,YAAY,MAAM,OAAQ,CAAA,OAAA,CAAQ,aAAa,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,MAAM,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAI,GAAA,KAAA,CAAM,CAAC,CAAI,GAAA,SAAA;AAAA,IACxC,WAAY,SAAuB,IAAA;AAAA,MACjC,MAAO,KAAoB,EAAA,MAAA;AAAA,MAC3B,OAAA,EAAS,CAA6B,yBAAA,EAAA,KAAA,EAAoB,UAAU,CAAA;AAAA;AACtE,GACF;AACF;;;;"}
|
|
@@ -17,7 +17,7 @@ const useSelectedMembers = (roleName) => {
|
|
|
17
17
|
});
|
|
18
18
|
const canReadUsersAndGroups = !membersLoading && !membersError && Array.isArray(members) && members.length > 0;
|
|
19
19
|
const data = role ? role.memberReferences.reduce((acc, ref) => {
|
|
20
|
-
const memberResource = Array.isArray(members) && members.find((member) => stringifyEntityRef(member) === ref) ||
|
|
20
|
+
const memberResource = Array.isArray(members) && members.find((member) => stringifyEntityRef(member) === ref) || undefined;
|
|
21
21
|
acc.push(getSelectedMember(memberResource, ref));
|
|
22
22
|
return acc;
|
|
23
23
|
}, []) : [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelectedMembers.esm.js","sources":["../../src/hooks/useSelectedMembers.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { Role } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { SelectedMember } from '../components/CreateRole/types';\nimport { MemberEntity } from '../types';\nimport { getSelectedMember } from '../utils/rbac-utils';\nimport { useRole } from './useRole';\n\nexport const useSelectedMembers = (\n roleName: string,\n): {\n members: MemberEntity[];\n selectedMembers: SelectedMember[];\n role: Role | undefined;\n membersError: Error;\n roleError: Error;\n loading: boolean;\n canReadUsersAndGroups: boolean;\n} => {\n const rbacApi = useApi(rbacApiRef);\n const { role, loading: roleLoading, roleError } = useRole(roleName);\n\n const {\n loading: membersLoading,\n value: members,\n error: membersError,\n } = useAsync(async () => {\n return await rbacApi.getMembers();\n });\n\n const canReadUsersAndGroups =\n !membersLoading &&\n !membersError &&\n Array.isArray(members) &&\n members.length > 0;\n\n const data: SelectedMember[] = role\n ? (role as Role).memberReferences.reduce((acc: SelectedMember[], ref) => {\n const memberResource =\n (Array.isArray(members) &&\n members.find(member => stringifyEntityRef(member) === ref)) ||\n undefined;\n acc.push(getSelectedMember(memberResource, ref));\n\n return acc;\n }, [])\n : [];\n\n return {\n selectedMembers: data,\n members: Array.isArray(members) ? members : ([] as MemberEntity[]),\n role,\n membersError: (membersError as Error) || {\n name: (members as Response)?.status,\n message: (members as Response)?.statusText,\n },\n roleError: roleError,\n loading: roleLoading || membersLoading,\n canReadUsersAndGroups,\n };\n};\n"],"names":[],"mappings":";;;;;;;AA4Ba,MAAA,kBAAA,GAAqB,CAChC,QASG,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,aAAa,SAAU,EAAA,GAAI,QAAQ,QAAQ,CAAA;AAElE,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,cAAA;AAAA,IACT,KAAO,EAAA,OAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAO,OAAA,MAAM,QAAQ,UAAW,EAAA;AAAA,GACjC,CAAA;AAED,EAAM,MAAA,qBAAA,GACJ,CAAC,cAAA,IACD,CAAC,YAAA,IACD,MAAM,OAAQ,CAAA,OAAO,CACrB,IAAA,OAAA,CAAQ,MAAS,GAAA,CAAA;AAEnB,EAAA,MAAM,OAAyB,IAC1B,GAAA,IAAA,CAAc,iBAAiB,MAAO,CAAA,CAAC,KAAuB,GAAQ,KAAA;AACrE,IAAA,MAAM,cACH,GAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,CACpB,IAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,MAAA,KAAU,kBAAmB,CAAA,MAAM,CAAM,KAAA,GAAG,CAC3D,IAAA,
|
|
1
|
+
{"version":3,"file":"useSelectedMembers.esm.js","sources":["../../src/hooks/useSelectedMembers.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAsync } from 'react-use';\n\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { Role } from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { SelectedMember } from '../components/CreateRole/types';\nimport { MemberEntity } from '../types';\nimport { getSelectedMember } from '../utils/rbac-utils';\nimport { useRole } from './useRole';\n\nexport const useSelectedMembers = (\n roleName: string,\n): {\n members: MemberEntity[];\n selectedMembers: SelectedMember[];\n role: Role | undefined;\n membersError: Error;\n roleError: Error;\n loading: boolean;\n canReadUsersAndGroups: boolean;\n} => {\n const rbacApi = useApi(rbacApiRef);\n const { role, loading: roleLoading, roleError } = useRole(roleName);\n\n const {\n loading: membersLoading,\n value: members,\n error: membersError,\n } = useAsync(async () => {\n return await rbacApi.getMembers();\n });\n\n const canReadUsersAndGroups =\n !membersLoading &&\n !membersError &&\n Array.isArray(members) &&\n members.length > 0;\n\n const data: SelectedMember[] = role\n ? (role as Role).memberReferences.reduce((acc: SelectedMember[], ref) => {\n const memberResource =\n (Array.isArray(members) &&\n members.find(member => stringifyEntityRef(member) === ref)) ||\n undefined;\n acc.push(getSelectedMember(memberResource, ref));\n\n return acc;\n }, [])\n : [];\n\n return {\n selectedMembers: data,\n members: Array.isArray(members) ? members : ([] as MemberEntity[]),\n role,\n membersError: (membersError as Error) || {\n name: (members as Response)?.status,\n message: (members as Response)?.statusText,\n },\n roleError: roleError,\n loading: roleLoading || membersLoading,\n canReadUsersAndGroups,\n };\n};\n"],"names":[],"mappings":";;;;;;;AA4Ba,MAAA,kBAAA,GAAqB,CAChC,QASG,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,aAAa,SAAU,EAAA,GAAI,QAAQ,QAAQ,CAAA;AAElE,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,cAAA;AAAA,IACT,KAAO,EAAA,OAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAO,OAAA,MAAM,QAAQ,UAAW,EAAA;AAAA,GACjC,CAAA;AAED,EAAM,MAAA,qBAAA,GACJ,CAAC,cAAA,IACD,CAAC,YAAA,IACD,MAAM,OAAQ,CAAA,OAAO,CACrB,IAAA,OAAA,CAAQ,MAAS,GAAA,CAAA;AAEnB,EAAA,MAAM,OAAyB,IAC1B,GAAA,IAAA,CAAc,iBAAiB,MAAO,CAAA,CAAC,KAAuB,GAAQ,KAAA;AACrE,IAAA,MAAM,cACH,GAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,CACpB,IAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,MAAA,KAAU,kBAAmB,CAAA,MAAM,CAAM,KAAA,GAAG,CAC3D,IAAA,SAAA;AACF,IAAA,GAAA,CAAI,IAAK,CAAA,iBAAA,CAAkB,cAAgB,EAAA,GAAG,CAAC,CAAA;AAE/C,IAAO,OAAA,GAAA;AAAA,GACN,EAAA,EAAE,CAAA,GACL,EAAC;AAEL,EAAO,OAAA;AAAA,IACL,eAAiB,EAAA,IAAA;AAAA,IACjB,SAAS,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAW,EAAC;AAAA,IAC9C,IAAA;AAAA,IACA,cAAe,YAA0B,IAAA;AAAA,MACvC,MAAO,OAAsB,EAAA,MAAA;AAAA,MAC7B,SAAU,OAAsB,EAAA;AAAA,KAClC;AAAA,IACA,SAAA;AAAA,IACA,SAAS,WAAe,IAAA,cAAA;AAAA,IACxB;AAAA,GACF;AACF;;;;"}
|
|
@@ -55,7 +55,7 @@ const initializeErrors = (criteria, conditions) => {
|
|
|
55
55
|
} else if (criteria === criterias.not) {
|
|
56
56
|
const notCondition = conditions.not;
|
|
57
57
|
let notConditionType;
|
|
58
|
-
if (notCondition ===
|
|
58
|
+
if (notCondition === undefined) {
|
|
59
59
|
notConditionType = NotConditionType.SimpleCondition;
|
|
60
60
|
} else if ("rule" in notCondition) {
|
|
61
61
|
notConditionType = NotConditionType.SimpleCondition;
|
|
@@ -104,7 +104,7 @@ const getNestedConditionSimpleRulesCount = (nc, c) => {
|
|
|
104
104
|
).length;
|
|
105
105
|
};
|
|
106
106
|
const getRowStyle = (c, isNestedCondition) => isNestedCondition ? {
|
|
107
|
-
display: c.rule !==
|
|
107
|
+
display: c.rule !== undefined ? "flex" : "none"
|
|
108
108
|
} : { display: "flex", gap: "10px" };
|
|
109
109
|
const getRowKey = (isNestedCondition, ruleIndex) => isNestedCondition ? `nestedCondition-rule-${ruleIndex}` : `condition-rule-${ruleIndex}`;
|
|
110
110
|
const hasAllOfOrAnyOfErrors = (errors, criteria) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-access-utils.esm.js","sources":["../../src/utils/conditional-access-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { PermissionCondition } from '@backstage/plugin-permission-common';\n\nimport { RJSFValidationError } from '@rjsf/utils';\n\nimport {\n conditionButtons,\n criterias,\n} from '../components/ConditionalAccess/const';\nimport {\n AccessConditionsErrors,\n ComplexErrors,\n Condition,\n ConditionsData,\n NestedCriteriaErrors,\n NotConditionType,\n} from '../components/ConditionalAccess/types';\n\nexport const ruleOptionDisabled = (\n ruleOption: string,\n conditions?: PermissionCondition[],\n) => {\n return !!(conditions || []).find(con => con.rule === ruleOption);\n};\n\nexport const nestedConditionButtons = conditionButtons.filter(\n button => button.val !== 'condition',\n);\n\nexport const extractNestedConditions = (\n conditions: Condition[],\n criteriaTypes: string[],\n nestedConditions: Condition[],\n) => {\n conditions.forEach(c => {\n criteriaTypes.forEach(ct => {\n if (Object.keys(c).includes(ct)) {\n nestedConditions.push(c);\n }\n });\n });\n};\n\nexport const getDefaultRule = (selPluginResourceType: string) => ({\n rule: '',\n resourceType: selPluginResourceType,\n params: {},\n});\n\nexport const getSimpleRulesCount = (\n conditionRow: ConditionsData,\n criteria: string,\n): number => {\n if (criteria === criterias.not) {\n return (conditionRow[criteria as keyof Condition] as PermissionCondition)\n .resourceType\n ? 1\n : 0;\n }\n if (criteria === criterias.condition) {\n return 1;\n }\n return (conditionRow[criteria as keyof Condition] as Condition[]).filter(\n (e: Condition) => 'rule' in e,\n ).length;\n};\n\nexport const initializeErrors = (\n criteria: keyof ConditionsData,\n conditions: ConditionsData,\n): AccessConditionsErrors => {\n const errors: AccessConditionsErrors = {};\n const initialize = (cond: Condition | ConditionsData): ComplexErrors => {\n if ('rule' in cond) {\n return '';\n }\n\n const nestedErrors: NestedCriteriaErrors = {};\n if (cond.allOf) {\n nestedErrors.allOf = (cond.allOf.map(initialize) as string[]) || [];\n }\n if (cond.anyOf) {\n nestedErrors.anyOf = (cond.anyOf.map(initialize) as string[]) || [];\n }\n if (cond.not) {\n nestedErrors.not = (initialize(cond.not) as string) || '';\n }\n\n return nestedErrors;\n };\n\n if (criteria === criterias.condition) {\n errors.condition = '';\n } else if (criteria === criterias.not) {\n const notCondition = conditions.not;\n\n let notConditionType;\n if (notCondition === undefined) {\n notConditionType = NotConditionType.SimpleCondition;\n } else if ('rule' in notCondition) {\n notConditionType = NotConditionType.SimpleCondition;\n } else {\n notConditionType = NotConditionType.NestedCondition;\n }\n\n if (notConditionType === NotConditionType.SimpleCondition) {\n errors.not = '';\n } else {\n errors.not = initialize(conditions.not!);\n }\n } else if (criteria === criterias.allOf || criteria === criterias.anyOf) {\n errors[criteria] = Array.isArray(conditions[criteria])\n ? (conditions[criteria] as Condition[]).map(initialize)\n : [''];\n }\n\n return errors;\n};\n\nexport const resetErrors = (\n criteria: string,\n notConditionType = NotConditionType.SimpleCondition,\n): AccessConditionsErrors => {\n const errors: AccessConditionsErrors = {};\n\n if (\n criteria === criterias.condition ||\n (criteria === criterias.not &&\n notConditionType === NotConditionType.SimpleCondition)\n ) {\n errors[criteria] = '';\n }\n\n if (criteria === criterias.allOf || criteria === criterias.anyOf) {\n errors[criteria] = [''] as ComplexErrors[];\n }\n\n if (\n criteria === criterias.not &&\n notConditionType === NotConditionType.NestedCondition\n ) {\n (errors[criteria] as ComplexErrors) = { [criterias.allOf]: [''] };\n }\n\n return errors;\n};\n\nexport const setErrorMessage = (errors: RJSFValidationError[]) =>\n errors[0] ? `Error in the ${errors[0].property} field.` : '';\n\nexport const getSimpleRuleErrors = (errors: ComplexErrors[]): string[] =>\n (errors.filter(\n (err: ComplexErrors) => typeof err === 'string',\n ) as string[]) || [];\n\nexport const getNestedRuleErrors = (\n errors: ComplexErrors[],\n): NestedCriteriaErrors[] =>\n (errors.filter(\n (err: ComplexErrors) => typeof err !== 'string',\n ) as NestedCriteriaErrors[]) || [];\n\nexport const isNestedConditionRule = (r: Condition): boolean => {\n return (\n criterias.allOf in (r as ConditionsData) ||\n criterias.anyOf in (r as ConditionsData) ||\n criterias.not in (r as ConditionsData)\n );\n};\n\nexport const getNestedConditionSimpleRulesCount = (\n nc: Condition,\n c: string,\n): number => {\n if (c === criterias.not) {\n return (nc[c as keyof Condition] as PermissionCondition).resourceType\n ? 1\n : 0;\n }\n\n return (nc[c as keyof Condition] as Condition[]).filter(\n r => 'resourceType' in r,\n ).length;\n};\n\nexport const getRowStyle = (c: Condition, isNestedCondition: boolean) =>\n isNestedCondition\n ? {\n display:\n (c as PermissionCondition).rule !== undefined ? 'flex' : 'none',\n }\n : { display: 'flex', gap: '10px' };\n\nexport const getRowKey = (isNestedCondition: boolean, ruleIndex: number) =>\n isNestedCondition\n ? `nestedCondition-rule-${ruleIndex}`\n : `condition-rule-${ruleIndex}`;\n\nexport const hasAllOfOrAnyOfErrors = (\n errors: AccessConditionsErrors,\n criteria: string,\n): boolean => {\n if (!errors) return false;\n\n const criteriaErrors = errors[\n criteria as keyof AccessConditionsErrors\n ] as ComplexErrors[];\n const simpleRuleErrors = criteriaErrors.filter(\n e => typeof e === 'string',\n ) as string[];\n const nestedRuleErrors = criteriaErrors.filter(\n e => typeof e !== 'string',\n ) as NestedCriteriaErrors[];\n\n if (simpleRuleErrors.some(e => e.length > 0)) {\n return true;\n }\n\n return nestedRuleErrors.some(err => {\n const nestedCriteria = Object.keys(err)[0] as keyof NestedCriteriaErrors;\n const nestedErrors = err[nestedCriteria];\n\n if (Array.isArray(nestedErrors)) {\n return nestedErrors.some(e => e.length > 0);\n }\n return nestedErrors?.length > 0;\n });\n};\n\nexport const hasSimpleConditionOrNotErrors = (\n errors: AccessConditionsErrors,\n criteria: string,\n): boolean => {\n if (!errors) return false;\n return (\n ((errors[criteria as keyof AccessConditionsErrors] as string) || '')\n .length > 0\n );\n};\n\nexport const hasNestedNotErrors = (\n errors: AccessConditionsErrors,\n conditions: ConditionsData,\n criteria: keyof ConditionsData,\n): boolean => {\n if (!errors) return false;\n const nestedCriteria = Object.keys(conditions[criteria]!)[0];\n const nestedErrors = (\n errors[\n criterias.not as keyof AccessConditionsErrors\n ] as NestedCriteriaErrors\n )[nestedCriteria];\n\n if (Array.isArray(nestedErrors)) {\n return nestedErrors.some(e => e.length > 0);\n }\n return nestedErrors?.length > 0;\n};\n\nexport const isSimpleRule = (con: Condition): boolean => 'rule' in con;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conditional-access-utils.esm.js","sources":["../../src/utils/conditional-access-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { PermissionCondition } from '@backstage/plugin-permission-common';\n\nimport { RJSFValidationError } from '@rjsf/utils';\n\nimport {\n conditionButtons,\n criterias,\n} from '../components/ConditionalAccess/const';\nimport {\n AccessConditionsErrors,\n ComplexErrors,\n Condition,\n ConditionsData,\n NestedCriteriaErrors,\n NotConditionType,\n} from '../components/ConditionalAccess/types';\n\nexport const ruleOptionDisabled = (\n ruleOption: string,\n conditions?: PermissionCondition[],\n) => {\n return !!(conditions || []).find(con => con.rule === ruleOption);\n};\n\nexport const nestedConditionButtons = conditionButtons.filter(\n button => button.val !== 'condition',\n);\n\nexport const extractNestedConditions = (\n conditions: Condition[],\n criteriaTypes: string[],\n nestedConditions: Condition[],\n) => {\n conditions.forEach(c => {\n criteriaTypes.forEach(ct => {\n if (Object.keys(c).includes(ct)) {\n nestedConditions.push(c);\n }\n });\n });\n};\n\nexport const getDefaultRule = (selPluginResourceType: string) => ({\n rule: '',\n resourceType: selPluginResourceType,\n params: {},\n});\n\nexport const getSimpleRulesCount = (\n conditionRow: ConditionsData,\n criteria: string,\n): number => {\n if (criteria === criterias.not) {\n return (conditionRow[criteria as keyof Condition] as PermissionCondition)\n .resourceType\n ? 1\n : 0;\n }\n if (criteria === criterias.condition) {\n return 1;\n }\n return (conditionRow[criteria as keyof Condition] as Condition[]).filter(\n (e: Condition) => 'rule' in e,\n ).length;\n};\n\nexport const initializeErrors = (\n criteria: keyof ConditionsData,\n conditions: ConditionsData,\n): AccessConditionsErrors => {\n const errors: AccessConditionsErrors = {};\n const initialize = (cond: Condition | ConditionsData): ComplexErrors => {\n if ('rule' in cond) {\n return '';\n }\n\n const nestedErrors: NestedCriteriaErrors = {};\n if (cond.allOf) {\n nestedErrors.allOf = (cond.allOf.map(initialize) as string[]) || [];\n }\n if (cond.anyOf) {\n nestedErrors.anyOf = (cond.anyOf.map(initialize) as string[]) || [];\n }\n if (cond.not) {\n nestedErrors.not = (initialize(cond.not) as string) || '';\n }\n\n return nestedErrors;\n };\n\n if (criteria === criterias.condition) {\n errors.condition = '';\n } else if (criteria === criterias.not) {\n const notCondition = conditions.not;\n\n let notConditionType;\n if (notCondition === undefined) {\n notConditionType = NotConditionType.SimpleCondition;\n } else if ('rule' in notCondition) {\n notConditionType = NotConditionType.SimpleCondition;\n } else {\n notConditionType = NotConditionType.NestedCondition;\n }\n\n if (notConditionType === NotConditionType.SimpleCondition) {\n errors.not = '';\n } else {\n errors.not = initialize(conditions.not!);\n }\n } else if (criteria === criterias.allOf || criteria === criterias.anyOf) {\n errors[criteria] = Array.isArray(conditions[criteria])\n ? (conditions[criteria] as Condition[]).map(initialize)\n : [''];\n }\n\n return errors;\n};\n\nexport const resetErrors = (\n criteria: string,\n notConditionType = NotConditionType.SimpleCondition,\n): AccessConditionsErrors => {\n const errors: AccessConditionsErrors = {};\n\n if (\n criteria === criterias.condition ||\n (criteria === criterias.not &&\n notConditionType === NotConditionType.SimpleCondition)\n ) {\n errors[criteria] = '';\n }\n\n if (criteria === criterias.allOf || criteria === criterias.anyOf) {\n errors[criteria] = [''] as ComplexErrors[];\n }\n\n if (\n criteria === criterias.not &&\n notConditionType === NotConditionType.NestedCondition\n ) {\n (errors[criteria] as ComplexErrors) = { [criterias.allOf]: [''] };\n }\n\n return errors;\n};\n\nexport const setErrorMessage = (errors: RJSFValidationError[]) =>\n errors[0] ? `Error in the ${errors[0].property} field.` : '';\n\nexport const getSimpleRuleErrors = (errors: ComplexErrors[]): string[] =>\n (errors.filter(\n (err: ComplexErrors) => typeof err === 'string',\n ) as string[]) || [];\n\nexport const getNestedRuleErrors = (\n errors: ComplexErrors[],\n): NestedCriteriaErrors[] =>\n (errors.filter(\n (err: ComplexErrors) => typeof err !== 'string',\n ) as NestedCriteriaErrors[]) || [];\n\nexport const isNestedConditionRule = (r: Condition): boolean => {\n return (\n criterias.allOf in (r as ConditionsData) ||\n criterias.anyOf in (r as ConditionsData) ||\n criterias.not in (r as ConditionsData)\n );\n};\n\nexport const getNestedConditionSimpleRulesCount = (\n nc: Condition,\n c: string,\n): number => {\n if (c === criterias.not) {\n return (nc[c as keyof Condition] as PermissionCondition).resourceType\n ? 1\n : 0;\n }\n\n return (nc[c as keyof Condition] as Condition[]).filter(\n r => 'resourceType' in r,\n ).length;\n};\n\nexport const getRowStyle = (c: Condition, isNestedCondition: boolean) =>\n isNestedCondition\n ? {\n display:\n (c as PermissionCondition).rule !== undefined ? 'flex' : 'none',\n }\n : { display: 'flex', gap: '10px' };\n\nexport const getRowKey = (isNestedCondition: boolean, ruleIndex: number) =>\n isNestedCondition\n ? `nestedCondition-rule-${ruleIndex}`\n : `condition-rule-${ruleIndex}`;\n\nexport const hasAllOfOrAnyOfErrors = (\n errors: AccessConditionsErrors,\n criteria: string,\n): boolean => {\n if (!errors) return false;\n\n const criteriaErrors = errors[\n criteria as keyof AccessConditionsErrors\n ] as ComplexErrors[];\n const simpleRuleErrors = criteriaErrors.filter(\n e => typeof e === 'string',\n ) as string[];\n const nestedRuleErrors = criteriaErrors.filter(\n e => typeof e !== 'string',\n ) as NestedCriteriaErrors[];\n\n if (simpleRuleErrors.some(e => e.length > 0)) {\n return true;\n }\n\n return nestedRuleErrors.some(err => {\n const nestedCriteria = Object.keys(err)[0] as keyof NestedCriteriaErrors;\n const nestedErrors = err[nestedCriteria];\n\n if (Array.isArray(nestedErrors)) {\n return nestedErrors.some(e => e.length > 0);\n }\n return nestedErrors?.length > 0;\n });\n};\n\nexport const hasSimpleConditionOrNotErrors = (\n errors: AccessConditionsErrors,\n criteria: string,\n): boolean => {\n if (!errors) return false;\n return (\n ((errors[criteria as keyof AccessConditionsErrors] as string) || '')\n .length > 0\n );\n};\n\nexport const hasNestedNotErrors = (\n errors: AccessConditionsErrors,\n conditions: ConditionsData,\n criteria: keyof ConditionsData,\n): boolean => {\n if (!errors) return false;\n const nestedCriteria = Object.keys(conditions[criteria]!)[0];\n const nestedErrors = (\n errors[\n criterias.not as keyof AccessConditionsErrors\n ] as NestedCriteriaErrors\n )[nestedCriteria];\n\n if (Array.isArray(nestedErrors)) {\n return nestedErrors.some(e => e.length > 0);\n }\n return nestedErrors?.length > 0;\n};\n\nexport const isSimpleRule = (con: Condition): boolean => 'rule' in con;\n"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ const getMembersCount = (member) => {
|
|
|
36
36
|
temp++;
|
|
37
37
|
}
|
|
38
38
|
return temp;
|
|
39
|
-
}, 0) :
|
|
39
|
+
}, 0) : undefined;
|
|
40
40
|
};
|
|
41
41
|
const getParentGroupsCount = (member) => {
|
|
42
42
|
return member.kind === "Group" ? member.relations?.reduce((acc, relation) => {
|
|
@@ -45,7 +45,7 @@ const getParentGroupsCount = (member) => {
|
|
|
45
45
|
temp++;
|
|
46
46
|
}
|
|
47
47
|
return temp;
|
|
48
|
-
}, 0) :
|
|
48
|
+
}, 0) : undefined;
|
|
49
49
|
};
|
|
50
50
|
const getChildGroupsCount = (member) => {
|
|
51
51
|
return member.kind === "Group" ? member.relations?.reduce((acc, relation) => {
|
|
@@ -54,7 +54,7 @@ const getChildGroupsCount = (member) => {
|
|
|
54
54
|
temp++;
|
|
55
55
|
}
|
|
56
56
|
return temp;
|
|
57
|
-
}, 0) :
|
|
57
|
+
}, 0) : undefined;
|
|
58
58
|
};
|
|
59
59
|
const getPermissionPolicies = (policies) => {
|
|
60
60
|
return policies.reduce(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-role-utils.esm.js","sources":["../../src/utils/create-role-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { getTitleCase } from '@janus-idp/shared-react';\nimport * as yup from 'yup';\n\nimport {\n isResourcedPolicy,\n PluginPermissionMetaData,\n PolicyDetails,\n ResourcedPolicy,\n Role,\n RoleBasedPolicy,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { criterias } from '../components/ConditionalAccess/const';\nimport { ConditionsData } from '../components/ConditionalAccess/types';\nimport {\n PermissionPolicies,\n PluginsPermissionPoliciesData,\n PluginsPermissions,\n RoleFormValues,\n SelectedMember,\n} from '../components/CreateRole/types';\nimport {\n MemberEntity,\n PermissionsData,\n RoleBasedConditions,\n UpdatedConditionsData,\n} from '../types';\n\nexport const uniqBy = (arr: string[], iteratee: (arg: string) => any) => {\n return arr.filter(\n (x, i, self) => i === self.findIndex(y => iteratee(x) === iteratee(y)),\n );\n};\n\nexport const getRoleData = (values: RoleFormValues): Role => {\n return {\n memberReferences: values.selectedMembers.map(\n (mem: SelectedMember) => mem.ref,\n ),\n name: `${values.kind}:${values.namespace}/${values.name}`,\n metadata: {\n description: values.description,\n },\n };\n};\n\nexport const validationSchema = yup.object({\n name: yup.string().required('Name is required'),\n selectedMembers: yup.array().min(1, 'No member selected'),\n permissionPoliciesRows: yup.array().of(\n yup.object().shape({\n plugin: yup.string().required('Plugin is required'),\n permission: yup.string().required('Permission is required'),\n }),\n ),\n});\n\nexport const getMembersCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'hasMember') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getParentGroupsCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'childOf') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getChildGroupsCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'parentOf') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getPermissionPolicies = (\n policies: PolicyDetails[],\n): PermissionPolicies => {\n return policies.reduce(\n (ppsAcc: PermissionPolicies, policy: PolicyDetails) => {\n const permission = isResourcedPolicy(policy)\n ? (policy as ResourcedPolicy).resourceType\n : policy.name;\n return {\n ...ppsAcc,\n [permission]: policies.reduce(\n (policiesAcc: { policies: string[]; isResourced: boolean }, pol) => {\n const perm = isResourcedPolicy(pol)\n ? (pol as ResourcedPolicy).resourceType\n : pol.name;\n if (permission === perm)\n return {\n policies: uniqBy(\n [...policiesAcc.policies, getTitleCase(pol.policy as string)],\n val => val,\n ),\n isResourced: isResourcedPolicy(pol),\n };\n return policiesAcc;\n },\n { policies: [], isResourced: false },\n ),\n };\n },\n {},\n );\n};\n\nexport const getPluginsPermissionPoliciesData = (\n pluginsPermissionPolicies: PluginPermissionMetaData[],\n): PluginsPermissionPoliciesData => {\n const plugins: string[] = pluginsPermissionPolicies.map(\n pluginPp => pluginPp.pluginId,\n );\n const pluginsPermissions = pluginsPermissionPolicies.reduce(\n (acc: PluginsPermissions, pp, index) => {\n const permissions = pp.policies.reduce((plcAcc: string[], plc) => {\n const permission = isResourcedPolicy(plc)\n ? (plc as ResourcedPolicy).resourceType\n : plc.name;\n return [...plcAcc, permission];\n }, []);\n return {\n ...acc,\n [plugins[index]]: {\n permissions: uniqBy(permissions ?? [], val => val),\n policies: {\n ...(pp.policies ? getPermissionPolicies(pp.policies) : {}),\n },\n },\n };\n },\n {},\n );\n return { plugins, pluginsPermissions };\n};\n\nexport const getPermissionPoliciesData = (\n values: RoleFormValues,\n): RoleBasedPolicy[] => {\n const { kind, name, namespace, permissionPoliciesRows } = values;\n\n return permissionPoliciesRows.reduce(\n (acc: RoleBasedPolicy[], permissionPolicyRow) => {\n const { permission, policies, conditions } = permissionPolicyRow;\n const permissionPoliciesData = policies.reduce(\n (pAcc: RoleBasedPolicy[], policy) => {\n if (policy.effect === 'allow' && !conditions) {\n return [\n ...pAcc,\n {\n entityReference: `${kind}:${namespace}/${name}`,\n permission: `${permission}`,\n policy: policy.policy.toLocaleLowerCase('en-US'),\n effect: 'allow',\n },\n ];\n }\n return pAcc;\n },\n [],\n );\n return [...acc, ...permissionPoliciesData];\n },\n [],\n );\n};\n\nexport const getConditionalPermissionPoliciesData = (\n values: RoleFormValues,\n) => {\n const { kind, name, namespace, permissionPoliciesRows } = values;\n\n return permissionPoliciesRows.reduce(\n (acc: RoleBasedConditions[], permissionPolicyRow: PermissionsData) => {\n const { permission, policies, isResourced, plugin, conditions } =\n permissionPolicyRow;\n const permissionMapping = policies.reduce((pAcc: string[], policy) => {\n if (policy.effect === 'allow') {\n return [...pAcc, policy.policy.toLocaleLowerCase('en-US')];\n }\n return pAcc;\n }, []);\n return isResourced && conditions\n ? [\n ...acc,\n {\n result: 'CONDITIONAL',\n roleEntityRef: `${kind}:${namespace}/${name}`,\n pluginId: `${plugin}`,\n resourceType: `${permission}`,\n permissionMapping,\n conditions:\n Object.keys(conditions)[0] === criterias.condition\n ? { ...conditions.condition }\n : conditions,\n } as RoleBasedConditions,\n ]\n : acc;\n },\n [] as RoleBasedConditions[],\n );\n};\n\nexport const getUpdatedConditionalPolicies = (\n values: RoleFormValues,\n initialValues: RoleFormValues,\n): UpdatedConditionsData => {\n const initialConditionsWithId = initialValues.permissionPoliciesRows.filter(\n ppr => ppr.id,\n );\n\n const conditionsWithId = values.permissionPoliciesRows.filter(ppr => ppr.id);\n\n return conditionsWithId.length > 0\n ? conditionsWithId.reduce(\n (\n acc: { id: number; updateCondition: RoleBasedConditions }[],\n condition: PermissionsData,\n ) => {\n const conditionExists = initialConditionsWithId.find(\n c => c.id === condition.id,\n );\n\n if (conditionExists && condition.id)\n return [\n ...acc,\n {\n id: condition.id,\n updateCondition: getConditionalPermissionPoliciesData({\n ...values,\n permissionPoliciesRows: [condition],\n })[0],\n },\n ];\n return acc;\n },\n [],\n )\n : [];\n};\n\nexport const getNewConditionalPolicies = (values: RoleFormValues) => {\n const newValues = { ...values };\n const newPermissionPolicies = values.permissionPoliciesRows.filter(\n ppr => !ppr.id,\n );\n newValues.permissionPoliciesRows = newPermissionPolicies;\n return getConditionalPermissionPoliciesData(newValues);\n};\n\nexport const getRemovedConditionalPoliciesIds = (\n values: RoleFormValues,\n initialValues: RoleFormValues,\n) => {\n const initialConditionsIds = initialValues.permissionPoliciesRows\n .map(ppr => ppr.id)\n .filter(id => id);\n\n const newConditionsIds = values.permissionPoliciesRows\n .map(ppr => ppr.id)\n .filter(id => id);\n\n return initialConditionsIds.length > 0\n ? initialConditionsIds.reduce((acc: number[], oldId) => {\n const conditionExists = newConditionsIds.includes(oldId);\n if (conditionExists) return acc;\n return oldId ? [...acc, oldId] : acc;\n }, [])\n : [];\n};\n\nexport const getPermissionsNumber = (values: RoleFormValues) => {\n return (\n getPermissionPoliciesData(values).length +\n getConditionalPermissionPoliciesData(values).length\n );\n};\n\nexport const getConditionsNumber = (values: RoleFormValues) => {\n return getConditionalPermissionPoliciesData(values)?.length ?? 0;\n};\n\nexport const getRulesNumber = (conditions?: ConditionsData) => {\n if (!conditions) return 0;\n let rulesNumber = 0;\n\n if (conditions.allOf) {\n rulesNumber += conditions.allOf.reduce((acc, condition) => {\n return acc + getRulesNumber(condition as ConditionsData);\n }, 0);\n }\n\n if (conditions.anyOf) {\n rulesNumber += conditions.anyOf.reduce((acc, condition) => {\n return acc + getRulesNumber(condition as ConditionsData);\n }, 0);\n }\n\n if (conditions.not) {\n rulesNumber += getRulesNumber(conditions.not as ConditionsData);\n }\n\n if (conditions.condition || Object.keys(conditions).includes('rule')) {\n rulesNumber += 1;\n }\n\n return rulesNumber;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-role-utils.esm.js","sources":["../../src/utils/create-role-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { getTitleCase } from '@janus-idp/shared-react';\nimport * as yup from 'yup';\n\nimport {\n isResourcedPolicy,\n PluginPermissionMetaData,\n PolicyDetails,\n ResourcedPolicy,\n Role,\n RoleBasedPolicy,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { criterias } from '../components/ConditionalAccess/const';\nimport { ConditionsData } from '../components/ConditionalAccess/types';\nimport {\n PermissionPolicies,\n PluginsPermissionPoliciesData,\n PluginsPermissions,\n RoleFormValues,\n SelectedMember,\n} from '../components/CreateRole/types';\nimport {\n MemberEntity,\n PermissionsData,\n RoleBasedConditions,\n UpdatedConditionsData,\n} from '../types';\n\nexport const uniqBy = (arr: string[], iteratee: (arg: string) => any) => {\n return arr.filter(\n (x, i, self) => i === self.findIndex(y => iteratee(x) === iteratee(y)),\n );\n};\n\nexport const getRoleData = (values: RoleFormValues): Role => {\n return {\n memberReferences: values.selectedMembers.map(\n (mem: SelectedMember) => mem.ref,\n ),\n name: `${values.kind}:${values.namespace}/${values.name}`,\n metadata: {\n description: values.description,\n },\n };\n};\n\nexport const validationSchema = yup.object({\n name: yup.string().required('Name is required'),\n selectedMembers: yup.array().min(1, 'No member selected'),\n permissionPoliciesRows: yup.array().of(\n yup.object().shape({\n plugin: yup.string().required('Plugin is required'),\n permission: yup.string().required('Permission is required'),\n }),\n ),\n});\n\nexport const getMembersCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'hasMember') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getParentGroupsCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'childOf') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getChildGroupsCount = (member: MemberEntity) => {\n return member.kind === 'Group'\n ? member.relations?.reduce((acc: any, relation: { type: string }) => {\n let temp = acc;\n if (relation.type === 'parentOf') {\n temp++;\n }\n return temp;\n }, 0)\n : undefined;\n};\n\nexport const getPermissionPolicies = (\n policies: PolicyDetails[],\n): PermissionPolicies => {\n return policies.reduce(\n (ppsAcc: PermissionPolicies, policy: PolicyDetails) => {\n const permission = isResourcedPolicy(policy)\n ? (policy as ResourcedPolicy).resourceType\n : policy.name;\n return {\n ...ppsAcc,\n [permission]: policies.reduce(\n (policiesAcc: { policies: string[]; isResourced: boolean }, pol) => {\n const perm = isResourcedPolicy(pol)\n ? (pol as ResourcedPolicy).resourceType\n : pol.name;\n if (permission === perm)\n return {\n policies: uniqBy(\n [...policiesAcc.policies, getTitleCase(pol.policy as string)],\n val => val,\n ),\n isResourced: isResourcedPolicy(pol),\n };\n return policiesAcc;\n },\n { policies: [], isResourced: false },\n ),\n };\n },\n {},\n );\n};\n\nexport const getPluginsPermissionPoliciesData = (\n pluginsPermissionPolicies: PluginPermissionMetaData[],\n): PluginsPermissionPoliciesData => {\n const plugins: string[] = pluginsPermissionPolicies.map(\n pluginPp => pluginPp.pluginId,\n );\n const pluginsPermissions = pluginsPermissionPolicies.reduce(\n (acc: PluginsPermissions, pp, index) => {\n const permissions = pp.policies.reduce((plcAcc: string[], plc) => {\n const permission = isResourcedPolicy(plc)\n ? (plc as ResourcedPolicy).resourceType\n : plc.name;\n return [...plcAcc, permission];\n }, []);\n return {\n ...acc,\n [plugins[index]]: {\n permissions: uniqBy(permissions ?? [], val => val),\n policies: {\n ...(pp.policies ? getPermissionPolicies(pp.policies) : {}),\n },\n },\n };\n },\n {},\n );\n return { plugins, pluginsPermissions };\n};\n\nexport const getPermissionPoliciesData = (\n values: RoleFormValues,\n): RoleBasedPolicy[] => {\n const { kind, name, namespace, permissionPoliciesRows } = values;\n\n return permissionPoliciesRows.reduce(\n (acc: RoleBasedPolicy[], permissionPolicyRow) => {\n const { permission, policies, conditions } = permissionPolicyRow;\n const permissionPoliciesData = policies.reduce(\n (pAcc: RoleBasedPolicy[], policy) => {\n if (policy.effect === 'allow' && !conditions) {\n return [\n ...pAcc,\n {\n entityReference: `${kind}:${namespace}/${name}`,\n permission: `${permission}`,\n policy: policy.policy.toLocaleLowerCase('en-US'),\n effect: 'allow',\n },\n ];\n }\n return pAcc;\n },\n [],\n );\n return [...acc, ...permissionPoliciesData];\n },\n [],\n );\n};\n\nexport const getConditionalPermissionPoliciesData = (\n values: RoleFormValues,\n) => {\n const { kind, name, namespace, permissionPoliciesRows } = values;\n\n return permissionPoliciesRows.reduce(\n (acc: RoleBasedConditions[], permissionPolicyRow: PermissionsData) => {\n const { permission, policies, isResourced, plugin, conditions } =\n permissionPolicyRow;\n const permissionMapping = policies.reduce((pAcc: string[], policy) => {\n if (policy.effect === 'allow') {\n return [...pAcc, policy.policy.toLocaleLowerCase('en-US')];\n }\n return pAcc;\n }, []);\n return isResourced && conditions\n ? [\n ...acc,\n {\n result: 'CONDITIONAL',\n roleEntityRef: `${kind}:${namespace}/${name}`,\n pluginId: `${plugin}`,\n resourceType: `${permission}`,\n permissionMapping,\n conditions:\n Object.keys(conditions)[0] === criterias.condition\n ? { ...conditions.condition }\n : conditions,\n } as RoleBasedConditions,\n ]\n : acc;\n },\n [] as RoleBasedConditions[],\n );\n};\n\nexport const getUpdatedConditionalPolicies = (\n values: RoleFormValues,\n initialValues: RoleFormValues,\n): UpdatedConditionsData => {\n const initialConditionsWithId = initialValues.permissionPoliciesRows.filter(\n ppr => ppr.id,\n );\n\n const conditionsWithId = values.permissionPoliciesRows.filter(ppr => ppr.id);\n\n return conditionsWithId.length > 0\n ? conditionsWithId.reduce(\n (\n acc: { id: number; updateCondition: RoleBasedConditions }[],\n condition: PermissionsData,\n ) => {\n const conditionExists = initialConditionsWithId.find(\n c => c.id === condition.id,\n );\n\n if (conditionExists && condition.id)\n return [\n ...acc,\n {\n id: condition.id,\n updateCondition: getConditionalPermissionPoliciesData({\n ...values,\n permissionPoliciesRows: [condition],\n })[0],\n },\n ];\n return acc;\n },\n [],\n )\n : [];\n};\n\nexport const getNewConditionalPolicies = (values: RoleFormValues) => {\n const newValues = { ...values };\n const newPermissionPolicies = values.permissionPoliciesRows.filter(\n ppr => !ppr.id,\n );\n newValues.permissionPoliciesRows = newPermissionPolicies;\n return getConditionalPermissionPoliciesData(newValues);\n};\n\nexport const getRemovedConditionalPoliciesIds = (\n values: RoleFormValues,\n initialValues: RoleFormValues,\n) => {\n const initialConditionsIds = initialValues.permissionPoliciesRows\n .map(ppr => ppr.id)\n .filter(id => id);\n\n const newConditionsIds = values.permissionPoliciesRows\n .map(ppr => ppr.id)\n .filter(id => id);\n\n return initialConditionsIds.length > 0\n ? initialConditionsIds.reduce((acc: number[], oldId) => {\n const conditionExists = newConditionsIds.includes(oldId);\n if (conditionExists) return acc;\n return oldId ? [...acc, oldId] : acc;\n }, [])\n : [];\n};\n\nexport const getPermissionsNumber = (values: RoleFormValues) => {\n return (\n getPermissionPoliciesData(values).length +\n getConditionalPermissionPoliciesData(values).length\n );\n};\n\nexport const getConditionsNumber = (values: RoleFormValues) => {\n return getConditionalPermissionPoliciesData(values)?.length ?? 0;\n};\n\nexport const getRulesNumber = (conditions?: ConditionsData) => {\n if (!conditions) return 0;\n let rulesNumber = 0;\n\n if (conditions.allOf) {\n rulesNumber += conditions.allOf.reduce((acc, condition) => {\n return acc + getRulesNumber(condition as ConditionsData);\n }, 0);\n }\n\n if (conditions.anyOf) {\n rulesNumber += conditions.anyOf.reduce((acc, condition) => {\n return acc + getRulesNumber(condition as ConditionsData);\n }, 0);\n }\n\n if (conditions.not) {\n rulesNumber += getRulesNumber(conditions.not as ConditionsData);\n }\n\n if (conditions.condition || Object.keys(conditions).includes('rule')) {\n rulesNumber += 1;\n }\n\n return rulesNumber;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac-utils.esm.js","sources":["../../src/utils/rbac-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n GroupEntity,\n isUserEntity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n AllOfCriteria,\n AnyOfCriteria,\n NotCriteria,\n PermissionCondition,\n PermissionCriteria,\n} from '@backstage/plugin-permission-common';\n\nimport { getTitleCase } from '@janus-idp/shared-react';\n\nimport {\n isResourcedPolicy,\n PermissionAction,\n PluginPermissionMetaData,\n PolicyDetails,\n RoleBasedPolicy,\n RoleConditionalPolicyDecision,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { criterias } from '../components/ConditionalAccess/const';\nimport { ConditionsData } from '../components/ConditionalAccess/types';\nimport {\n PluginsPermissionPoliciesData,\n RowPolicy,\n SelectedMember,\n} from '../components/CreateRole/types';\nimport {\n MemberEntity,\n MembersData,\n PermissionsData,\n PermissionsDataSet,\n} from '../types';\nimport { getMembersCount } from './create-role-utils';\n\nexport const getPermissionsArray = (\n role: string,\n policies: RoleBasedPolicy[],\n): RoleBasedPolicy[] => {\n if (!policies || policies?.length === 0 || !Array.isArray(policies)) {\n return [];\n }\n return policies.filter(\n (policy: RoleBasedPolicy) =>\n policy.entityReference === role && policy.effect !== 'deny',\n );\n};\n\nexport const getPermissions = (\n role: string,\n policies: RoleBasedPolicy[],\n): number => {\n return getPermissionsArray(role, policies).length;\n};\n\nexport const getMembersString = (res: {\n users: number;\n groups: number;\n}): string => {\n let membersString = '';\n if (res.groups > 0) {\n membersString = `${res.groups} ${res.groups > 1 ? 'groups' : 'group'}`;\n }\n if (res.users > 0) {\n membersString = membersString.concat(\n membersString.length > 0 ? ', ' : '',\n `${res.users} ${res.users > 1 ? 'users' : 'user'}`,\n );\n }\n return membersString;\n};\n\nexport const getMembers = (\n members: (string | MembersData | SelectedMember)[],\n): string => {\n if (!members || members.length === 0) {\n return 'No members';\n }\n\n const res = members.reduce(\n (acc, member) => {\n if (typeof member === 'object') {\n if (member.type === 'User' || member.type === 'user') {\n acc.users++;\n } else {\n acc.groups++;\n }\n } else {\n const entity = parseEntityRef(member) as any;\n if (isUserEntity(entity)) {\n acc.users++;\n } else {\n acc.groups++;\n }\n }\n return acc;\n },\n { users: 0, groups: 0 },\n );\n\n return getMembersString(res);\n};\n\nexport const getMembersFromGroup = (group: GroupEntity): number => {\n const membersList = group.relations?.reduce((acc, relation) => {\n let temp = acc;\n if (relation.type === 'hasMember') {\n temp++;\n }\n return temp;\n }, 0);\n return membersList ?? 0;\n};\n\nexport const getPluginInfo = (\n permissions: PluginPermissionMetaData[],\n permissionName?: string,\n): { pluginId: string; isResourced: boolean } =>\n permissions.reduce(\n (\n acc: { pluginId: string; isResourced: boolean },\n p: PluginPermissionMetaData,\n ) => {\n const policy = p.policies.find(pol => {\n if (pol.name === permissionName) {\n return true;\n }\n if (isResourcedPolicy(pol)) {\n return pol.resourceType === permissionName;\n }\n return false;\n });\n if (policy) {\n return {\n pluginId: p.pluginId || '-',\n isResourced: isResourcedPolicy(policy) || false,\n };\n }\n return acc;\n },\n { pluginId: '-', isResourced: false },\n );\n\nconst getPolicy = (str: string) => {\n const arr = str.split('.');\n return arr[arr.length - 1];\n};\n\nconst getAllPolicies = (\n permission: string,\n allowedPolicies: RowPolicy[],\n policies: PolicyDetails[],\n) => {\n const deniedPolicies = policies?.reduce((acc, p) => {\n const perm = isResourcedPolicy(p) ? p.resourceType : p.name;\n if (\n permission === perm &&\n !allowedPolicies.find(\n allowedPolicy =>\n allowedPolicy.policy.toLocaleLowerCase('en-US') ===\n p.policy?.toLocaleLowerCase('en-US'),\n )\n ) {\n acc.push({\n policy: getTitleCase(p.policy) || 'Use',\n effect: 'deny',\n });\n }\n return acc;\n }, [] as RowPolicy[]);\n return [...(allowedPolicies || []), ...(deniedPolicies || [])];\n};\n\nexport const getPermissionsData = (\n policies: RoleBasedPolicy[],\n permissionPolicies: PluginPermissionMetaData[],\n): PermissionsData[] => {\n const data = policies.reduce(\n (acc: PermissionsDataSet[], policy: RoleBasedPolicy) => {\n if (policy?.effect === 'allow') {\n const policyStr =\n policy?.policy ?? getPolicy(policy.permission as string);\n const policyTitleCase = getTitleCase(policyStr);\n const permission = acc.find(\n plugin =>\n plugin.permission === policy.permission &&\n !plugin.policies.has({\n policy: policyTitleCase || 'Use',\n effect: 'allow',\n }),\n );\n if (permission) {\n permission.policyString?.add(\n policyTitleCase ? `, ${policyTitleCase}` : ', Use',\n );\n permission.policies.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n });\n } else {\n const policyString = new Set<string>();\n const policiesSet = new Set<{ policy: string; effect: string }>();\n acc.push({\n permission: policy.permission ?? '-',\n plugin: getPluginInfo(permissionPolicies, policy?.permission)\n .pluginId,\n policyString: policyString.add(policyTitleCase || 'Use'),\n policies: policiesSet.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n }),\n isResourced: getPluginInfo(permissionPolicies, policy?.permission)\n .isResourced,\n });\n }\n }\n return acc;\n },\n [],\n );\n return data.map((p: PermissionsDataSet) => ({\n ...p,\n ...(p.policyString ? { policyString: Array.from(p.policyString) } : {}),\n policies: getAllPolicies(\n p.permission,\n Array.from(p.policies),\n permissionPolicies.find(pp => pp.pluginId === p.plugin)\n ?.policies as PolicyDetails[],\n ),\n })) as PermissionsData[];\n};\n\nexport const getConditionUpperCriteria = (\n conditions: PermissionCriteria<PermissionCondition> | string,\n): string | undefined => {\n return Object.keys(conditions).find(key =>\n [criterias.allOf, criterias.anyOf, criterias.not].includes(\n key as keyof ConditionsData,\n ),\n );\n};\n\nexport const getConditionsData = (\n conditions: PermissionCriteria<PermissionCondition>,\n): ConditionsData | undefined => {\n const upperCriteria =\n getConditionUpperCriteria(conditions) ?? criterias.condition;\n\n switch (upperCriteria) {\n case criterias.allOf: {\n const allOfConditions = (conditions as AllOfCriteria<PermissionCondition>)\n .allOf;\n allOfConditions.map(aoc => {\n if (getConditionUpperCriteria(aoc)) {\n return getConditionsData(aoc);\n }\n return aoc;\n });\n return { allOf: allOfConditions as PermissionCondition[] };\n }\n case criterias.anyOf: {\n const anyOfConditions = (conditions as AnyOfCriteria<PermissionCondition>)\n .anyOf;\n anyOfConditions.map(aoc => {\n if (getConditionUpperCriteria(aoc)) {\n return getConditionsData(aoc);\n }\n return aoc;\n });\n return { anyOf: anyOfConditions as PermissionCondition[] };\n }\n case criterias.not: {\n const notCondition = (conditions as NotCriteria<PermissionCondition>).not;\n const nestedCondition = getConditionUpperCriteria(notCondition)\n ? getConditionsData(notCondition)\n : notCondition;\n return { not: nestedCondition as PermissionCondition };\n }\n default:\n return { condition: conditions as PermissionCondition };\n }\n};\n\nexport const getPoliciesData = (\n allowedPermissions: string[],\n policies: string[],\n): RowPolicy[] => {\n return policies.map(p => ({\n policy: p,\n ...(allowedPermissions.includes(p.toLocaleLowerCase('en-US'))\n ? { effect: 'allow' }\n : { effect: 'deny' }),\n }));\n};\n\nexport const getConditionalPermissionsData = (\n conditionalPermissions: RoleConditionalPolicyDecision<PermissionAction>[],\n permissionPolicies: PluginsPermissionPoliciesData,\n): PermissionsData[] => {\n return conditionalPermissions.reduce((acc: any, cp) => {\n const conditions = getConditionsData(cp.conditions);\n const allPolicies =\n permissionPolicies.pluginsPermissions?.[cp.pluginId]?.policies?.[\n cp.resourceType\n ]?.policies ?? [];\n const allowedPermissions = cp.permissionMapping.map(action =>\n action.toLocaleLowerCase('en-US'),\n );\n const policyString = allowedPermissions\n .map(p => p[0].toLocaleUpperCase('en-US') + p.slice(1))\n .join(', ');\n\n return [\n ...acc,\n ...(conditions\n ? [\n {\n plugin: cp.pluginId,\n permission: cp.resourceType,\n isResourced: true,\n policies: getPoliciesData(allowedPermissions, allPolicies),\n policyString,\n conditions,\n id: cp.id,\n },\n ]\n : []),\n ];\n }, []);\n};\n\nexport const getSelectedMember = (\n memberResource: MemberEntity | undefined,\n ref: string,\n): SelectedMember => {\n if (memberResource) {\n return {\n id: memberResource.metadata.etag as string,\n ref: stringifyEntityRef(memberResource),\n label:\n memberResource.spec.profile?.displayName ??\n memberResource.metadata.name,\n etag: memberResource.metadata.etag as string,\n type: memberResource.kind,\n namespace: memberResource.metadata.namespace as string,\n members: getMembersCount(memberResource),\n };\n } else if (ref) {\n const { kind, namespace, name } = parseEntityRef(ref);\n return {\n id: `${kind}-${namespace}-${name}`,\n ref,\n label: name,\n etag: `${kind}-${namespace}-${name}`,\n type: kind,\n namespace: namespace,\n members: kind === 'group' ? 0 : undefined,\n };\n }\n return {} as SelectedMember;\n};\n\nexport const isSamePermissionPolicy = (\n a: RoleBasedPolicy,\n b: RoleBasedPolicy,\n) =>\n a.entityReference === b.entityReference &&\n a.permission === b.permission &&\n a.policy === b.policy &&\n a.effect === b.effect;\n\nexport const onlyInLeft = (\n left: RoleBasedPolicy[],\n right: RoleBasedPolicy[],\n compareFunction: (a: RoleBasedPolicy, b: RoleBasedPolicy) => boolean,\n) =>\n left.filter(\n leftValue =>\n !right.some(rightValue => compareFunction(leftValue, rightValue)),\n );\n"],"names":[],"mappings":";;;;;;AAuDa,MAAA,mBAAA,GAAsB,CACjC,IAAA,EACA,QACsB,KAAA;AACtB,EAAI,IAAA,CAAC,YAAY,QAAU,EAAA,MAAA,KAAW,KAAK,CAAC,KAAA,CAAM,OAAQ,CAAA,QAAQ,CAAG,EAAA;AACnE,IAAA,OAAO,EAAC;AAAA;AAEV,EAAA,OAAO,QAAS,CAAA,MAAA;AAAA,IACd,CAAC,MACC,KAAA,MAAA,CAAO,eAAoB,KAAA,IAAA,IAAQ,OAAO,MAAW,KAAA;AAAA,GACzD;AACF;AAEa,MAAA,cAAA,GAAiB,CAC5B,IAAA,EACA,QACW,KAAA;AACX,EAAO,OAAA,mBAAA,CAAoB,IAAM,EAAA,QAAQ,CAAE,CAAA,MAAA;AAC7C;AAEa,MAAA,gBAAA,GAAmB,CAAC,GAGnB,KAAA;AACZ,EAAA,IAAI,aAAgB,GAAA,EAAA;AACpB,EAAI,IAAA,GAAA,CAAI,SAAS,CAAG,EAAA;AAClB,IAAgB,aAAA,GAAA,CAAA,EAAG,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,MAAS,GAAA,CAAA,GAAI,WAAW,OAAO,CAAA,CAAA;AAAA;AAEtE,EAAI,IAAA,GAAA,CAAI,QAAQ,CAAG,EAAA;AACjB,IAAA,aAAA,GAAgB,aAAc,CAAA,MAAA;AAAA,MAC5B,aAAA,CAAc,MAAS,GAAA,CAAA,GAAI,IAAO,GAAA,EAAA;AAAA,MAClC,CAAA,EAAG,IAAI,KAAK,CAAA,CAAA,EAAI,IAAI,KAAQ,GAAA,CAAA,GAAI,UAAU,MAAM,CAAA;AAAA,KAClD;AAAA;AAEF,EAAO,OAAA,aAAA;AACT;AAEa,MAAA,UAAA,GAAa,CACxB,OACW,KAAA;AACX,EAAA,IAAI,CAAC,OAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,CAAG,EAAA;AACpC,IAAO,OAAA,YAAA;AAAA;AAGT,EAAA,MAAM,MAAM,OAAQ,CAAA,MAAA;AAAA,IAClB,CAAC,KAAK,MAAW,KAAA;AACf,MAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,QAAA,IAAI,MAAO,CAAA,IAAA,KAAS,MAAU,IAAA,MAAA,CAAO,SAAS,MAAQ,EAAA;AACpD,UAAI,GAAA,CAAA,KAAA,EAAA;AAAA,SACC,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,EAAA;AAAA;AACN,OACK,MAAA;AACL,QAAM,MAAA,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,QAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,UAAI,GAAA,CAAA,KAAA,EAAA;AAAA,SACC,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,EAAA;AAAA;AACN;AAEF,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA,EAAE,KAAA,EAAO,CAAG,EAAA,MAAA,EAAQ,CAAE;AAAA,GACxB;AAEA,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAEa,MAAA,mBAAA,GAAsB,CAAC,KAA+B,KAAA;AACjE,EAAA,MAAM,cAAc,KAAM,CAAA,SAAA,EAAW,MAAO,CAAA,CAAC,KAAK,QAAa,KAAA;AAC7D,IAAA,IAAI,IAAO,GAAA,GAAA;AACX,IAAI,IAAA,QAAA,CAAS,SAAS,WAAa,EAAA;AACjC,MAAA,IAAA,EAAA;AAAA;AAEF,IAAO,OAAA,IAAA;AAAA,KACN,CAAC,CAAA;AACJ,EAAA,OAAO,WAAe,IAAA,CAAA;AACxB;AAEO,MAAM,aAAgB,GAAA,CAC3B,WACA,EAAA,cAAA,KAEA,WAAY,CAAA,MAAA;AAAA,EACV,CACE,KACA,CACG,KAAA;AACH,IAAA,MAAM,MAAS,GAAA,CAAA,CAAE,QAAS,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACpC,MAAI,IAAA,GAAA,CAAI,SAAS,cAAgB,EAAA;AAC/B,QAAO,OAAA,IAAA;AAAA;AAET,MAAI,IAAA,iBAAA,CAAkB,GAAG,CAAG,EAAA;AAC1B,QAAA,OAAO,IAAI,YAAiB,KAAA,cAAA;AAAA;AAE9B,MAAO,OAAA,KAAA;AAAA,KACR,CAAA;AACD,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA;AAAA,QACL,QAAA,EAAU,EAAE,QAAY,IAAA,GAAA;AAAA,QACxB,WAAA,EAAa,iBAAkB,CAAA,MAAM,CAAK,IAAA;AAAA,OAC5C;AAAA;AAEF,IAAO,OAAA,GAAA;AAAA,GACT;AAAA,EACA,EAAE,QAAA,EAAU,GAAK,EAAA,WAAA,EAAa,KAAM;AACtC;AAEF,MAAM,SAAA,GAAY,CAAC,GAAgB,KAAA;AACjC,EAAM,MAAA,GAAA,GAAM,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA;AACzB,EAAO,OAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAC3B,CAAA;AAEA,MAAM,cAAiB,GAAA,CACrB,UACA,EAAA,eAAA,EACA,QACG,KAAA;AACH,EAAA,MAAM,cAAiB,GAAA,QAAA,EAAU,MAAO,CAAA,CAAC,KAAK,CAAM,KAAA;AAClD,IAAA,MAAM,OAAO,iBAAkB,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,eAAe,CAAE,CAAA,IAAA;AACvD,IACE,IAAA,UAAA,KAAe,IACf,IAAA,CAAC,eAAgB,CAAA,IAAA;AAAA,MACf,CAAA,aAAA,KACE,cAAc,MAAO,CAAA,iBAAA,CAAkB,OAAO,CAC9C,KAAA,CAAA,CAAE,MAAQ,EAAA,iBAAA,CAAkB,OAAO;AAAA,KAEvC,EAAA;AACA,MAAA,GAAA,CAAI,IAAK,CAAA;AAAA,QACP,MAAQ,EAAA,YAAA,CAAa,CAAE,CAAA,MAAM,CAAK,IAAA,KAAA;AAAA,QAClC,MAAQ,EAAA;AAAA,OACT,CAAA;AAAA;AAEH,IAAO,OAAA,GAAA;AAAA,GACT,EAAG,EAAiB,CAAA;AACpB,EAAO,OAAA,CAAC,GAAI,eAAmB,IAAA,IAAK,GAAI,cAAA,IAAkB,EAAG,CAAA;AAC/D,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,QAAA,EACA,kBACsB,KAAA;AACtB,EAAA,MAAM,OAAO,QAAS,CAAA,MAAA;AAAA,IACpB,CAAC,KAA2B,MAA4B,KAAA;AACtD,MAAI,IAAA,MAAA,EAAQ,WAAW,OAAS,EAAA;AAC9B,QAAA,MAAM,SACJ,GAAA,MAAA,EAAQ,MAAU,IAAA,SAAA,CAAU,OAAO,UAAoB,CAAA;AACzD,QAAM,MAAA,eAAA,GAAkB,aAAa,SAAS,CAAA;AAC9C,QAAA,MAAM,aAAa,GAAI,CAAA,IAAA;AAAA,UACrB,CAAA,MAAA,KACE,OAAO,UAAe,KAAA,MAAA,CAAO,cAC7B,CAAC,MAAA,CAAO,SAAS,GAAI,CAAA;AAAA,YACnB,QAAQ,eAAmB,IAAA,KAAA;AAAA,YAC3B,MAAQ,EAAA;AAAA,WACT;AAAA,SACL;AACA,QAAA,IAAI,UAAY,EAAA;AACd,UAAA,UAAA,CAAW,YAAc,EAAA,GAAA;AAAA,YACvB,eAAA,GAAkB,CAAK,EAAA,EAAA,eAAe,CAAK,CAAA,GAAA;AAAA,WAC7C;AACA,UAAA,UAAA,CAAW,SAAS,GAAI,CAAA;AAAA,YACtB,QAAQ,eAAmB,IAAA,KAAA;AAAA,YAC3B,QAAQ,MAAO,CAAA;AAAA,WAChB,CAAA;AAAA,SACI,MAAA;AACL,UAAM,MAAA,YAAA,uBAAmB,GAAY,EAAA;AACrC,UAAM,MAAA,WAAA,uBAAkB,GAAwC,EAAA;AAChE,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,UAAA,EAAY,OAAO,UAAc,IAAA,GAAA;AAAA,YACjC,MAAQ,EAAA,aAAA,CAAc,kBAAoB,EAAA,MAAA,EAAQ,UAAU,CACzD,CAAA,QAAA;AAAA,YACH,YAAc,EAAA,YAAA,CAAa,GAAI,CAAA,eAAA,IAAmB,KAAK,CAAA;AAAA,YACvD,QAAA,EAAU,YAAY,GAAI,CAAA;AAAA,cACxB,QAAQ,eAAmB,IAAA,KAAA;AAAA,cAC3B,QAAQ,MAAO,CAAA;AAAA,aAChB,CAAA;AAAA,YACD,WAAa,EAAA,aAAA,CAAc,kBAAoB,EAAA,MAAA,EAAQ,UAAU,CAC9D,CAAA;AAAA,WACJ,CAAA;AAAA;AACH;AAEF,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AACA,EAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAA2B,MAAA;AAAA,IAC1C,GAAG,CAAA;AAAA,IACH,GAAI,CAAE,CAAA,YAAA,GAAe,EAAE,YAAA,EAAc,KAAM,CAAA,IAAA,CAAK,CAAE,CAAA,YAAY,CAAE,EAAA,GAAI,EAAC;AAAA,IACrE,QAAU,EAAA,cAAA;AAAA,MACR,CAAE,CAAA,UAAA;AAAA,MACF,KAAA,CAAM,IAAK,CAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,MACrB,mBAAmB,IAAK,CAAA,CAAA,EAAA,KAAM,GAAG,QAAa,KAAA,CAAA,CAAE,MAAM,CAClD,EAAA;AAAA;AACN,GACA,CAAA,CAAA;AACJ;AAEa,MAAA,yBAAA,GAA4B,CACvC,UACuB,KAAA;AACvB,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAE,CAAA,IAAA;AAAA,IAAK,CAAA,GAAA,KAClC,CAAC,SAAU,CAAA,KAAA,EAAO,UAAU,KAAO,EAAA,SAAA,CAAU,GAAG,CAAE,CAAA,QAAA;AAAA,MAChD;AAAA;AACF,GACF;AACF;AAEa,MAAA,iBAAA,GAAoB,CAC/B,UAC+B,KAAA;AAC/B,EAAA,MAAM,aACJ,GAAA,yBAAA,CAA0B,UAAU,CAAA,IAAK,SAAU,CAAA,SAAA;AAErD,EAAA,QAAQ,aAAe;AAAA,IACrB,KAAK,UAAU,KAAO,EAAA;AACpB,MAAA,MAAM,kBAAmB,UACtB,CAAA,KAAA;AACH,MAAA,eAAA,CAAgB,IAAI,CAAO,GAAA,KAAA;AACzB,QAAI,IAAA,yBAAA,CAA0B,GAAG,CAAG,EAAA;AAClC,UAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA;AAE9B,QAAO,OAAA,GAAA;AAAA,OACR,CAAA;AACD,MAAO,OAAA,EAAE,OAAO,eAAyC,EAAA;AAAA;AAC3D,IACA,KAAK,UAAU,KAAO,EAAA;AACpB,MAAA,MAAM,kBAAmB,UACtB,CAAA,KAAA;AACH,MAAA,eAAA,CAAgB,IAAI,CAAO,GAAA,KAAA;AACzB,QAAI,IAAA,yBAAA,CAA0B,GAAG,CAAG,EAAA;AAClC,UAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA;AAE9B,QAAO,OAAA,GAAA;AAAA,OACR,CAAA;AACD,MAAO,OAAA,EAAE,OAAO,eAAyC,EAAA;AAAA;AAC3D,IACA,KAAK,UAAU,GAAK,EAAA;AAClB,MAAA,MAAM,eAAgB,UAAgD,CAAA,GAAA;AACtE,MAAA,MAAM,kBAAkB,yBAA0B,CAAA,YAAY,CAC1D,GAAA,iBAAA,CAAkB,YAAY,CAC9B,GAAA,YAAA;AACJ,MAAO,OAAA,EAAE,KAAK,eAAuC,EAAA;AAAA;AACvD,IACA;AACE,MAAO,OAAA,EAAE,WAAW,UAAkC,EAAA;AAAA;AAE5D;AAEa,MAAA,eAAA,GAAkB,CAC7B,kBAAA,EACA,QACgB,KAAA;AAChB,EAAO,OAAA,QAAA,CAAS,IAAI,CAAM,CAAA,MAAA;AAAA,IACxB,MAAQ,EAAA,CAAA;AAAA,IACR,GAAI,kBAAA,CAAmB,QAAS,CAAA,CAAA,CAAE,kBAAkB,OAAO,CAAC,CACxD,GAAA,EAAE,MAAQ,EAAA,OAAA,EACV,GAAA,EAAE,QAAQ,MAAO;AAAA,GACrB,CAAA,CAAA;AACJ;AAEa,MAAA,6BAAA,GAAgC,CAC3C,sBAAA,EACA,kBACsB,KAAA;AACtB,EAAA,OAAO,sBAAuB,CAAA,MAAA,CAAO,CAAC,GAAA,EAAU,EAAO,KAAA;AACrD,IAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,EAAA,CAAG,UAAU,CAAA;AAClD,IAAM,MAAA,WAAA,GACJ,kBAAmB,CAAA,kBAAA,GAAqB,EAAG,CAAA,QAAQ,CAAG,EAAA,QAAA,GACpD,EAAG,CAAA,YACL,CAAG,EAAA,QAAA,IAAY,EAAC;AAClB,IAAM,MAAA,kBAAA,GAAqB,GAAG,iBAAkB,CAAA,GAAA;AAAA,MAAI,CAAA,MAAA,KAClD,MAAO,CAAA,iBAAA,CAAkB,OAAO;AAAA,KAClC;AACA,IAAA,MAAM,eAAe,kBAClB,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,CAAC,CAAE,CAAA,iBAAA,CAAkB,OAAO,CAAA,GAAI,EAAE,KAAM,CAAA,CAAC,CAAC,CAAA,CACrD,KAAK,IAAI,CAAA;AAEZ,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,GAAI,UACA,GAAA;AAAA,QACE;AAAA,UACE,QAAQ,EAAG,CAAA,QAAA;AAAA,UACX,YAAY,EAAG,CAAA,YAAA;AAAA,UACf,WAAa,EAAA,IAAA;AAAA,UACb,QAAA,EAAU,eAAgB,CAAA,kBAAA,EAAoB,WAAW,CAAA;AAAA,UACzD,YAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAI,EAAG,CAAA;AAAA;AACT,UAEF;AAAC,KACP;AAAA,GACF,EAAG,EAAE,CAAA;AACP;AAEa,MAAA,iBAAA,GAAoB,CAC/B,cAAA,EACA,GACmB,KAAA;AACnB,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,EAAA,EAAI,eAAe,QAAS,CAAA,IAAA;AAAA,MAC5B,GAAA,EAAK,mBAAmB,cAAc,CAAA;AAAA,MACtC,OACE,cAAe,CAAA,IAAA,CAAK,OAAS,EAAA,WAAA,IAC7B,eAAe,QAAS,CAAA,IAAA;AAAA,MAC1B,IAAA,EAAM,eAAe,QAAS,CAAA,IAAA;AAAA,MAC9B,MAAM,cAAe,CAAA,IAAA;AAAA,MACrB,SAAA,EAAW,eAAe,QAAS,CAAA,SAAA;AAAA,MACnC,OAAA,EAAS,gBAAgB,cAAc;AAAA,KACzC;AAAA,aACS,GAAK,EAAA;AACd,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,GAAG,CAAA;AACpD,IAAO,OAAA;AAAA,MACL,IAAI,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAChC,GAAA;AAAA,MACA,KAAO,EAAA,IAAA;AAAA,MACP,MAAM,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAClC,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA,EAAS,IAAS,KAAA,OAAA,GAAU,CAAI,GAAA,KAAA;AAAA,KAClC;AAAA;AAEF,EAAA,OAAO,EAAC;AACV;AAEO,MAAM,yBAAyB,CACpC,CAAA,EACA,MAEA,CAAE,CAAA,eAAA,KAAoB,EAAE,eACxB,IAAA,CAAA,CAAE,UAAe,KAAA,CAAA,CAAE,cACnB,CAAE,CAAA,MAAA,KAAW,EAAE,MACf,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA;AAEV,MAAM,UAAa,GAAA,CACxB,IACA,EAAA,KAAA,EACA,oBAEA,IAAK,CAAA,MAAA;AAAA,EACH,CAAA,SAAA,KACE,CAAC,KAAM,CAAA,IAAA,CAAK,gBAAc,eAAgB,CAAA,SAAA,EAAW,UAAU,CAAC;AACpE;;;;"}
|
|
1
|
+
{"version":3,"file":"rbac-utils.esm.js","sources":["../../src/utils/rbac-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n GroupEntity,\n isUserEntity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n AllOfCriteria,\n AnyOfCriteria,\n NotCriteria,\n PermissionCondition,\n PermissionCriteria,\n} from '@backstage/plugin-permission-common';\n\nimport { getTitleCase } from '@janus-idp/shared-react';\n\nimport {\n isResourcedPolicy,\n PermissionAction,\n PluginPermissionMetaData,\n PolicyDetails,\n RoleBasedPolicy,\n RoleConditionalPolicyDecision,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { criterias } from '../components/ConditionalAccess/const';\nimport { ConditionsData } from '../components/ConditionalAccess/types';\nimport {\n PluginsPermissionPoliciesData,\n RowPolicy,\n SelectedMember,\n} from '../components/CreateRole/types';\nimport {\n MemberEntity,\n MembersData,\n PermissionsData,\n PermissionsDataSet,\n} from '../types';\nimport { getMembersCount } from './create-role-utils';\n\nexport const getPermissionsArray = (\n role: string,\n policies: RoleBasedPolicy[],\n): RoleBasedPolicy[] => {\n if (!policies || policies?.length === 0 || !Array.isArray(policies)) {\n return [];\n }\n return policies.filter(\n (policy: RoleBasedPolicy) =>\n policy.entityReference === role && policy.effect !== 'deny',\n );\n};\n\nexport const getPermissions = (\n role: string,\n policies: RoleBasedPolicy[],\n): number => {\n return getPermissionsArray(role, policies).length;\n};\n\nexport const getMembersString = (res: {\n users: number;\n groups: number;\n}): string => {\n let membersString = '';\n if (res.groups > 0) {\n membersString = `${res.groups} ${res.groups > 1 ? 'groups' : 'group'}`;\n }\n if (res.users > 0) {\n membersString = membersString.concat(\n membersString.length > 0 ? ', ' : '',\n `${res.users} ${res.users > 1 ? 'users' : 'user'}`,\n );\n }\n return membersString;\n};\n\nexport const getMembers = (\n members: (string | MembersData | SelectedMember)[],\n): string => {\n if (!members || members.length === 0) {\n return 'No members';\n }\n\n const res = members.reduce(\n (acc, member) => {\n if (typeof member === 'object') {\n if (member.type === 'User' || member.type === 'user') {\n acc.users++;\n } else {\n acc.groups++;\n }\n } else {\n const entity = parseEntityRef(member) as any;\n if (isUserEntity(entity)) {\n acc.users++;\n } else {\n acc.groups++;\n }\n }\n return acc;\n },\n { users: 0, groups: 0 },\n );\n\n return getMembersString(res);\n};\n\nexport const getMembersFromGroup = (group: GroupEntity): number => {\n const membersList = group.relations?.reduce((acc, relation) => {\n let temp = acc;\n if (relation.type === 'hasMember') {\n temp++;\n }\n return temp;\n }, 0);\n return membersList ?? 0;\n};\n\nexport const getPluginInfo = (\n permissions: PluginPermissionMetaData[],\n permissionName?: string,\n): { pluginId: string; isResourced: boolean } =>\n permissions.reduce(\n (\n acc: { pluginId: string; isResourced: boolean },\n p: PluginPermissionMetaData,\n ) => {\n const policy = p.policies.find(pol => {\n if (pol.name === permissionName) {\n return true;\n }\n if (isResourcedPolicy(pol)) {\n return pol.resourceType === permissionName;\n }\n return false;\n });\n if (policy) {\n return {\n pluginId: p.pluginId || '-',\n isResourced: isResourcedPolicy(policy) || false,\n };\n }\n return acc;\n },\n { pluginId: '-', isResourced: false },\n );\n\nconst getPolicy = (str: string) => {\n const arr = str.split('.');\n return arr[arr.length - 1];\n};\n\nconst getAllPolicies = (\n permission: string,\n allowedPolicies: RowPolicy[],\n policies: PolicyDetails[],\n) => {\n const deniedPolicies = policies?.reduce((acc, p) => {\n const perm = isResourcedPolicy(p) ? p.resourceType : p.name;\n if (\n permission === perm &&\n !allowedPolicies.find(\n allowedPolicy =>\n allowedPolicy.policy.toLocaleLowerCase('en-US') ===\n p.policy?.toLocaleLowerCase('en-US'),\n )\n ) {\n acc.push({\n policy: getTitleCase(p.policy) || 'Use',\n effect: 'deny',\n });\n }\n return acc;\n }, [] as RowPolicy[]);\n return [...(allowedPolicies || []), ...(deniedPolicies || [])];\n};\n\nexport const getPermissionsData = (\n policies: RoleBasedPolicy[],\n permissionPolicies: PluginPermissionMetaData[],\n): PermissionsData[] => {\n const data = policies.reduce(\n (acc: PermissionsDataSet[], policy: RoleBasedPolicy) => {\n if (policy?.effect === 'allow') {\n const policyStr =\n policy?.policy ?? getPolicy(policy.permission as string);\n const policyTitleCase = getTitleCase(policyStr);\n const permission = acc.find(\n plugin =>\n plugin.permission === policy.permission &&\n !plugin.policies.has({\n policy: policyTitleCase || 'Use',\n effect: 'allow',\n }),\n );\n if (permission) {\n permission.policyString?.add(\n policyTitleCase ? `, ${policyTitleCase}` : ', Use',\n );\n permission.policies.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n });\n } else {\n const policyString = new Set<string>();\n const policiesSet = new Set<{ policy: string; effect: string }>();\n acc.push({\n permission: policy.permission ?? '-',\n plugin: getPluginInfo(permissionPolicies, policy?.permission)\n .pluginId,\n policyString: policyString.add(policyTitleCase || 'Use'),\n policies: policiesSet.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n }),\n isResourced: getPluginInfo(permissionPolicies, policy?.permission)\n .isResourced,\n });\n }\n }\n return acc;\n },\n [],\n );\n return data.map((p: PermissionsDataSet) => ({\n ...p,\n ...(p.policyString ? { policyString: Array.from(p.policyString) } : {}),\n policies: getAllPolicies(\n p.permission,\n Array.from(p.policies),\n permissionPolicies.find(pp => pp.pluginId === p.plugin)\n ?.policies as PolicyDetails[],\n ),\n })) as PermissionsData[];\n};\n\nexport const getConditionUpperCriteria = (\n conditions: PermissionCriteria<PermissionCondition> | string,\n): string | undefined => {\n return Object.keys(conditions).find(key =>\n [criterias.allOf, criterias.anyOf, criterias.not].includes(\n key as keyof ConditionsData,\n ),\n );\n};\n\nexport const getConditionsData = (\n conditions: PermissionCriteria<PermissionCondition>,\n): ConditionsData | undefined => {\n const upperCriteria =\n getConditionUpperCriteria(conditions) ?? criterias.condition;\n\n switch (upperCriteria) {\n case criterias.allOf: {\n const allOfConditions = (conditions as AllOfCriteria<PermissionCondition>)\n .allOf;\n allOfConditions.map(aoc => {\n if (getConditionUpperCriteria(aoc)) {\n return getConditionsData(aoc);\n }\n return aoc;\n });\n return { allOf: allOfConditions as PermissionCondition[] };\n }\n case criterias.anyOf: {\n const anyOfConditions = (conditions as AnyOfCriteria<PermissionCondition>)\n .anyOf;\n anyOfConditions.map(aoc => {\n if (getConditionUpperCriteria(aoc)) {\n return getConditionsData(aoc);\n }\n return aoc;\n });\n return { anyOf: anyOfConditions as PermissionCondition[] };\n }\n case criterias.not: {\n const notCondition = (conditions as NotCriteria<PermissionCondition>).not;\n const nestedCondition = getConditionUpperCriteria(notCondition)\n ? getConditionsData(notCondition)\n : notCondition;\n return { not: nestedCondition as PermissionCondition };\n }\n default:\n return { condition: conditions as PermissionCondition };\n }\n};\n\nexport const getPoliciesData = (\n allowedPermissions: string[],\n policies: string[],\n): RowPolicy[] => {\n return policies.map(p => ({\n policy: p,\n ...(allowedPermissions.includes(p.toLocaleLowerCase('en-US'))\n ? { effect: 'allow' }\n : { effect: 'deny' }),\n }));\n};\n\nexport const getConditionalPermissionsData = (\n conditionalPermissions: RoleConditionalPolicyDecision<PermissionAction>[],\n permissionPolicies: PluginsPermissionPoliciesData,\n): PermissionsData[] => {\n return conditionalPermissions.reduce((acc: any, cp) => {\n const conditions = getConditionsData(cp.conditions);\n const allPolicies =\n permissionPolicies.pluginsPermissions?.[cp.pluginId]?.policies?.[\n cp.resourceType\n ]?.policies ?? [];\n const allowedPermissions = cp.permissionMapping.map(action =>\n action.toLocaleLowerCase('en-US'),\n );\n const policyString = allowedPermissions\n .map(p => p[0].toLocaleUpperCase('en-US') + p.slice(1))\n .join(', ');\n\n return [\n ...acc,\n ...(conditions\n ? [\n {\n plugin: cp.pluginId,\n permission: cp.resourceType,\n isResourced: true,\n policies: getPoliciesData(allowedPermissions, allPolicies),\n policyString,\n conditions,\n id: cp.id,\n },\n ]\n : []),\n ];\n }, []);\n};\n\nexport const getSelectedMember = (\n memberResource: MemberEntity | undefined,\n ref: string,\n): SelectedMember => {\n if (memberResource) {\n return {\n id: memberResource.metadata.etag as string,\n ref: stringifyEntityRef(memberResource),\n label:\n memberResource.spec.profile?.displayName ??\n memberResource.metadata.name,\n etag: memberResource.metadata.etag as string,\n type: memberResource.kind,\n namespace: memberResource.metadata.namespace as string,\n members: getMembersCount(memberResource),\n };\n } else if (ref) {\n const { kind, namespace, name } = parseEntityRef(ref);\n return {\n id: `${kind}-${namespace}-${name}`,\n ref,\n label: name,\n etag: `${kind}-${namespace}-${name}`,\n type: kind,\n namespace: namespace,\n members: kind === 'group' ? 0 : undefined,\n };\n }\n return {} as SelectedMember;\n};\n\nexport const isSamePermissionPolicy = (\n a: RoleBasedPolicy,\n b: RoleBasedPolicy,\n) =>\n a.entityReference === b.entityReference &&\n a.permission === b.permission &&\n a.policy === b.policy &&\n a.effect === b.effect;\n\nexport const onlyInLeft = (\n left: RoleBasedPolicy[],\n right: RoleBasedPolicy[],\n compareFunction: (a: RoleBasedPolicy, b: RoleBasedPolicy) => boolean,\n) =>\n left.filter(\n leftValue =>\n !right.some(rightValue => compareFunction(leftValue, rightValue)),\n );\n"],"names":[],"mappings":";;;;;;AAuDa,MAAA,mBAAA,GAAsB,CACjC,IAAA,EACA,QACsB,KAAA;AACtB,EAAI,IAAA,CAAC,YAAY,QAAU,EAAA,MAAA,KAAW,KAAK,CAAC,KAAA,CAAM,OAAQ,CAAA,QAAQ,CAAG,EAAA;AACnE,IAAA,OAAO,EAAC;AAAA;AAEV,EAAA,OAAO,QAAS,CAAA,MAAA;AAAA,IACd,CAAC,MACC,KAAA,MAAA,CAAO,eAAoB,KAAA,IAAA,IAAQ,OAAO,MAAW,KAAA;AAAA,GACzD;AACF;AAEa,MAAA,cAAA,GAAiB,CAC5B,IAAA,EACA,QACW,KAAA;AACX,EAAO,OAAA,mBAAA,CAAoB,IAAM,EAAA,QAAQ,CAAE,CAAA,MAAA;AAC7C;AAEa,MAAA,gBAAA,GAAmB,CAAC,GAGnB,KAAA;AACZ,EAAA,IAAI,aAAgB,GAAA,EAAA;AACpB,EAAI,IAAA,GAAA,CAAI,SAAS,CAAG,EAAA;AAClB,IAAgB,aAAA,GAAA,CAAA,EAAG,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,MAAS,GAAA,CAAA,GAAI,WAAW,OAAO,CAAA,CAAA;AAAA;AAEtE,EAAI,IAAA,GAAA,CAAI,QAAQ,CAAG,EAAA;AACjB,IAAA,aAAA,GAAgB,aAAc,CAAA,MAAA;AAAA,MAC5B,aAAA,CAAc,MAAS,GAAA,CAAA,GAAI,IAAO,GAAA,EAAA;AAAA,MAClC,CAAA,EAAG,IAAI,KAAK,CAAA,CAAA,EAAI,IAAI,KAAQ,GAAA,CAAA,GAAI,UAAU,MAAM,CAAA;AAAA,KAClD;AAAA;AAEF,EAAO,OAAA,aAAA;AACT;AAEa,MAAA,UAAA,GAAa,CACxB,OACW,KAAA;AACX,EAAA,IAAI,CAAC,OAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,CAAG,EAAA;AACpC,IAAO,OAAA,YAAA;AAAA;AAGT,EAAA,MAAM,MAAM,OAAQ,CAAA,MAAA;AAAA,IAClB,CAAC,KAAK,MAAW,KAAA;AACf,MAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,QAAA,IAAI,MAAO,CAAA,IAAA,KAAS,MAAU,IAAA,MAAA,CAAO,SAAS,MAAQ,EAAA;AACpD,UAAI,GAAA,CAAA,KAAA,EAAA;AAAA,SACC,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,EAAA;AAAA;AACN,OACK,MAAA;AACL,QAAM,MAAA,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,QAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,UAAI,GAAA,CAAA,KAAA,EAAA;AAAA,SACC,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,EAAA;AAAA;AACN;AAEF,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA,EAAE,KAAA,EAAO,CAAG,EAAA,MAAA,EAAQ,CAAE;AAAA,GACxB;AAEA,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAEa,MAAA,mBAAA,GAAsB,CAAC,KAA+B,KAAA;AACjE,EAAA,MAAM,cAAc,KAAM,CAAA,SAAA,EAAW,MAAO,CAAA,CAAC,KAAK,QAAa,KAAA;AAC7D,IAAA,IAAI,IAAO,GAAA,GAAA;AACX,IAAI,IAAA,QAAA,CAAS,SAAS,WAAa,EAAA;AACjC,MAAA,IAAA,EAAA;AAAA;AAEF,IAAO,OAAA,IAAA;AAAA,KACN,CAAC,CAAA;AACJ,EAAA,OAAO,WAAe,IAAA,CAAA;AACxB;AAEO,MAAM,aAAgB,GAAA,CAC3B,WACA,EAAA,cAAA,KAEA,WAAY,CAAA,MAAA;AAAA,EACV,CACE,KACA,CACG,KAAA;AACH,IAAA,MAAM,MAAS,GAAA,CAAA,CAAE,QAAS,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACpC,MAAI,IAAA,GAAA,CAAI,SAAS,cAAgB,EAAA;AAC/B,QAAO,OAAA,IAAA;AAAA;AAET,MAAI,IAAA,iBAAA,CAAkB,GAAG,CAAG,EAAA;AAC1B,QAAA,OAAO,IAAI,YAAiB,KAAA,cAAA;AAAA;AAE9B,MAAO,OAAA,KAAA;AAAA,KACR,CAAA;AACD,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA;AAAA,QACL,QAAA,EAAU,EAAE,QAAY,IAAA,GAAA;AAAA,QACxB,WAAA,EAAa,iBAAkB,CAAA,MAAM,CAAK,IAAA;AAAA,OAC5C;AAAA;AAEF,IAAO,OAAA,GAAA;AAAA,GACT;AAAA,EACA,EAAE,QAAA,EAAU,GAAK,EAAA,WAAA,EAAa,KAAM;AACtC;AAEF,MAAM,SAAA,GAAY,CAAC,GAAgB,KAAA;AACjC,EAAM,MAAA,GAAA,GAAM,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA;AACzB,EAAO,OAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAC3B,CAAA;AAEA,MAAM,cAAiB,GAAA,CACrB,UACA,EAAA,eAAA,EACA,QACG,KAAA;AACH,EAAA,MAAM,cAAiB,GAAA,QAAA,EAAU,MAAO,CAAA,CAAC,KAAK,CAAM,KAAA;AAClD,IAAA,MAAM,OAAO,iBAAkB,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,eAAe,CAAE,CAAA,IAAA;AACvD,IACE,IAAA,UAAA,KAAe,IACf,IAAA,CAAC,eAAgB,CAAA,IAAA;AAAA,MACf,CAAA,aAAA,KACE,cAAc,MAAO,CAAA,iBAAA,CAAkB,OAAO,CAC9C,KAAA,CAAA,CAAE,MAAQ,EAAA,iBAAA,CAAkB,OAAO;AAAA,KAEvC,EAAA;AACA,MAAA,GAAA,CAAI,IAAK,CAAA;AAAA,QACP,MAAQ,EAAA,YAAA,CAAa,CAAE,CAAA,MAAM,CAAK,IAAA,KAAA;AAAA,QAClC,MAAQ,EAAA;AAAA,OACT,CAAA;AAAA;AAEH,IAAO,OAAA,GAAA;AAAA,GACT,EAAG,EAAiB,CAAA;AACpB,EAAO,OAAA,CAAC,GAAI,eAAmB,IAAA,IAAK,GAAI,cAAA,IAAkB,EAAG,CAAA;AAC/D,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,QAAA,EACA,kBACsB,KAAA;AACtB,EAAA,MAAM,OAAO,QAAS,CAAA,MAAA;AAAA,IACpB,CAAC,KAA2B,MAA4B,KAAA;AACtD,MAAI,IAAA,MAAA,EAAQ,WAAW,OAAS,EAAA;AAC9B,QAAA,MAAM,SACJ,GAAA,MAAA,EAAQ,MAAU,IAAA,SAAA,CAAU,OAAO,UAAoB,CAAA;AACzD,QAAM,MAAA,eAAA,GAAkB,aAAa,SAAS,CAAA;AAC9C,QAAA,MAAM,aAAa,GAAI,CAAA,IAAA;AAAA,UACrB,CAAA,MAAA,KACE,OAAO,UAAe,KAAA,MAAA,CAAO,cAC7B,CAAC,MAAA,CAAO,SAAS,GAAI,CAAA;AAAA,YACnB,QAAQ,eAAmB,IAAA,KAAA;AAAA,YAC3B,MAAQ,EAAA;AAAA,WACT;AAAA,SACL;AACA,QAAA,IAAI,UAAY,EAAA;AACd,UAAA,UAAA,CAAW,YAAc,EAAA,GAAA;AAAA,YACvB,eAAA,GAAkB,CAAK,EAAA,EAAA,eAAe,CAAK,CAAA,GAAA;AAAA,WAC7C;AACA,UAAA,UAAA,CAAW,SAAS,GAAI,CAAA;AAAA,YACtB,QAAQ,eAAmB,IAAA,KAAA;AAAA,YAC3B,QAAQ,MAAO,CAAA;AAAA,WAChB,CAAA;AAAA,SACI,MAAA;AACL,UAAM,MAAA,YAAA,uBAAmB,GAAY,EAAA;AACrC,UAAM,MAAA,WAAA,uBAAkB,GAAwC,EAAA;AAChE,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,UAAA,EAAY,OAAO,UAAc,IAAA,GAAA;AAAA,YACjC,MAAQ,EAAA,aAAA,CAAc,kBAAoB,EAAA,MAAA,EAAQ,UAAU,CACzD,CAAA,QAAA;AAAA,YACH,YAAc,EAAA,YAAA,CAAa,GAAI,CAAA,eAAA,IAAmB,KAAK,CAAA;AAAA,YACvD,QAAA,EAAU,YAAY,GAAI,CAAA;AAAA,cACxB,QAAQ,eAAmB,IAAA,KAAA;AAAA,cAC3B,QAAQ,MAAO,CAAA;AAAA,aAChB,CAAA;AAAA,YACD,WAAa,EAAA,aAAA,CAAc,kBAAoB,EAAA,MAAA,EAAQ,UAAU,CAC9D,CAAA;AAAA,WACJ,CAAA;AAAA;AACH;AAEF,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AACA,EAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAA2B,MAAA;AAAA,IAC1C,GAAG,CAAA;AAAA,IACH,GAAI,CAAE,CAAA,YAAA,GAAe,EAAE,YAAA,EAAc,KAAM,CAAA,IAAA,CAAK,CAAE,CAAA,YAAY,CAAE,EAAA,GAAI,EAAC;AAAA,IACrE,QAAU,EAAA,cAAA;AAAA,MACR,CAAE,CAAA,UAAA;AAAA,MACF,KAAA,CAAM,IAAK,CAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,MACrB,mBAAmB,IAAK,CAAA,CAAA,EAAA,KAAM,GAAG,QAAa,KAAA,CAAA,CAAE,MAAM,CAClD,EAAA;AAAA;AACN,GACA,CAAA,CAAA;AACJ;AAEa,MAAA,yBAAA,GAA4B,CACvC,UACuB,KAAA;AACvB,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAE,CAAA,IAAA;AAAA,IAAK,CAAA,GAAA,KAClC,CAAC,SAAU,CAAA,KAAA,EAAO,UAAU,KAAO,EAAA,SAAA,CAAU,GAAG,CAAE,CAAA,QAAA;AAAA,MAChD;AAAA;AACF,GACF;AACF;AAEa,MAAA,iBAAA,GAAoB,CAC/B,UAC+B,KAAA;AAC/B,EAAA,MAAM,aACJ,GAAA,yBAAA,CAA0B,UAAU,CAAA,IAAK,SAAU,CAAA,SAAA;AAErD,EAAA,QAAQ,aAAe;AAAA,IACrB,KAAK,UAAU,KAAO,EAAA;AACpB,MAAA,MAAM,kBAAmB,UACtB,CAAA,KAAA;AACH,MAAA,eAAA,CAAgB,IAAI,CAAO,GAAA,KAAA;AACzB,QAAI,IAAA,yBAAA,CAA0B,GAAG,CAAG,EAAA;AAClC,UAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA;AAE9B,QAAO,OAAA,GAAA;AAAA,OACR,CAAA;AACD,MAAO,OAAA,EAAE,OAAO,eAAyC,EAAA;AAAA;AAC3D,IACA,KAAK,UAAU,KAAO,EAAA;AACpB,MAAA,MAAM,kBAAmB,UACtB,CAAA,KAAA;AACH,MAAA,eAAA,CAAgB,IAAI,CAAO,GAAA,KAAA;AACzB,QAAI,IAAA,yBAAA,CAA0B,GAAG,CAAG,EAAA;AAClC,UAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA;AAE9B,QAAO,OAAA,GAAA;AAAA,OACR,CAAA;AACD,MAAO,OAAA,EAAE,OAAO,eAAyC,EAAA;AAAA;AAC3D,IACA,KAAK,UAAU,GAAK,EAAA;AAClB,MAAA,MAAM,eAAgB,UAAgD,CAAA,GAAA;AACtE,MAAA,MAAM,kBAAkB,yBAA0B,CAAA,YAAY,CAC1D,GAAA,iBAAA,CAAkB,YAAY,CAC9B,GAAA,YAAA;AACJ,MAAO,OAAA,EAAE,KAAK,eAAuC,EAAA;AAAA;AACvD,IACA;AACE,MAAO,OAAA,EAAE,WAAW,UAAkC,EAAA;AAAA;AAE5D;AAEa,MAAA,eAAA,GAAkB,CAC7B,kBAAA,EACA,QACgB,KAAA;AAChB,EAAO,OAAA,QAAA,CAAS,IAAI,CAAM,CAAA,MAAA;AAAA,IACxB,MAAQ,EAAA,CAAA;AAAA,IACR,GAAI,kBAAA,CAAmB,QAAS,CAAA,CAAA,CAAE,kBAAkB,OAAO,CAAC,CACxD,GAAA,EAAE,MAAQ,EAAA,OAAA,EACV,GAAA,EAAE,QAAQ,MAAO;AAAA,GACrB,CAAA,CAAA;AACJ;AAEa,MAAA,6BAAA,GAAgC,CAC3C,sBAAA,EACA,kBACsB,KAAA;AACtB,EAAA,OAAO,sBAAuB,CAAA,MAAA,CAAO,CAAC,GAAA,EAAU,EAAO,KAAA;AACrD,IAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,EAAA,CAAG,UAAU,CAAA;AAClD,IAAM,MAAA,WAAA,GACJ,kBAAmB,CAAA,kBAAA,GAAqB,EAAG,CAAA,QAAQ,CAAG,EAAA,QAAA,GACpD,EAAG,CAAA,YACL,CAAG,EAAA,QAAA,IAAY,EAAC;AAClB,IAAM,MAAA,kBAAA,GAAqB,GAAG,iBAAkB,CAAA,GAAA;AAAA,MAAI,CAAA,MAAA,KAClD,MAAO,CAAA,iBAAA,CAAkB,OAAO;AAAA,KAClC;AACA,IAAA,MAAM,eAAe,kBAClB,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,CAAC,CAAE,CAAA,iBAAA,CAAkB,OAAO,CAAA,GAAI,EAAE,KAAM,CAAA,CAAC,CAAC,CAAA,CACrD,KAAK,IAAI,CAAA;AAEZ,IAAO,OAAA;AAAA,MACL,GAAG,GAAA;AAAA,MACH,GAAI,UACA,GAAA;AAAA,QACE;AAAA,UACE,QAAQ,EAAG,CAAA,QAAA;AAAA,UACX,YAAY,EAAG,CAAA,YAAA;AAAA,UACf,WAAa,EAAA,IAAA;AAAA,UACb,QAAA,EAAU,eAAgB,CAAA,kBAAA,EAAoB,WAAW,CAAA;AAAA,UACzD,YAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAI,EAAG,CAAA;AAAA;AACT,UAEF;AAAC,KACP;AAAA,GACF,EAAG,EAAE,CAAA;AACP;AAEa,MAAA,iBAAA,GAAoB,CAC/B,cAAA,EACA,GACmB,KAAA;AACnB,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,EAAA,EAAI,eAAe,QAAS,CAAA,IAAA;AAAA,MAC5B,GAAA,EAAK,mBAAmB,cAAc,CAAA;AAAA,MACtC,OACE,cAAe,CAAA,IAAA,CAAK,OAAS,EAAA,WAAA,IAC7B,eAAe,QAAS,CAAA,IAAA;AAAA,MAC1B,IAAA,EAAM,eAAe,QAAS,CAAA,IAAA;AAAA,MAC9B,MAAM,cAAe,CAAA,IAAA;AAAA,MACrB,SAAA,EAAW,eAAe,QAAS,CAAA,SAAA;AAAA,MACnC,OAAA,EAAS,gBAAgB,cAAc;AAAA,KACzC;AAAA,aACS,GAAK,EAAA;AACd,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAI,eAAe,GAAG,CAAA;AACpD,IAAO,OAAA;AAAA,MACL,IAAI,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAChC,GAAA;AAAA,MACA,KAAO,EAAA,IAAA;AAAA,MACP,MAAM,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAClC,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA,EAAS,IAAS,KAAA,OAAA,GAAU,CAAI,GAAA;AAAA,KAClC;AAAA;AAEF,EAAA,OAAO,EAAC;AACV;AAEO,MAAM,yBAAyB,CACpC,CAAA,EACA,MAEA,CAAE,CAAA,eAAA,KAAoB,EAAE,eACxB,IAAA,CAAA,CAAE,UAAe,KAAA,CAAA,CAAE,cACnB,CAAE,CAAA,MAAA,KAAW,EAAE,MACf,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA;AAEV,MAAM,UAAa,GAAA,CACxB,IACA,EAAA,KAAA,EACA,oBAEA,IAAK,CAAA,MAAA;AAAA,EACH,CAAA,SAAA,KACE,CAAC,KAAM,CAAA,IAAA,CAAK,gBAAc,eAAgB,CAAA,SAAA,EAAW,UAAU,CAAC;AACpE;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-rbac",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"main": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -36,15 +36,15 @@
|
|
|
36
36
|
"ui-test": "start-server-and-test start localhost:3000 'playwright test'"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@backstage-community/plugin-rbac-common": "^1.
|
|
40
|
-
"@backstage/catalog-model": "^1.7.
|
|
41
|
-
"@backstage/core-components": "^0.
|
|
42
|
-
"@backstage/core-plugin-api": "^1.10.
|
|
43
|
-
"@backstage/plugin-catalog": "^1.
|
|
44
|
-
"@backstage/plugin-catalog-common": "^1.1.
|
|
45
|
-
"@backstage/plugin-permission-common": "^0.8.
|
|
46
|
-
"@backstage/plugin-permission-react": "^0.4.
|
|
47
|
-
"@backstage/theme": "^0.6.
|
|
39
|
+
"@backstage-community/plugin-rbac-common": "^1.13.0",
|
|
40
|
+
"@backstage/catalog-model": "^1.7.3",
|
|
41
|
+
"@backstage/core-components": "^0.16.3",
|
|
42
|
+
"@backstage/core-plugin-api": "^1.10.3",
|
|
43
|
+
"@backstage/plugin-catalog": "^1.26.1",
|
|
44
|
+
"@backstage/plugin-catalog-common": "^1.1.3",
|
|
45
|
+
"@backstage/plugin-permission-common": "^0.8.4",
|
|
46
|
+
"@backstage/plugin-permission-react": "^0.4.30",
|
|
47
|
+
"@backstage/theme": "^0.6.3",
|
|
48
48
|
"@janus-idp/shared-react": "^2.13.1",
|
|
49
49
|
"@mui/icons-material": "5.16.4",
|
|
50
50
|
"@mui/material": "^5.14.18",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
"react-router-dom": "^6.0.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
|
-
"@backstage/cli": "0.
|
|
67
|
-
"@backstage/core-app-api": "1.15.
|
|
68
|
-
"@backstage/dev-utils": "1.1.
|
|
69
|
-
"@backstage/test-utils": "1.7.
|
|
66
|
+
"@backstage/cli": "^0.29.5",
|
|
67
|
+
"@backstage/core-app-api": "^1.15.4",
|
|
68
|
+
"@backstage/dev-utils": "^1.1.6",
|
|
69
|
+
"@backstage/test-utils": "^1.7.4",
|
|
70
70
|
"@playwright/test": "1.49.1",
|
|
71
71
|
"@redhat-developer/red-hat-developer-hub-theme": "0.4.0",
|
|
72
72
|
"@spotify/prettier-config": "^15.0.0",
|
|
@@ -116,5 +116,12 @@
|
|
|
116
116
|
"prettier --write"
|
|
117
117
|
]
|
|
118
118
|
},
|
|
119
|
+
"typesVersions": {
|
|
120
|
+
"*": {
|
|
121
|
+
"index": [
|
|
122
|
+
"dist/index.d.ts"
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
119
126
|
"module": "./dist/index.esm.js"
|
|
120
127
|
}
|