@backstage-community/plugin-rbac 1.42.0 → 1.42.2
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 +15 -0
- package/README.md +2 -9
- package/dist/api/RBACBackendClient.esm.js +12 -9
- package/dist/api/RBACBackendClient.esm.js.map +1 -1
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +14 -5
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -1
- package/dist/components/DeleteDialogContext.esm.js +29 -0
- package/dist/components/DeleteDialogContext.esm.js.map +1 -0
- package/dist/components/RbacPage.esm.js +1 -1
- package/dist/components/RbacPage.esm.js.map +1 -1
- package/dist/components/RolesList/DeleteRole.esm.js +1 -1
- package/dist/components/RolesList/DeleteRole.esm.js.map +1 -1
- package/dist/components/RolesList/RolesList.esm.js +1 -1
- package/dist/components/RolesList/RolesList.esm.js.map +1 -1
- package/dist/hooks/useRoles.esm.js +2 -2
- package/dist/hooks/useRoles.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/utils/rbac-utils.esm.js +18 -22
- package/dist/utils/rbac-utils.esm.js.map +1 -1
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
### Dependencies
|
|
2
2
|
|
|
3
|
+
## 1.42.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 2e28d31: hide permissions for uninstalled plugins
|
|
8
|
+
|
|
9
|
+
## 1.42.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- a2e5d4e: Added optional pagination support to getMembers API
|
|
14
|
+
- aec6bc2: docs(rbac): Removing Janus IDP dynamic plugin installation instructions, switching to relative paths for doc links
|
|
15
|
+
- ac39bff: removed shared-react dependencies
|
|
16
|
+
- 4719a0e: Fix to remove entire permission when no policy is selected.
|
|
17
|
+
|
|
3
18
|
## 1.42.0
|
|
4
19
|
|
|
5
20
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -6,16 +6,9 @@ The RBAC UI plugin offers a streamlined user interface for effectively managing
|
|
|
6
6
|
|
|
7
7
|
### Installation
|
|
8
8
|
|
|
9
|
-
#### Installing as a dynamic plugin?
|
|
10
|
-
|
|
11
|
-
The sections below are relevant for static plugins. If the plugin is expected to be installed as a dynamic one:
|
|
12
|
-
|
|
13
|
-
- follow https://github.com/janus-idp/backstage-showcase/blob/main/showcase-docs/dynamic-plugins.md#installing-a-dynamic-plugin-package-in-the-showcase
|
|
14
|
-
- add content of `app-config.yaml` into `app-config.local.yaml`.
|
|
15
|
-
|
|
16
9
|
#### Prerequisites
|
|
17
10
|
|
|
18
|
-
Follow the RBAC backend plugin [README](
|
|
11
|
+
Follow the RBAC backend plugin [README](../rbac-backend/README.md) to integrate rbac in your Backstage instance.
|
|
19
12
|
|
|
20
13
|
---
|
|
21
14
|
|
|
@@ -34,7 +27,7 @@ g, user:default/<login-id/user-name>, role:default/team_a
|
|
|
34
27
|
|
|
35
28
|
> Note: Even after ingesting users/groups in catalog and applying above permissions if the create/edit button is still disabled then please contact your administrator as you might be conditionally restricted from accessing the create/edit button.
|
|
36
29
|
|
|
37
|
-
- To fetch the permissions from other plugins like `Kubernetes` and `Jenkins` in the Role Form as mentioned [
|
|
30
|
+
- To fetch the permissions from other plugins like `Kubernetes` and `Jenkins` in the Role Form as mentioned in the [RBAC permissions documentation](../rbac-backend/docs/permissions.md), add the following configuration in your `app-config.yaml`:
|
|
38
31
|
|
|
39
32
|
```yaml title="app-config.yaml"
|
|
40
33
|
permission:
|
|
@@ -99,18 +99,21 @@ class RBACBackendClient {
|
|
|
99
99
|
}
|
|
100
100
|
return jsonResponse.json();
|
|
101
101
|
}
|
|
102
|
-
async getMembers() {
|
|
102
|
+
async getMembers(page, pageSize) {
|
|
103
103
|
const { token: idToken } = await this.identityApi.getCredentials();
|
|
104
104
|
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
105
|
+
let url = `${backendUrl}/api/catalog/entities?filter=kind=user&filter=kind=group`;
|
|
106
|
+
if (page && pageSize) {
|
|
107
|
+
const limit = pageSize;
|
|
108
|
+
const offset = pageSize * (page - 1);
|
|
109
|
+
url += `&limit=${limit}&offset=${offset}`;
|
|
110
|
+
}
|
|
111
|
+
const jsonResponse = await fetch(url, {
|
|
112
|
+
headers: {
|
|
113
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
114
|
+
"Content-Type": "application/json"
|
|
112
115
|
}
|
|
113
|
-
);
|
|
116
|
+
});
|
|
114
117
|
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
115
118
|
return jsonResponse;
|
|
116
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RBACBackendClient.esm.js","sources":["../../src/api/RBACBackendClient.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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n ConfigApi,\n createApiRef,\n IdentityApi,\n} from '@backstage/core-plugin-api';\n\nimport {\n PermissionAction,\n PluginPermissionMetaData,\n Role,\n RoleBasedPolicy,\n RoleConditionalPolicyDecision,\n} from '@backstage-community/plugin-rbac-common';\n\nimport {\n MemberEntity,\n PluginConditionRules,\n RoleBasedConditions,\n RoleError,\n} from '../types';\n\n/**\n * @public\n */\nexport type RBACAPI = {\n getUserAuthorization: () => Promise<{ status: string }>;\n getRoles: () => Promise<Role[] | Response>;\n getPolicies: () => Promise<RoleBasedPolicy[] | Response>;\n getAssociatedPolicies: (\n entityReference: string,\n ) => Promise<RoleBasedPolicy[] | Response>;\n deleteRole: (role: string) => Promise<Response>;\n getRole: (role: string) => Promise<Role[] | Response>;\n getMembers: () => Promise<MemberEntity[] | Response>;\n listPermissions: () => Promise<PluginPermissionMetaData[] | Response>;\n createRole: (role: Role) => Promise<RoleError | Response>;\n updateRole: (oldRole: Role, newRole: Role) => Promise<RoleError | Response>;\n updatePolicies: (\n entityReference: string,\n oldPolicy: RoleBasedPolicy[],\n newPolicy: RoleBasedPolicy[],\n ) => Promise<RoleError | Response>;\n createPolicies: (polices: RoleBasedPolicy[]) => Promise<RoleError | Response>;\n deletePolicies: (\n entityReference: string,\n polices: RoleBasedPolicy[],\n ) => Promise<RoleError | Response>;\n getPluginsConditionRules: () => Promise<PluginConditionRules[] | Response>;\n createConditionalPermission: (\n conditionalPermission: RoleBasedConditions,\n ) => Promise<RoleError | Response>;\n getRoleConditions: (\n roleRef: string,\n ) => Promise<RoleConditionalPolicyDecision<PermissionAction>[] | Response>;\n updateConditionalPolicies: (\n conditionId: number,\n data: RoleBasedConditions,\n ) => Promise<RoleError | Response>;\n deleteConditionalPolicies: (\n conditionId: number,\n ) => Promise<RoleError | Response>;\n};\n\nexport type Options = {\n configApi: ConfigApi;\n identityApi: IdentityApi;\n};\n\n/**\n * @public\n */\nexport const rbacApiRef = createApiRef<RBACAPI>({\n id: 'plugin.rbac.service',\n});\n\nexport class RBACBackendClient implements RBACAPI {\n // @ts-ignore\n private readonly configApi: ConfigApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: Options) {\n this.configApi = options.configApi;\n this.identityApi = options.identityApi;\n }\n\n async getUserAuthorization() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n return jsonResponse.json();\n }\n\n async getRoles() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n\n return jsonResponse.json();\n }\n\n async getPolicies() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async getAssociatedPolicies(entityReference: string) {\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async deleteRole(role: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(role);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n method: 'DELETE',\n },\n );\n return jsonResponse;\n }\n\n async getRole(role: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(role);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async getMembers() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/catalog/entities?filter=kind=user&filter=kind=group`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async listPermissions() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/plugins/policies`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n\n return jsonResponse.json();\n }\n\n async createRole(role: Role) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(role),\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async updateRole(oldRole: Role, newRole: Role) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(oldRole.name);\n const body = {\n oldRole,\n newRole,\n };\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(body),\n },\n );\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async updatePolicies(\n entityReference: string,\n oldPolicies: RoleBasedPolicy[],\n newPolicies: RoleBasedPolicy[],\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const body = {\n oldPolicy: oldPolicies,\n newPolicy: newPolicies,\n };\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(body),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async deletePolicies(entityReference: string, policies: RoleBasedPolicy[]) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(policies),\n method: 'DELETE',\n },\n );\n\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async createPolicies(policies: RoleBasedPolicy[]) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(policies),\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async getPluginsConditionRules() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/plugins/condition-rules`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async createConditionalPermission(\n conditionalPermission: RoleBasedConditions,\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(conditionalPermission),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async getRoleConditions(roleRef: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions?roleEntityRef=${roleRef}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async updateConditionalPolicies(\n conditionId: number,\n data: RoleBasedConditions,\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions/${conditionId}}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(data),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async deleteConditionalPolicies(conditionId: number) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions/${conditionId}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n method: 'DELETE',\n },\n );\n\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RBACBackendClient.esm.js","sources":["../../src/api/RBACBackendClient.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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n ConfigApi,\n createApiRef,\n IdentityApi,\n} from '@backstage/core-plugin-api';\n\nimport {\n PermissionAction,\n PluginPermissionMetaData,\n Role,\n RoleBasedPolicy,\n RoleConditionalPolicyDecision,\n} from '@backstage-community/plugin-rbac-common';\n\nimport {\n MemberEntity,\n PluginConditionRules,\n RoleBasedConditions,\n RoleError,\n} from '../types';\n\n/**\n * @public\n */\nexport type RBACAPI = {\n getUserAuthorization: () => Promise<{ status: string }>;\n getRoles: () => Promise<Role[] | Response>;\n getPolicies: () => Promise<RoleBasedPolicy[] | Response>;\n getAssociatedPolicies: (\n entityReference: string,\n ) => Promise<RoleBasedPolicy[] | Response>;\n deleteRole: (role: string) => Promise<Response>;\n getRole: (role: string) => Promise<Role[] | Response>;\n getMembers: (\n page?: number,\n pageSize?: number,\n ) => Promise<MemberEntity[] | Response>;\n listPermissions: () => Promise<PluginPermissionMetaData[] | Response>;\n createRole: (role: Role) => Promise<RoleError | Response>;\n updateRole: (oldRole: Role, newRole: Role) => Promise<RoleError | Response>;\n updatePolicies: (\n entityReference: string,\n oldPolicy: RoleBasedPolicy[],\n newPolicy: RoleBasedPolicy[],\n ) => Promise<RoleError | Response>;\n createPolicies: (polices: RoleBasedPolicy[]) => Promise<RoleError | Response>;\n deletePolicies: (\n entityReference: string,\n polices: RoleBasedPolicy[],\n ) => Promise<RoleError | Response>;\n getPluginsConditionRules: () => Promise<PluginConditionRules[] | Response>;\n createConditionalPermission: (\n conditionalPermission: RoleBasedConditions,\n ) => Promise<RoleError | Response>;\n getRoleConditions: (\n roleRef: string,\n ) => Promise<RoleConditionalPolicyDecision<PermissionAction>[] | Response>;\n updateConditionalPolicies: (\n conditionId: number,\n data: RoleBasedConditions,\n ) => Promise<RoleError | Response>;\n deleteConditionalPolicies: (\n conditionId: number,\n ) => Promise<RoleError | Response>;\n};\n\nexport type Options = {\n configApi: ConfigApi;\n identityApi: IdentityApi;\n};\n\n/**\n * @public\n */\nexport const rbacApiRef = createApiRef<RBACAPI>({\n id: 'plugin.rbac.service',\n});\n\nexport class RBACBackendClient implements RBACAPI {\n // @ts-ignore\n private readonly configApi: ConfigApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: Options) {\n this.configApi = options.configApi;\n this.identityApi = options.identityApi;\n }\n\n async getUserAuthorization() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n return jsonResponse.json();\n }\n\n async getRoles() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n\n return jsonResponse.json();\n }\n\n async getPolicies() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async getAssociatedPolicies(entityReference: string) {\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async deleteRole(role: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(role);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n method: 'DELETE',\n },\n );\n return jsonResponse;\n }\n\n async getRole(role: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(role);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async getMembers(page?: number, pageSize?: number) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n let url = `${backendUrl}/api/catalog/entities?filter=kind=user&filter=kind=group`;\n\n if (page && pageSize) {\n const limit = pageSize;\n const offset = pageSize * (page - 1);\n url += `&limit=${limit}&offset=${offset}`;\n }\n\n const jsonResponse = await fetch(url, {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async listPermissions() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/plugins/policies`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {\n return jsonResponse;\n }\n\n return jsonResponse.json();\n }\n\n async createRole(role: Role) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(role),\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async updateRole(oldRole: Role, newRole: Role) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(oldRole.name);\n const body = {\n oldRole,\n newRole,\n };\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(body),\n },\n );\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async updatePolicies(\n entityReference: string,\n oldPolicies: RoleBasedPolicy[],\n newPolicies: RoleBasedPolicy[],\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const body = {\n oldPolicy: oldPolicies,\n newPolicy: newPolicies,\n };\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(body),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async deletePolicies(entityReference: string, policies: RoleBasedPolicy[]) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const { kind, namespace, name } = parseEntityRef(entityReference);\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(policies),\n method: 'DELETE',\n },\n );\n\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async createPolicies(policies: RoleBasedPolicy[]) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(policies),\n });\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async getPluginsConditionRules() {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/plugins/condition-rules`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async createConditionalPermission(\n conditionalPermission: RoleBasedConditions,\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(conditionalPermission),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async getRoleConditions(roleRef: string) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions?roleEntityRef=${roleRef}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n },\n },\n );\n if (jsonResponse.status !== 200) {\n return jsonResponse;\n }\n return jsonResponse.json();\n }\n\n async updateConditionalPolicies(\n conditionId: number,\n data: RoleBasedConditions,\n ) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions/${conditionId}}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(data),\n },\n );\n if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n\n async deleteConditionalPolicies(conditionId: number) {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/permission/roles/conditions/${conditionId}`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n method: 'DELETE',\n },\n );\n\n if (\n jsonResponse.status !== 200 &&\n jsonResponse.status !== 201 &&\n jsonResponse.status !== 204\n ) {\n return jsonResponse.json();\n }\n return jsonResponse;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -52,11 +52,20 @@ const PermissionPoliciesForm = ({
|
|
|
52
52
|
setFieldError(`permissionPoliciesRows[${index}]`, undefined);
|
|
53
53
|
};
|
|
54
54
|
const onSelectPolicy = (isChecked, policyIndex, index) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
const updatedRows = [...permissionPoliciesRows];
|
|
56
|
+
updatedRows[index].policies[policyIndex].effect = isChecked ? "allow" : "deny";
|
|
57
|
+
if (!isChecked) {
|
|
58
|
+
const hasAnyAllowPolicy = updatedRows[index].policies.some(
|
|
59
|
+
(policy) => policy.effect === "allow"
|
|
60
|
+
);
|
|
61
|
+
if (!hasAnyAllowPolicy) {
|
|
62
|
+
const finalPps = updatedRows.filter((_ppr, pIndex) => index !== pIndex);
|
|
63
|
+
setFieldValue("permissionPoliciesRows", finalPps, true);
|
|
64
|
+
setFieldError(`permissionPoliciesRows[${index}]`, undefined);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
setFieldValue("permissionPoliciesRows", updatedRows, true);
|
|
60
69
|
};
|
|
61
70
|
const onAddConditions = (index, conditions) => {
|
|
62
71
|
setFieldValue(`permissionPoliciesRows[${index}].conditions`, conditions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionPoliciesForm.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesForm.tsx"],"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 type { FocusEventHandler } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { FormikErrors } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { useConditionRules } from '../../hooks/useConditionRules';\nimport { PermissionsData, SelectedPlugin } from '../../types';\nimport { getPluginsPermissionPoliciesData } from '../../utils/create-role-utils';\nimport { ConditionsData } from '../ConditionalAccess/types';\nimport { RoleFormValues } from './types';\nimport PermissionPoliciesFormTable from './PermissionPoliciesFormTable';\nimport PluginsDropdown from './PluginsDropdown';\nimport Box from '@mui/material/Box';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\n\ntype PermissionPoliciesFormProps = {\n permissionPoliciesRows: PermissionsData[];\n selectedPlugins: SelectedPlugin[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n setFieldError: (field: string, value: string | undefined) => void;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n selectedPluginsError: string;\n};\n\nexport const PermissionPoliciesForm = ({\n permissionPoliciesRows,\n selectedPlugins,\n setFieldValue,\n setFieldError,\n handleBlur,\n selectedPluginsError,\n}: PermissionPoliciesFormProps) => {\n const rbacApi = useApi(rbacApiRef);\n const conditionRules = useConditionRules();\n\n const { data: conditionRulesData } = conditionRules;\n\n const {\n value: permissionPolicies,\n loading: permissionPoliciesLoading,\n error: permissionPoliciesErr,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const permissionPoliciesData =\n !permissionPoliciesLoading && Array.isArray(permissionPolicies)\n ? getPluginsPermissionPoliciesData(permissionPolicies)\n : undefined;\n\n const onSelectPermission = (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => {\n const ppr = {\n plugin,\n permission,\n isResourced,\n policies: policies.map(p => ({ policy: p, effect: 'allow' })),\n resourceType,\n };\n setFieldValue(\n 'permissionPoliciesRows',\n [...permissionPoliciesRows, ppr],\n true,\n );\n };\n\n const onRemovePermission = (index: number) => {\n const finalPps = permissionPoliciesRows.filter(\n (_ppr, pIndex) => index !== pIndex,\n );\n setFieldValue('permissionPoliciesRows', finalPps, true);\n setFieldError(`permissionPoliciesRows[${index}]`, undefined);\n };\n\n const onSelectPolicy = (\n isChecked: boolean,\n policyIndex: number,\n index: number,\n ) => {\n setFieldValue(\n `permissionPoliciesRows[${index}].policies[${policyIndex}].effect`,\n isChecked ? 'allow' : 'deny',\n true,\n );\n };\n\n const onAddConditions = (index: number, conditions?: ConditionsData) => {\n setFieldValue(`permissionPoliciesRows[${index}].conditions`, conditions);\n if (!conditions)\n setFieldValue(`permissionPoliciesRows[${index}].id`, undefined);\n };\n\n const onRemoveAllPlugins = () => {\n setFieldValue(`selectedPlugins`, [], true);\n setFieldValue('permissionPoliciesRows', [], true);\n };\n\n const onRemovePlugin = (plugin: string) => {\n const selPlugins = selectedPlugins.filter(\n sp => sp.value && sp.value !== plugin,\n );\n const finalPps = permissionPoliciesRows.filter(\n ppr => ppr.plugin !== plugin,\n );\n setFieldValue(`selectedPlugins`, selPlugins, true);\n setFieldValue('permissionPoliciesRows', finalPps, true);\n };\n\n const getAllPlugins = () => {\n let allPlugins: SelectedPlugin[] = [];\n if (permissionPoliciesData?.plugins) {\n allPlugins = permissionPoliciesData.plugins.map(p => ({\n label: capitalizeFirstLetter(p),\n value: p,\n }));\n }\n const allPluginsItem =\n allPlugins.length > 0\n ? [\n {\n label: `All plugins (${allPlugins.length})`,\n value: '',\n },\n ]\n : [];\n return [...allPluginsItem, ...allPlugins];\n };\n\n const getPermissionPoliciesTableData = () => {\n return selectedPlugins\n .map(p =>\n p.value\n ? [\n {\n name: p.label,\n plugin: p.value,\n permissionPolicies:\n permissionPoliciesData?.pluginsPermissions[\n p.value\n ]?.permissions?.map(perm => ({\n permission: perm,\n actions:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].policies,\n isResourced:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].isResourced,\n resourceType:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].resourceType,\n })) ?? [],\n },\n ]\n : [],\n )\n .flat();\n };\n\n const getSelectedPluginsCount = () => {\n if (selectedPlugins?.length > 0) {\n if (selectedPlugins.findIndex(sp => sp.value === '') >= 0) {\n return selectedPlugins.length - 1;\n }\n return selectedPlugins.length;\n }\n return 0;\n };\n\n return (\n <div>\n <FormHelperText>\n By default, users are not granted access to any plugins. To grant user\n access, select the plugins you want to enable. Then, select which\n actions you would like to give user permission to.\n </FormHelperText>\n <br />\n {permissionPoliciesLoading ? (\n <Progress />\n ) : (\n <Box>\n <PluginsDropdown\n allPlugins={getAllPlugins()}\n selectedPlugins={selectedPlugins}\n setFieldValue={setFieldValue}\n handleBlur={handleBlur}\n onRemovePlugin={onRemovePlugin}\n onRemoveAllPlugins={onRemoveAllPlugins}\n selectedPluginsError={selectedPluginsError}\n />\n <br />\n <br />\n <PermissionPoliciesFormTable\n selectedPluginsCount={getSelectedPluginsCount()}\n data={getPermissionPoliciesTableData()}\n permissionPoliciesRows={permissionPoliciesRows ?? []}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n conditionRulesData={conditionRulesData}\n onRemovePermission={onRemovePermission}\n onRemovePlugin={onRemovePlugin}\n onAddConditions={onAddConditions}\n />\n </Box>\n )}\n {!permissionPoliciesLoading &&\n (permissionPoliciesErr?.message ||\n !Array.isArray(permissionPolicies)) && (\n <>\n <br />\n <FormHelperText error>\n {`Error fetching the permission policies: ${\n permissionPoliciesErr?.message ||\n (permissionPolicies as Response)?.statusText\n }`}\n </FormHelperText>\n </>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionPoliciesForm.esm.js","sources":["../../../src/components/CreateRole/PermissionPoliciesForm.tsx"],"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 type { FocusEventHandler } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { FormikErrors } from 'formik';\n\nimport { rbacApiRef } from '../../api/RBACBackendClient';\nimport { useConditionRules } from '../../hooks/useConditionRules';\nimport { PermissionsData, SelectedPlugin } from '../../types';\nimport { getPluginsPermissionPoliciesData } from '../../utils/create-role-utils';\nimport { ConditionsData } from '../ConditionalAccess/types';\nimport { RoleFormValues } from './types';\nimport PermissionPoliciesFormTable from './PermissionPoliciesFormTable';\nimport PluginsDropdown from './PluginsDropdown';\nimport Box from '@mui/material/Box';\nimport { capitalizeFirstLetter } from '../../utils/string-utils';\n\ntype PermissionPoliciesFormProps = {\n permissionPoliciesRows: PermissionsData[];\n selectedPlugins: SelectedPlugin[];\n setFieldValue: (\n field: string,\n value: any,\n shouldValidate?: boolean,\n ) => Promise<FormikErrors<RoleFormValues>> | Promise<void>;\n setFieldError: (field: string, value: string | undefined) => void;\n handleBlur: FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n selectedPluginsError: string;\n};\n\nexport const PermissionPoliciesForm = ({\n permissionPoliciesRows,\n selectedPlugins,\n setFieldValue,\n setFieldError,\n handleBlur,\n selectedPluginsError,\n}: PermissionPoliciesFormProps) => {\n const rbacApi = useApi(rbacApiRef);\n const conditionRules = useConditionRules();\n\n const { data: conditionRulesData } = conditionRules;\n\n const {\n value: permissionPolicies,\n loading: permissionPoliciesLoading,\n error: permissionPoliciesErr,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const permissionPoliciesData =\n !permissionPoliciesLoading && Array.isArray(permissionPolicies)\n ? getPluginsPermissionPoliciesData(permissionPolicies)\n : undefined;\n\n const onSelectPermission = (\n plugin: string,\n permission: string,\n isResourced: boolean,\n policies: string[],\n resourceType?: string,\n ) => {\n const ppr = {\n plugin,\n permission,\n isResourced,\n policies: policies.map(p => ({ policy: p, effect: 'allow' })),\n resourceType,\n };\n setFieldValue(\n 'permissionPoliciesRows',\n [...permissionPoliciesRows, ppr],\n true,\n );\n };\n\n const onRemovePermission = (index: number) => {\n const finalPps = permissionPoliciesRows.filter(\n (_ppr, pIndex) => index !== pIndex,\n );\n setFieldValue('permissionPoliciesRows', finalPps, true);\n setFieldError(`permissionPoliciesRows[${index}]`, undefined);\n };\n\n const onSelectPolicy = (\n isChecked: boolean,\n policyIndex: number,\n index: number,\n ) => {\n const updatedRows = [...permissionPoliciesRows];\n updatedRows[index].policies[policyIndex].effect = isChecked\n ? 'allow'\n : 'deny';\n\n // If unchecking and no policies are left with 'allow' effect, remove the entire permission\n if (!isChecked) {\n const hasAnyAllowPolicy = updatedRows[index].policies.some(\n policy => policy.effect === 'allow',\n );\n\n if (!hasAnyAllowPolicy) {\n // Remove the entire permission entry\n const finalPps = updatedRows.filter((_ppr, pIndex) => index !== pIndex);\n setFieldValue('permissionPoliciesRows', finalPps, true);\n setFieldError(`permissionPoliciesRows[${index}]`, undefined);\n return;\n }\n }\n\n setFieldValue('permissionPoliciesRows', updatedRows, true);\n };\n\n const onAddConditions = (index: number, conditions?: ConditionsData) => {\n setFieldValue(`permissionPoliciesRows[${index}].conditions`, conditions);\n if (!conditions)\n setFieldValue(`permissionPoliciesRows[${index}].id`, undefined);\n };\n\n const onRemoveAllPlugins = () => {\n setFieldValue(`selectedPlugins`, [], true);\n setFieldValue('permissionPoliciesRows', [], true);\n };\n\n const onRemovePlugin = (plugin: string) => {\n const selPlugins = selectedPlugins.filter(\n sp => sp.value && sp.value !== plugin,\n );\n const finalPps = permissionPoliciesRows.filter(\n ppr => ppr.plugin !== plugin,\n );\n setFieldValue(`selectedPlugins`, selPlugins, true);\n setFieldValue('permissionPoliciesRows', finalPps, true);\n };\n\n const getAllPlugins = () => {\n let allPlugins: SelectedPlugin[] = [];\n if (permissionPoliciesData?.plugins) {\n allPlugins = permissionPoliciesData.plugins.map(p => ({\n label: capitalizeFirstLetter(p),\n value: p,\n }));\n }\n const allPluginsItem =\n allPlugins.length > 0\n ? [\n {\n label: `All plugins (${allPlugins.length})`,\n value: '',\n },\n ]\n : [];\n return [...allPluginsItem, ...allPlugins];\n };\n\n const getPermissionPoliciesTableData = () => {\n return selectedPlugins\n .map(p =>\n p.value\n ? [\n {\n name: p.label,\n plugin: p.value,\n permissionPolicies:\n permissionPoliciesData?.pluginsPermissions[\n p.value\n ]?.permissions?.map(perm => ({\n permission: perm,\n actions:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].policies,\n isResourced:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].isResourced,\n resourceType:\n permissionPoliciesData?.pluginsPermissions[p.value]\n .policies[perm].resourceType,\n })) ?? [],\n },\n ]\n : [],\n )\n .flat();\n };\n\n const getSelectedPluginsCount = () => {\n if (selectedPlugins?.length > 0) {\n if (selectedPlugins.findIndex(sp => sp.value === '') >= 0) {\n return selectedPlugins.length - 1;\n }\n return selectedPlugins.length;\n }\n return 0;\n };\n\n return (\n <div>\n <FormHelperText>\n By default, users are not granted access to any plugins. To grant user\n access, select the plugins you want to enable. Then, select which\n actions you would like to give user permission to.\n </FormHelperText>\n <br />\n {permissionPoliciesLoading ? (\n <Progress />\n ) : (\n <Box>\n <PluginsDropdown\n allPlugins={getAllPlugins()}\n selectedPlugins={selectedPlugins}\n setFieldValue={setFieldValue}\n handleBlur={handleBlur}\n onRemovePlugin={onRemovePlugin}\n onRemoveAllPlugins={onRemoveAllPlugins}\n selectedPluginsError={selectedPluginsError}\n />\n <br />\n <br />\n <PermissionPoliciesFormTable\n selectedPluginsCount={getSelectedPluginsCount()}\n data={getPermissionPoliciesTableData()}\n permissionPoliciesRows={permissionPoliciesRows ?? []}\n onSelectPermission={onSelectPermission}\n onSelectPolicy={onSelectPolicy}\n conditionRulesData={conditionRulesData}\n onRemovePermission={onRemovePermission}\n onRemovePlugin={onRemovePlugin}\n onAddConditions={onAddConditions}\n />\n </Box>\n )}\n {!permissionPoliciesLoading &&\n (permissionPoliciesErr?.message ||\n !Array.isArray(permissionPolicies)) && (\n <>\n <br />\n <FormHelperText error>\n {`Error fetching the permission policies: ${\n permissionPoliciesErr?.message ||\n (permissionPolicies as Response)?.statusText\n }`}\n </FormHelperText>\n </>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, useState, useMemo, useContext } from 'react';
|
|
3
|
+
|
|
4
|
+
const DeleteDialogContext = createContext({
|
|
5
|
+
deleteComponent: {},
|
|
6
|
+
setDeleteComponent: () => {
|
|
7
|
+
},
|
|
8
|
+
openDialog: false,
|
|
9
|
+
setOpenDialog: () => {
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const DeleteDialogContextProvider = (props) => {
|
|
13
|
+
const [openDialog, setOpenDialog] = useState(false);
|
|
14
|
+
const [deleteComponent, setDeleteComponent] = useState({});
|
|
15
|
+
const deleteDialogContextProviderValue = useMemo(
|
|
16
|
+
() => ({
|
|
17
|
+
openDialog,
|
|
18
|
+
setOpenDialog,
|
|
19
|
+
deleteComponent,
|
|
20
|
+
setDeleteComponent
|
|
21
|
+
}),
|
|
22
|
+
[openDialog, setOpenDialog, deleteComponent, setDeleteComponent]
|
|
23
|
+
);
|
|
24
|
+
return /* @__PURE__ */ jsx(DeleteDialogContext.Provider, { value: deleteDialogContextProviderValue, children: props.children });
|
|
25
|
+
};
|
|
26
|
+
const useDeleteDialog = () => useContext(DeleteDialogContext);
|
|
27
|
+
|
|
28
|
+
export { DeleteDialogContext, DeleteDialogContextProvider, useDeleteDialog };
|
|
29
|
+
//# sourceMappingURL=DeleteDialogContext.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteDialogContext.esm.js","sources":["../../src/components/DeleteDialogContext.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { createContext, useContext, useState, useMemo } from 'react';\n\ntype DeleteDialogContextType = {\n deleteComponent: { [key: string]: any };\n setDeleteComponent: (component: { [key: string]: any }) => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n};\n\nexport const DeleteDialogContext = createContext<DeleteDialogContextType>({\n deleteComponent: {},\n setDeleteComponent: () => {},\n openDialog: false,\n setOpenDialog: () => {},\n});\n\nexport const DeleteDialogContextProvider = (props: any) => {\n const [openDialog, setOpenDialog] = useState(false);\n const [deleteComponent, setDeleteComponent] = useState({});\n\n const deleteDialogContextProviderValue = useMemo(\n () => ({\n openDialog,\n setOpenDialog,\n deleteComponent,\n setDeleteComponent,\n }),\n [openDialog, setOpenDialog, deleteComponent, setDeleteComponent],\n );\n return (\n <DeleteDialogContext.Provider value={deleteDialogContextProviderValue}>\n {props.children}\n </DeleteDialogContext.Provider>\n );\n};\nexport const useDeleteDialog = () => useContext(DeleteDialogContext);\n"],"names":[],"mappings":";;;AAyBO,MAAM,sBAAsB,aAAuC,CAAA;AAAA,EACxE,iBAAiB,EAAC;AAAA,EAClB,oBAAoB,MAAM;AAAA,GAAC;AAAA,EAC3B,UAAY,EAAA,KAAA;AAAA,EACZ,eAAe,MAAM;AAAA;AACvB,CAAC;AAEY,MAAA,2BAAA,GAA8B,CAAC,KAAe,KAAA;AACzD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAS,EAAE,CAAA;AAEzD,EAAA,MAAM,gCAAmC,GAAA,OAAA;AAAA,IACvC,OAAO;AAAA,MACL,UAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,aAAe,EAAA,eAAA,EAAiB,kBAAkB;AAAA,GACjE;AACA,EAAA,2BACG,mBAAoB,CAAA,QAAA,EAApB,EAA6B,KAAO,EAAA,gCAAA,EAClC,gBAAM,QACT,EAAA,CAAA;AAEJ;AACa,MAAA,eAAA,GAAkB,MAAM,UAAA,CAAW,mBAAmB;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Page, Header, Content, ErrorPage, Progress } from '@backstage/core-components';
|
|
3
|
-
import { DeleteDialogContextProvider } from '@janus-idp/shared-react';
|
|
4
3
|
import { RolesList } from './RolesList/RolesList.esm.js';
|
|
5
4
|
import { useApi } from '@backstage/core-plugin-api';
|
|
6
5
|
import { rbacApiRef } from '../api/RBACBackendClient.esm.js';
|
|
7
6
|
import { useAsync } from 'react-use';
|
|
7
|
+
import { DeleteDialogContextProvider } from './DeleteDialogContext.esm.js';
|
|
8
8
|
|
|
9
9
|
const RbacPage = ({ useHeader = true }) => {
|
|
10
10
|
const rbacApi = useApi(rbacApiRef);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacPage.esm.js","sources":["../../src/components/RbacPage.tsx"],"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 { Content, Header, Page, Progress } from '@backstage/core-components';\n\nimport {
|
|
1
|
+
{"version":3,"file":"RbacPage.esm.js","sources":["../../src/components/RbacPage.tsx"],"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 { Content, Header, Page, Progress } from '@backstage/core-components';\n\nimport { RolesList } from './RolesList/RolesList';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { useAsync } from 'react-use';\nimport { ErrorPage } from '@backstage/core-components';\nimport { DeleteDialogContextProvider } from './DeleteDialogContext';\n\nexport const RbacPage = ({ useHeader = true }: { useHeader?: boolean }) => {\n const rbacApi = useApi(rbacApiRef);\n const { loading: isUserLoading, value: result } = useAsync(\n async () => await rbacApi.getUserAuthorization(),\n [],\n );\n\n if (!isUserLoading) {\n return result?.status === 'Authorized' ? (\n <Page themeId=\"tool\">\n {useHeader && <Header title=\"RBAC\" />}\n <Content>\n <DeleteDialogContextProvider>\n <RolesList />\n </DeleteDialogContextProvider>\n </Content>\n </Page>\n ) : (\n <ErrorPage statusMessage=\"Not Found\" />\n );\n }\n return <Progress />;\n};\n"],"names":[],"mappings":";;;;;;;;AAwBO,MAAM,QAAW,GAAA,CAAC,EAAE,SAAA,GAAY,MAAoC,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,OAAA,EAAS,aAAe,EAAA,KAAA,EAAO,QAAW,GAAA,QAAA;AAAA,IAChD,YAAY,MAAM,OAAA,CAAQ,oBAAqB,EAAA;AAAA,IAC/C;AAAC,GACH;AAEA,EAAA,IAAI,CAAC,aAAe,EAAA;AAClB,IAAA,OAAO,QAAQ,MAAW,KAAA,YAAA,mBACvB,IAAA,CAAA,IAAA,EAAA,EAAK,SAAQ,MACX,EAAA,QAAA,EAAA;AAAA,MAAa,SAAA,oBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAM,MAAO,EAAA,CAAA;AAAA,0BAClC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,+BACC,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAU,GACb,CACF,EAAA;AAAA,KAAA,EACF,CAEA,mBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,aAAA,EAAc,WAAY,EAAA,CAAA;AAAA;AAGzC,EAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AACnB;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useDeleteDialog } from '@janus-idp/shared-react';
|
|
3
2
|
import Delete from '@mui/icons-material/Delete';
|
|
4
3
|
import IconButton from '@mui/material/IconButton';
|
|
5
4
|
import Tooltip from '@mui/material/Tooltip';
|
|
6
5
|
import { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';
|
|
7
6
|
import { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip.esm.js';
|
|
7
|
+
import { useDeleteDialog } from '../DeleteDialogContext.esm.js';
|
|
8
8
|
|
|
9
9
|
const DeleteRole = ({
|
|
10
10
|
roleName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"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
|
|
1
|
+
{"version":3,"file":"DeleteRole.esm.js","sources":["../../../src/components/RolesList/DeleteRole.tsx"],"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 */\n\nimport Delete from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { policyEntityDeletePermission } from '@backstage-community/plugin-rbac-common';\nimport { useActionPermissionTooltip } from '../../hooks/useActionPermissionTooltip';\nimport { useDeleteDialog } from '../DeleteDialogContext';\n\ntype DeleteRoleProps = {\n roleName: string;\n canEdit: boolean;\n dataTestId?: string;\n tooltip?: string;\n};\n\nconst DeleteRole = ({\n roleName,\n canEdit,\n dataTestId,\n tooltip,\n}: DeleteRoleProps) => {\n const { setDeleteComponent, setOpenDialog } = useDeleteDialog();\n\n const openDialog = (name: string) => {\n setDeleteComponent({ roleName: name });\n setOpenDialog(true);\n };\n\n const { disable, tooltipText, testIdText } = useActionPermissionTooltip({\n permission: policyEntityDeletePermission,\n resourceRef: roleName,\n canAct: canEdit,\n action: 'delete',\n dataTestId: dataTestId,\n fallbackTooltip: tooltip,\n });\n\n return (\n <Tooltip title={tooltipText}>\n <IconButton\n onClick={() => openDialog(roleName)}\n data-testid={testIdText}\n aria-label=\"Delete\"\n disabled={disable}\n title={tooltip ?? 'Delete Role'}\n sx={{\n p: 1,\n borderRadius: '50%',\n '&:hover': { borderRadius: '50%' },\n }}\n >\n <Delete />\n </IconButton>\n </Tooltip>\n );\n};\nexport default DeleteRole;\n"],"names":[],"mappings":";;;;;;;;AA8BA,MAAM,aAAa,CAAC;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,EAAE,kBAAA,EAAoB,aAAc,EAAA,GAAI,eAAgB,EAAA;AAE9D,EAAM,MAAA,UAAA,GAAa,CAAC,IAAiB,KAAA;AACnC,IAAmB,kBAAA,CAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA;AACrC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,WAAa,EAAA,UAAA,KAAe,0BAA2B,CAAA;AAAA,IACtE,UAAY,EAAA,4BAAA;AAAA,IACZ,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,UAAA;AAAA,IACA,eAAiB,EAAA;AAAA,GAClB,CAAA;AAED,EACE,uBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAO,WACd,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,aAAa,EAAA,UAAA;AAAA,MACb,YAAW,EAAA,QAAA;AAAA,MACX,QAAU,EAAA,OAAA;AAAA,MACV,OAAO,OAAW,IAAA,aAAA;AAAA,MAClB,EAAI,EAAA;AAAA,QACF,CAAG,EAAA,CAAA;AAAA,QACH,YAAc,EAAA,KAAA;AAAA,QACd,SAAA,EAAW,EAAE,YAAA,EAAc,KAAM;AAAA,OACnC;AAAA,MAEA,8BAAC,MAAO,EAAA,EAAA;AAAA;AAAA,GAEZ,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
3
|
import { Progress, WarningPanel, Table } from '@backstage/core-components';
|
|
4
|
-
import { useDeleteDialog } from '@janus-idp/shared-react';
|
|
5
4
|
import Box from '@mui/material/Box';
|
|
6
5
|
import { useCheckIfLicensePluginEnabled } from '../../hooks/useCheckIfLicensePluginEnabled.esm.js';
|
|
7
6
|
import { useLocationToast } from '../../hooks/useLocationToast.esm.js';
|
|
@@ -13,6 +12,7 @@ import { useToast } from '../ToastContext.esm.js';
|
|
|
13
12
|
import DeleteRoleDialog from './DeleteRoleDialog.esm.js';
|
|
14
13
|
import { columns } from './RolesListColumns.esm.js';
|
|
15
14
|
import { RolesListToolbar } from './RolesListToolbar.esm.js';
|
|
15
|
+
import { useDeleteDialog } from '../DeleteDialogContext.esm.js';
|
|
16
16
|
|
|
17
17
|
const RolesList = () => {
|
|
18
18
|
const { toastMessage, setToastMessage } = useToast();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesList.esm.js","sources":["../../../src/components/RolesList/RolesList.tsx"],"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 { useState, useMemo } from 'react';\n\nimport { Progress, Table, WarningPanel } from '@backstage/core-components';\n\nimport
|
|
1
|
+
{"version":3,"file":"RolesList.esm.js","sources":["../../../src/components/RolesList/RolesList.tsx"],"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 { useState, useMemo } from 'react';\n\nimport { Progress, Table, WarningPanel } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\n\nimport { useCheckIfLicensePluginEnabled } from '../../hooks/useCheckIfLicensePluginEnabled';\nimport { useLocationToast } from '../../hooks/useLocationToast';\nimport { useRoles } from '../../hooks/useRoles';\nimport { filterTableData } from '../../utils/filter-table-data';\nimport DownloadCSVLink from '../DownloadUserStatistics';\nimport { SnackbarAlert } from '../SnackbarAlert';\nimport { useToast } from '../ToastContext';\nimport DeleteRoleDialog from './DeleteRoleDialog';\nimport { columns } from './RolesListColumns';\nimport { RolesListToolbar } from './RolesListToolbar';\nimport { useDeleteDialog } from '../DeleteDialogContext';\n\nexport const RolesList = () => {\n const { toastMessage, setToastMessage } = useToast();\n const { openDialog, setOpenDialog, deleteComponent } = useDeleteDialog();\n useLocationToast(setToastMessage);\n const [searchText, setSearchText] = useState<string>();\n const [page, setPage] = useState(0);\n const [pageSize, setPageSize] = useState(5);\n const { loading, data, retry, createRoleAllowed, createRoleLoading, error } =\n useRoles(page, pageSize);\n\n const closeDialog = () => {\n setOpenDialog(false);\n retry.roleRetry();\n retry.policiesRetry();\n };\n\n const onAlertClose = () => {\n setToastMessage('');\n };\n const filteredRoles = useMemo(\n () => filterTableData({ data, columns, searchText }),\n [data, searchText],\n );\n\n const getErrorWarning = () => {\n const errorTitleBase = 'Something went wrong while fetching the';\n const errorWarningArr = [\n { message: error?.rolesError, title: `${errorTitleBase} roles` },\n {\n message: error?.policiesError,\n title: `${errorTitleBase} permission policies`,\n },\n {\n message: error?.roleConditionError,\n title: `${errorTitleBase} role conditions`,\n },\n ];\n\n return (\n errorWarningArr.find(({ message }) => message) || {\n message: '',\n title: '',\n }\n );\n };\n\n const errorWarning = getErrorWarning();\n\n const isLicensePluginEnabled = useCheckIfLicensePluginEnabled();\n if (isLicensePluginEnabled.loading) {\n return <Progress />;\n }\n\n return (\n <>\n <SnackbarAlert toastMessage={toastMessage} onAlertClose={onAlertClose} />\n <RolesListToolbar\n createRoleAllowed={createRoleAllowed}\n createRoleLoading={createRoleLoading}\n />\n {errorWarning.message && (\n <div style={{ paddingBottom: '16px' }}>\n <WarningPanel\n message={errorWarning.message}\n title={errorWarning.title}\n severity=\"error\"\n />\n </div>\n )}\n <Table\n title={\n !loading && data?.length\n ? `All roles (${filteredRoles.length})`\n : `All roles`\n }\n options={{ padding: 'default', search: true, paging: true }}\n data={data}\n isLoading={loading}\n columns={columns}\n emptyContent={\n <Box\n data-testid=\"roles-table-empty\"\n sx={{ display: 'flex', justifyContent: 'center', p: 2 }}\n >\n No records found\n </Box>\n }\n onSearchChange={setSearchText}\n onPageChange={setPage}\n onRowsPerPageChange={newPageSize => {\n setPageSize(newPageSize);\n setPage(0);\n }}\n />\n {isLicensePluginEnabled.isEnabled && <DownloadCSVLink />}\n {openDialog && (\n <DeleteRoleDialog\n open={openDialog}\n closeDialog={closeDialog}\n roleName={deleteComponent.roleName}\n propOptions={{\n memberRefs:\n data.find(d => d.name === deleteComponent.roleName)?.members ||\n [],\n permissions:\n data.find(d => d.name === deleteComponent.roleName)\n ?.permissions || 0,\n }}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ const useRoles = (page = 0, pageSize = 5, pollInterval) => {
|
|
|
30
30
|
value: members,
|
|
31
31
|
error: membersError
|
|
32
32
|
} = useAsync(async () => {
|
|
33
|
-
return await rbacApi.getMembers();
|
|
33
|
+
return await rbacApi.getMembers(1, 1);
|
|
34
34
|
});
|
|
35
35
|
const {
|
|
36
36
|
value: permissionPolicies,
|
|
@@ -119,7 +119,7 @@ const useRoles = (page = 0, pageSize = 5, pollInterval) => {
|
|
|
119
119
|
(po) => getPluginInfo(
|
|
120
120
|
permissionPolicies,
|
|
121
121
|
po
|
|
122
|
-
)
|
|
122
|
+
)?.pluginId
|
|
123
123
|
);
|
|
124
124
|
accPls = [...accPls, ...pls].filter((val) => !!val);
|
|
125
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRoles.esm.js","sources":["../../src/hooks/useRoles.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 { useState, useEffect, useMemo } from 'react';\nimport { useAsync, useAsyncRetry, useInterval } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport {\n PluginPermissionMetaData,\n policyEntityCreatePermission,\n Role,\n RoleBasedPolicy,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { RolesData } from '../types';\nimport {\n getPermissions,\n getPermissionsArray,\n getPluginInfo,\n} from '../utils/rbac-utils';\n\ntype RoleWithConditionalPoliciesCount = Role & {\n conditionalPoliciesCount: number;\n accessiblePlugins: string[];\n};\n\nexport const useRoles = (\n page = 0,\n pageSize = 5,\n pollInterval?: number,\n): {\n loading: boolean;\n data: RolesData[];\n createRoleLoading: boolean;\n createRoleAllowed: boolean;\n error: {\n rolesError: string;\n policiesError: string;\n roleConditionError: string;\n };\n retry: { roleRetry: () => void; policiesRetry: () => void };\n} => {\n const rbacApi = useApi(rbacApiRef);\n const [newRoles, setNewRoles] = useState<RoleWithConditionalPoliciesCount[]>(\n [],\n );\n const [firstLoad, setFirstLoad] = useState(true);\n const [roleConditionError, setRoleConditionError] = useState<string>('');\n const {\n loading: loadingRoles,\n value: roles,\n retry: roleRetry,\n error: rolesError,\n } = useAsyncRetry(async () => await rbacApi.getRoles());\n\n const {\n loading: loadingPolicies,\n value: policies,\n retry: policiesRetry,\n error: policiesError,\n } = useAsyncRetry(async () => await rbacApi.getPolicies(), []);\n\n const {\n loading: membersLoading,\n value: members,\n error: membersError,\n } = useAsync(async () => {\n return await rbacApi.getMembers();\n });\n\n const {\n value: permissionPolicies,\n loading: loadingPermissionPolicies,\n error: permissionPoliciesError,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const canReadUsersAndGroups =\n !membersLoading &&\n !membersError &&\n Array.isArray(members) &&\n members.length > 0;\n\n const policyEntityCreatePermissionResult = usePermission({\n permission: policyEntityCreatePermission,\n });\n\n const createRoleLoading =\n policyEntityCreatePermissionResult.loading || membersLoading;\n\n const createRoleAllowed =\n policyEntityCreatePermissionResult.allowed && canReadUsersAndGroups;\n\n const [loadingConditionalPermission, setLoadingConditionalPermission] =\n useState<boolean>(false);\n useEffect(() => {\n const fetchAllPermissionPolicies = async () => {\n if (!Array.isArray(roles)) return;\n setLoadingConditionalPermission(true);\n const failedFetchConditionRoles: string[] = [];\n\n const startIndex = page * pageSize;\n const endIndex = startIndex + pageSize;\n const paginatedRoles = roles.slice(startIndex, endIndex);\n const conditionPromises = paginatedRoles.map(async role => {\n try {\n const conditionalPolicies = await rbacApi.getRoleConditions(\n role.name,\n );\n\n if ((conditionalPolicies as any as Response)?.statusText) {\n failedFetchConditionRoles.push(role.name);\n throw new Error(\n (conditionalPolicies as any as Response).statusText,\n );\n }\n const accessiblePlugins =\n Array.isArray(conditionalPolicies) && conditionalPolicies.length > 0\n ? conditionalPolicies.map(c => c.pluginId)\n : [];\n return {\n ...role,\n conditionalPoliciesCount: Array.isArray(conditionalPolicies)\n ? conditionalPolicies.length\n : 0,\n accessiblePlugins,\n };\n } catch (error) {\n setRoleConditionError(\n `Error fetching role conditions for ${\n failedFetchConditionRoles.length > 1 ? 'roles' : 'role'\n } ${failedFetchConditionRoles.join(', ')}, please try again later.`,\n );\n return {\n ...role,\n conditionalPoliciesCount: 0,\n accessiblePlugins: [],\n };\n }\n });\n\n const settledResults = await Promise.allSettled(conditionPromises);\n const updatedPageRoles = settledResults.map((result, index) => {\n if (result.status === 'fulfilled') {\n return result.value;\n }\n const role = paginatedRoles[index];\n return {\n ...role,\n conditionalPoliciesCount: 0,\n accessiblePlugins: [],\n };\n });\n const updatedRoles = roles.map(role => {\n const updated = updatedPageRoles.find(r => r.name === role.name);\n return updated\n ? updated\n : { ...role, conditionalPoliciesCount: 0, accessiblePlugins: [] };\n });\n\n setNewRoles(updatedRoles);\n setLoadingConditionalPermission(false);\n };\n\n fetchAllPermissionPolicies();\n }, [roles, rbacApi, page, pageSize]);\n\n const data: RolesData[] = useMemo(\n () =>\n Array.isArray(newRoles) && newRoles?.length > 0\n ? newRoles.reduce(\n (acc: RolesData[], role: RoleWithConditionalPoliciesCount) => {\n const permissions = getPermissions(\n role.name,\n policies as RoleBasedPolicy[],\n );\n\n let accPls = role.accessiblePlugins;\n if (\n !loadingPermissionPolicies &&\n !permissionPoliciesError &&\n (permissionPolicies as PluginPermissionMetaData[])?.length > 0\n ) {\n const pls = getPermissionsArray(\n role.name,\n policies as RoleBasedPolicy[],\n ).map(\n po =>\n getPluginInfo(\n permissionPolicies as PluginPermissionMetaData[],\n po,\n ).pluginId,\n );\n accPls = [...accPls, ...pls].filter(val => !!val) as string[];\n }\n const accessiblePlugins = accPls\n .filter((val, index, plugins) => plugins.indexOf(val) === index)\n .sort();\n\n return [\n ...acc,\n {\n id: role.name,\n name: role.name,\n description: role.metadata?.description ?? '-',\n members: role.memberReferences,\n permissions: role.conditionalPoliciesCount + permissions,\n modifiedBy: '-',\n lastModified: '-',\n actionsPermissionResults: {\n edit: {\n allowed: canReadUsersAndGroups,\n },\n },\n accessiblePlugins,\n },\n ];\n },\n [],\n )\n : [],\n [\n newRoles,\n policies,\n loadingPermissionPolicies,\n permissionPoliciesError,\n permissionPolicies,\n canReadUsersAndGroups,\n ],\n );\n const loading =\n firstLoad &&\n (loadingPolicies ||\n loadingRoles ||\n membersLoading ||\n loadingPermissionPolicies ||\n loadingConditionalPermission);\n\n useInterval(\n () => {\n roleRetry();\n policiesRetry();\n setFirstLoad(false);\n },\n loading ? null : pollInterval || 10000,\n );\n\n return {\n loading,\n data,\n error: {\n rolesError: (rolesError?.message ||\n (typeof roles === 'object'\n ? (roles as any as Response)?.statusText\n : '')) as string,\n policiesError: (policiesError?.message ||\n (typeof policies === 'object'\n ? (policies as any as Response)?.statusText\n : '')) as string,\n roleConditionError,\n },\n createRoleLoading,\n createRoleAllowed,\n retry: { roleRetry, policiesRetry },\n };\n};\n"],"names":[],"mappings":";;;;;;;;AAyCO,MAAM,WAAW,CACtB,IAAA,GAAO,CACP,EAAA,QAAA,GAAW,GACX,YAYG,KAAA;AACH,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAM,MAAA,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA;AAAA,IAC9B;AAAC,GACH;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,SAAiB,EAAE,CAAA;AACvE,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,YAAA;AAAA,IACT,KAAO,EAAA,KAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA;AAAA,MACL,aAAc,CAAA,YAAY,MAAM,OAAA,CAAQ,UAAU,CAAA;AAEtD,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,eAAA;AAAA,IACT,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA,aAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT,GAAI,cAAc,YAAY,MAAM,QAAQ,WAAY,EAAA,EAAG,EAAE,CAAA;AAE7D,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;AAAA,IACJ,KAAO,EAAA,kBAAA;AAAA,IACP,OAAS,EAAA,yBAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAO,OAAA,MAAM,QAAQ,eAAgB,EAAA;AAAA,GACtC,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,qCAAqC,aAAc,CAAA;AAAA,IACvD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAM,MAAA,iBAAA,GACJ,mCAAmC,OAAW,IAAA,cAAA;AAEhD,EAAM,MAAA,iBAAA,GACJ,mCAAmC,OAAW,IAAA,qBAAA;AAEhD,EAAA,MAAM,CAAC,4BAAA,EAA8B,+BAA+B,CAAA,GAClE,SAAkB,KAAK,CAAA;AACzB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,6BAA6B,YAAY;AAC7C,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC3B,MAAA,+BAAA,CAAgC,IAAI,CAAA;AACpC,MAAA,MAAM,4BAAsC,EAAC;AAE7C,MAAA,MAAM,aAAa,IAAO,GAAA,QAAA;AAC1B,MAAA,MAAM,WAAW,UAAa,GAAA,QAAA;AAC9B,MAAA,MAAM,cAAiB,GAAA,KAAA,CAAM,KAAM,CAAA,UAAA,EAAY,QAAQ,CAAA;AACvD,MAAA,MAAM,iBAAoB,GAAA,cAAA,CAAe,GAAI,CAAA,OAAM,IAAQ,KAAA;AACzD,QAAI,IAAA;AACF,UAAM,MAAA,mBAAA,GAAsB,MAAM,OAAQ,CAAA,iBAAA;AAAA,YACxC,IAAK,CAAA;AAAA,WACP;AAEA,UAAA,IAAK,qBAAyC,UAAY,EAAA;AACxD,YAA0B,yBAAA,CAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACxC,YAAA,MAAM,IAAI,KAAA;AAAA,cACP,mBAAwC,CAAA;AAAA,aAC3C;AAAA;AAEF,UAAA,MAAM,iBACJ,GAAA,KAAA,CAAM,OAAQ,CAAA,mBAAmB,KAAK,mBAAoB,CAAA,MAAA,GAAS,CAC/D,GAAA,mBAAA,CAAoB,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,QAAQ,IACvC,EAAC;AACP,UAAO,OAAA;AAAA,YACL,GAAG,IAAA;AAAA,YACH,0BAA0B,KAAM,CAAA,OAAA,CAAQ,mBAAmB,CAAA,GACvD,oBAAoB,MACpB,GAAA,CAAA;AAAA,YACJ;AAAA,WACF;AAAA,iBACO,KAAO,EAAA;AACd,UAAA,qBAAA;AAAA,YACE,CAAA,mCAAA,EACE,yBAA0B,CAAA,MAAA,GAAS,CAAI,GAAA,OAAA,GAAU,MACnD,CAAI,CAAA,EAAA,yBAAA,CAA0B,IAAK,CAAA,IAAI,CAAC,CAAA,yBAAA;AAAA,WAC1C;AACA,UAAO,OAAA;AAAA,YACL,GAAG,IAAA;AAAA,YACH,wBAA0B,EAAA,CAAA;AAAA,YAC1B,mBAAmB;AAAC,WACtB;AAAA;AACF,OACD,CAAA;AAED,MAAA,MAAM,cAAiB,GAAA,MAAM,OAAQ,CAAA,UAAA,CAAW,iBAAiB,CAAA;AACjE,MAAA,MAAM,gBAAmB,GAAA,cAAA,CAAe,GAAI,CAAA,CAAC,QAAQ,KAAU,KAAA;AAC7D,QAAI,IAAA,MAAA,CAAO,WAAW,WAAa,EAAA;AACjC,UAAA,OAAO,MAAO,CAAA,KAAA;AAAA;AAEhB,QAAM,MAAA,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,QAAO,OAAA;AAAA,UACL,GAAG,IAAA;AAAA,UACH,wBAA0B,EAAA,CAAA;AAAA,UAC1B,mBAAmB;AAAC,SACtB;AAAA,OACD,CAAA;AACD,MAAM,MAAA,YAAA,GAAe,KAAM,CAAA,GAAA,CAAI,CAAQ,IAAA,KAAA;AACrC,QAAA,MAAM,UAAU,gBAAiB,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,IAAA,KAAS,KAAK,IAAI,CAAA;AAC/D,QAAO,OAAA,OAAA,GACH,UACA,EAAE,GAAG,MAAM,wBAA0B,EAAA,CAAA,EAAG,iBAAmB,EAAA,EAAG,EAAA;AAAA,OACnE,CAAA;AAED,MAAA,WAAA,CAAY,YAAY,CAAA;AACxB,MAAA,+BAAA,CAAgC,KAAK,CAAA;AAAA,KACvC;AAEA,IAA2B,0BAAA,EAAA;AAAA,KAC1B,CAAC,KAAA,EAAO,OAAS,EAAA,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnC,EAAA,MAAM,IAAoB,GAAA,OAAA;AAAA,IACxB,MACE,MAAM,OAAQ,CAAA,QAAQ,KAAK,QAAU,EAAA,MAAA,GAAS,IAC1C,QAAS,CAAA,MAAA;AAAA,MACP,CAAC,KAAkB,IAA2C,KAAA;AAC5D,QAAA,MAAM,WAAc,GAAA,cAAA;AAAA,UAClB,IAAK,CAAA,IAAA;AAAA,UACL;AAAA,SACF;AAEA,QAAA,IAAI,SAAS,IAAK,CAAA,iBAAA;AAClB,QAAA,IACE,CAAC,yBACD,IAAA,CAAC,uBACA,IAAA,kBAAA,EAAmD,SAAS,CAC7D,EAAA;AACA,UAAA,MAAM,GAAM,GAAA,mBAAA;AAAA,YACV,IAAK,CAAA,IAAA;AAAA,YACL;AAAA,WACA,CAAA,GAAA;AAAA,YACA,CACE,EAAA,KAAA,aAAA;AAAA,cACE,kBAAA;AAAA,cACA;AAAA,aACA,CAAA;AAAA,WACN;AACA,UAAS,MAAA,GAAA,CAAC,GAAG,MAAA,EAAQ,GAAG,GAAG,EAAE,MAAO,CAAA,CAAA,GAAA,KAAO,CAAC,CAAC,GAAG,CAAA;AAAA;AAElD,QAAA,MAAM,iBAAoB,GAAA,MAAA,CACvB,MAAO,CAAA,CAAC,GAAK,EAAA,KAAA,EAAO,OAAY,KAAA,OAAA,CAAQ,OAAQ,CAAA,GAAG,CAAM,KAAA,KAAK,EAC9D,IAAK,EAAA;AAER,QAAO,OAAA;AAAA,UACL,GAAG,GAAA;AAAA,UACH;AAAA,YACE,IAAI,IAAK,CAAA,IAAA;AAAA,YACT,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,WAAA,EAAa,IAAK,CAAA,QAAA,EAAU,WAAe,IAAA,GAAA;AAAA,YAC3C,SAAS,IAAK,CAAA,gBAAA;AAAA,YACd,WAAA,EAAa,KAAK,wBAA2B,GAAA,WAAA;AAAA,YAC7C,UAAY,EAAA,GAAA;AAAA,YACZ,YAAc,EAAA,GAAA;AAAA,YACd,wBAA0B,EAAA;AAAA,cACxB,IAAM,EAAA;AAAA,gBACJ,OAAS,EAAA;AAAA;AACX,aACF;AAAA,YACA;AAAA;AACF,SACF;AAAA,OACF;AAAA,MACA;AAAC,QAEH,EAAC;AAAA,IACP;AAAA,MACE,QAAA;AAAA,MACA,QAAA;AAAA,MACA,yBAAA;AAAA,MACA,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,MAAM,OACJ,GAAA,SAAA,KACC,eACC,IAAA,YAAA,IACA,kBACA,yBACA,IAAA,4BAAA,CAAA;AAEJ,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAU,SAAA,EAAA;AACV,MAAc,aAAA,EAAA;AACd,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,KACpB;AAAA,IACA,OAAA,GAAU,OAAuB;AAAA,GACnC;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAO,EAAA;AAAA,MACL,YAAa,UAAY,EAAA,OAAA,KACtB,OAAO,KAAU,KAAA,QAAA,GACb,OAA2B,UAC5B,GAAA,EAAA,CAAA;AAAA,MACN,eAAgB,aAAe,EAAA,OAAA,KAC5B,OAAO,QAAa,KAAA,QAAA,GAChB,UAA8B,UAC/B,GAAA,EAAA,CAAA;AAAA,MACN;AAAA,KACF;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,KAAA,EAAO,EAAE,SAAA,EAAW,aAAc;AAAA,GACpC;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"useRoles.esm.js","sources":["../../src/hooks/useRoles.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 { useState, useEffect, useMemo } from 'react';\nimport { useAsync, useAsyncRetry, useInterval } from 'react-use';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport {\n PluginPermissionMetaData,\n policyEntityCreatePermission,\n Role,\n RoleBasedPolicy,\n} from '@backstage-community/plugin-rbac-common';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\nimport { RolesData } from '../types';\nimport {\n getPermissions,\n getPermissionsArray,\n getPluginInfo,\n} from '../utils/rbac-utils';\n\ntype RoleWithConditionalPoliciesCount = Role & {\n conditionalPoliciesCount: number;\n accessiblePlugins: string[];\n};\n\nexport const useRoles = (\n page = 0,\n pageSize = 5,\n pollInterval?: number,\n): {\n loading: boolean;\n data: RolesData[];\n createRoleLoading: boolean;\n createRoleAllowed: boolean;\n error: {\n rolesError: string;\n policiesError: string;\n roleConditionError: string;\n };\n retry: { roleRetry: () => void; policiesRetry: () => void };\n} => {\n const rbacApi = useApi(rbacApiRef);\n const [newRoles, setNewRoles] = useState<RoleWithConditionalPoliciesCount[]>(\n [],\n );\n const [firstLoad, setFirstLoad] = useState(true);\n const [roleConditionError, setRoleConditionError] = useState<string>('');\n const {\n loading: loadingRoles,\n value: roles,\n retry: roleRetry,\n error: rolesError,\n } = useAsyncRetry(async () => await rbacApi.getRoles());\n\n const {\n loading: loadingPolicies,\n value: policies,\n retry: policiesRetry,\n error: policiesError,\n } = useAsyncRetry(async () => await rbacApi.getPolicies(), []);\n\n const {\n loading: membersLoading,\n value: members,\n error: membersError,\n } = useAsync(async () => {\n return await rbacApi.getMembers(1, 1);\n });\n\n const {\n value: permissionPolicies,\n loading: loadingPermissionPolicies,\n error: permissionPoliciesError,\n } = useAsync(async () => {\n return await rbacApi.listPermissions();\n });\n\n const canReadUsersAndGroups =\n !membersLoading &&\n !membersError &&\n Array.isArray(members) &&\n members.length > 0;\n\n const policyEntityCreatePermissionResult = usePermission({\n permission: policyEntityCreatePermission,\n });\n\n const createRoleLoading =\n policyEntityCreatePermissionResult.loading || membersLoading;\n\n const createRoleAllowed =\n policyEntityCreatePermissionResult.allowed && canReadUsersAndGroups;\n\n const [loadingConditionalPermission, setLoadingConditionalPermission] =\n useState<boolean>(false);\n useEffect(() => {\n const fetchAllPermissionPolicies = async () => {\n if (!Array.isArray(roles)) return;\n setLoadingConditionalPermission(true);\n const failedFetchConditionRoles: string[] = [];\n\n const startIndex = page * pageSize;\n const endIndex = startIndex + pageSize;\n const paginatedRoles = roles.slice(startIndex, endIndex);\n const conditionPromises = paginatedRoles.map(async role => {\n try {\n const conditionalPolicies = await rbacApi.getRoleConditions(\n role.name,\n );\n\n if ((conditionalPolicies as any as Response)?.statusText) {\n failedFetchConditionRoles.push(role.name);\n throw new Error(\n (conditionalPolicies as any as Response).statusText,\n );\n }\n const accessiblePlugins =\n Array.isArray(conditionalPolicies) && conditionalPolicies.length > 0\n ? conditionalPolicies.map(c => c.pluginId)\n : [];\n return {\n ...role,\n conditionalPoliciesCount: Array.isArray(conditionalPolicies)\n ? conditionalPolicies.length\n : 0,\n accessiblePlugins,\n };\n } catch (error) {\n setRoleConditionError(\n `Error fetching role conditions for ${\n failedFetchConditionRoles.length > 1 ? 'roles' : 'role'\n } ${failedFetchConditionRoles.join(', ')}, please try again later.`,\n );\n return {\n ...role,\n conditionalPoliciesCount: 0,\n accessiblePlugins: [],\n };\n }\n });\n\n const settledResults = await Promise.allSettled(conditionPromises);\n const updatedPageRoles = settledResults.map((result, index) => {\n if (result.status === 'fulfilled') {\n return result.value;\n }\n const role = paginatedRoles[index];\n return {\n ...role,\n conditionalPoliciesCount: 0,\n accessiblePlugins: [],\n };\n });\n const updatedRoles = roles.map(role => {\n const updated = updatedPageRoles.find(r => r.name === role.name);\n return updated\n ? updated\n : { ...role, conditionalPoliciesCount: 0, accessiblePlugins: [] };\n });\n\n setNewRoles(updatedRoles);\n setLoadingConditionalPermission(false);\n };\n\n fetchAllPermissionPolicies();\n }, [roles, rbacApi, page, pageSize]);\n\n const data: RolesData[] = useMemo(\n () =>\n Array.isArray(newRoles) && newRoles?.length > 0\n ? newRoles.reduce(\n (acc: RolesData[], role: RoleWithConditionalPoliciesCount) => {\n const permissions = getPermissions(\n role.name,\n policies as RoleBasedPolicy[],\n );\n\n let accPls = role.accessiblePlugins;\n if (\n !loadingPermissionPolicies &&\n !permissionPoliciesError &&\n (permissionPolicies as PluginPermissionMetaData[])?.length > 0\n ) {\n const pls = getPermissionsArray(\n role.name,\n policies as RoleBasedPolicy[],\n ).map(\n po =>\n getPluginInfo(\n permissionPolicies as PluginPermissionMetaData[],\n po,\n )?.pluginId,\n );\n accPls = [...accPls, ...pls].filter(val => !!val) as string[];\n }\n const accessiblePlugins = accPls\n .filter((val, index, plugins) => plugins.indexOf(val) === index)\n .sort();\n\n return [\n ...acc,\n {\n id: role.name,\n name: role.name,\n description: role.metadata?.description ?? '-',\n members: role.memberReferences,\n permissions: role.conditionalPoliciesCount + permissions,\n modifiedBy: '-',\n lastModified: '-',\n actionsPermissionResults: {\n edit: {\n allowed: canReadUsersAndGroups,\n },\n },\n accessiblePlugins,\n },\n ];\n },\n [],\n )\n : [],\n [\n newRoles,\n policies,\n loadingPermissionPolicies,\n permissionPoliciesError,\n permissionPolicies,\n canReadUsersAndGroups,\n ],\n );\n const loading =\n firstLoad &&\n (loadingPolicies ||\n loadingRoles ||\n membersLoading ||\n loadingPermissionPolicies ||\n loadingConditionalPermission);\n\n useInterval(\n () => {\n roleRetry();\n policiesRetry();\n setFirstLoad(false);\n },\n loading ? null : pollInterval || 10000,\n );\n\n return {\n loading,\n data,\n error: {\n rolesError: (rolesError?.message ||\n (typeof roles === 'object'\n ? (roles as any as Response)?.statusText\n : '')) as string,\n policiesError: (policiesError?.message ||\n (typeof policies === 'object'\n ? (policies as any as Response)?.statusText\n : '')) as string,\n roleConditionError,\n },\n createRoleLoading,\n createRoleAllowed,\n retry: { roleRetry, policiesRetry },\n };\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -71,7 +71,7 @@ type RBACAPI = {
|
|
|
71
71
|
getAssociatedPolicies: (entityReference: string) => Promise<RoleBasedPolicy[] | Response>;
|
|
72
72
|
deleteRole: (role: string) => Promise<Response>;
|
|
73
73
|
getRole: (role: string) => Promise<Role[] | Response>;
|
|
74
|
-
getMembers: () => Promise<MemberEntity[] | Response>;
|
|
74
|
+
getMembers: (page?: number, pageSize?: number) => Promise<MemberEntity[] | Response>;
|
|
75
75
|
listPermissions: () => Promise<PluginPermissionMetaData[] | Response>;
|
|
76
76
|
createRole: (role: Role) => Promise<RoleError | Response>;
|
|
77
77
|
updateRole: (oldRole: Role, newRole: Role) => Promise<RoleError | Response>;
|
|
@@ -79,9 +79,9 @@ const getPluginInfo = (permissions, policy) => permissions.reduce(
|
|
|
79
79
|
}
|
|
80
80
|
return false;
|
|
81
81
|
});
|
|
82
|
-
if (policyData) {
|
|
82
|
+
if (p.pluginId && policyData) {
|
|
83
83
|
return {
|
|
84
|
-
pluginId: p.pluginId
|
|
84
|
+
pluginId: p.pluginId,
|
|
85
85
|
permissionName: policyData.name || "-",
|
|
86
86
|
isResourced: isResourcedPolicy(policyData) || false,
|
|
87
87
|
resourceType: isResourcedPolicy(policyData) ? policyData.resourceType : "",
|
|
@@ -90,7 +90,7 @@ const getPluginInfo = (permissions, policy) => permissions.reduce(
|
|
|
90
90
|
}
|
|
91
91
|
return acc;
|
|
92
92
|
},
|
|
93
|
-
|
|
93
|
+
null
|
|
94
94
|
);
|
|
95
95
|
const getPolicy = (str) => {
|
|
96
96
|
const arr = str.split(".");
|
|
@@ -119,25 +119,21 @@ const getPermissionsData = (policies, permissionPolicies) => {
|
|
|
119
119
|
const policyTitleCase = capitalizeFirstLetter(policyStr);
|
|
120
120
|
const policyString = /* @__PURE__ */ new Set();
|
|
121
121
|
const policiesSet = /* @__PURE__ */ new Set();
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
isResourced,
|
|
138
|
-
resourceType,
|
|
139
|
-
usingResourceType
|
|
140
|
-
});
|
|
122
|
+
const pluginInfo = getPluginInfo(permissionPolicies, policy);
|
|
123
|
+
if (pluginInfo?.pluginId) {
|
|
124
|
+
acc.push({
|
|
125
|
+
permission: pluginInfo.permissionName,
|
|
126
|
+
plugin: pluginInfo.pluginId,
|
|
127
|
+
policyString: policyString.add(policyTitleCase || "Use"),
|
|
128
|
+
policies: policiesSet.add({
|
|
129
|
+
policy: policyTitleCase || "Use",
|
|
130
|
+
effect: policy.effect
|
|
131
|
+
}),
|
|
132
|
+
isResourced: pluginInfo.isResourced,
|
|
133
|
+
resourceType: pluginInfo.resourceType,
|
|
134
|
+
usingResourceType: pluginInfo.usingResourceType
|
|
135
|
+
});
|
|
136
|
+
}
|
|
141
137
|
}
|
|
142
138
|
return acc;
|
|
143
139
|
},
|
|
@@ -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 { capitalizeFirstLetter } from './string-utils';\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 policy: RoleBasedPolicy,\n): {\n pluginId: string;\n isResourced: boolean;\n resourceType?: string;\n permissionName: string;\n usingResourceType?: boolean;\n} =>\n permissions.reduce(\n (\n acc: {\n pluginId: string;\n isResourced: boolean;\n resourceType?: string;\n permissionName: string;\n usingResourceType?: boolean;\n },\n p: PluginPermissionMetaData,\n ) => {\n const policyData = p.policies.find(pol => {\n if (pol.policy === policy.policy) {\n if (isResourcedPolicy(pol)) {\n if (pol.resourceType === policy.permission) {\n return true;\n }\n }\n if (pol.name === policy.permission) {\n return true;\n }\n }\n return false;\n });\n if (policyData) {\n return {\n pluginId: p.pluginId || '-',\n permissionName: policyData.name || '-',\n isResourced: isResourcedPolicy(policyData) || false,\n resourceType: isResourcedPolicy(policyData)\n ? policyData.resourceType\n : '',\n usingResourceType:\n isResourcedPolicy(policyData) &&\n policyData.resourceType === policy.permission,\n };\n }\n return acc;\n },\n { pluginId: '-', isResourced: false, permissionName: '-' },\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 = 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: capitalizeFirstLetter(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 = capitalizeFirstLetter(policyStr);\n const policyString = new Set<string>();\n const policiesSet = new Set<{ policy: string; effect: string }>();\n const {\n pluginId,\n isResourced,\n resourceType,\n permissionName,\n usingResourceType,\n } = getPluginInfo(permissionPolicies, policy);\n acc.push({\n permission: permissionName,\n plugin: pluginId,\n policyString: policyString.add(policyTitleCase || 'Use'),\n policies: policiesSet.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n }),\n isResourced,\n resourceType,\n usingResourceType,\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 getPolicyString = (policies: RowPolicy[]) => {\n const policyStr = policies.reduce((acc: string, p) => {\n if (p.effect === 'allow') return acc.concat(`${p.policy}, `);\n return acc;\n }, '');\n return policyStr.slice(0, policyStr.length - 2);\n};\n\nexport const getConditionalPermissionsData = (\n conditionalPermissions: RoleConditionalPolicyDecision<PermissionAction>[],\n permissionPolicies: PluginsPermissionPoliciesData,\n allPermissionPolicies: PluginPermissionMetaData[],\n): PermissionsData[] => {\n return conditionalPermissions.reduce((acc: any, cp) => {\n const conditions = getConditionsData(cp.conditions);\n const allowedPermissions = cp.permissionMapping.map(action =>\n action.toLocaleLowerCase('en-US'),\n );\n\n const pluginPermissionMetaData = allPermissionPolicies.find(\n pp => pp.pluginId === cp.pluginId,\n );\n\n const perms =\n pluginPermissionMetaData?.policies.filter(\n po =>\n isResourcedPolicy(po) &&\n po.resourceType === cp.resourceType &&\n allowedPermissions.includes(po.policy.toLocaleLowerCase('en-US')),\n ) ?? [];\n\n const allPolicies = (pm: string) =>\n permissionPolicies.pluginsPermissions?.[cp.pluginId]?.policies?.[pm]\n ?.policies ?? [];\n\n return [\n ...acc,\n ...(conditions\n ? perms.map((perm, index, arr) => {\n const policies = getPoliciesData(\n allowedPermissions,\n allPolicies(perm.name),\n );\n return {\n plugin: cp.pluginId,\n permission: perm.name,\n resourceType: cp.resourceType,\n isResourced: true,\n policies,\n policyString: getPolicyString(policies),\n conditions,\n ...(index === 0 ||\n !!policies.find(\n pl =>\n pl.policy.toLocaleLowerCase('en-US') ===\n arr[index - 1].policy && pl.effect === 'allow',\n )\n ? { id: cp.id }\n : {}),\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":"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"}
|
|
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 { capitalizeFirstLetter } from './string-utils';\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 PluginInfoType,\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 policy: RoleBasedPolicy,\n): PluginInfoType | null =>\n permissions.reduce(\n (acc: PluginInfoType | null, p: PluginPermissionMetaData) => {\n const policyData = p.policies.find(pol => {\n if (pol.policy === policy.policy) {\n if (isResourcedPolicy(pol)) {\n if (pol.resourceType === policy.permission) {\n return true;\n }\n }\n if (pol.name === policy.permission) {\n return true;\n }\n }\n return false;\n });\n if (p.pluginId && policyData) {\n return {\n pluginId: p.pluginId,\n permissionName: policyData.name || '-',\n isResourced: isResourcedPolicy(policyData) || false,\n resourceType: isResourcedPolicy(policyData)\n ? policyData.resourceType\n : '',\n usingResourceType:\n isResourcedPolicy(policyData) &&\n policyData.resourceType === policy.permission,\n };\n }\n return acc;\n },\n null,\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 = 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: capitalizeFirstLetter(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 = capitalizeFirstLetter(policyStr);\n const policyString = new Set<string>();\n const policiesSet = new Set<{ policy: string; effect: string }>();\n const pluginInfo = getPluginInfo(permissionPolicies, policy);\n if (pluginInfo?.pluginId) {\n acc.push({\n permission: pluginInfo.permissionName,\n plugin: pluginInfo.pluginId,\n policyString: policyString.add(policyTitleCase || 'Use'),\n policies: policiesSet.add({\n policy: policyTitleCase || 'Use',\n effect: policy.effect,\n }),\n isResourced: pluginInfo.isResourced,\n resourceType: pluginInfo.resourceType,\n usingResourceType: pluginInfo.usingResourceType,\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 getPolicyString = (policies: RowPolicy[]) => {\n const policyStr = policies.reduce((acc: string, p) => {\n if (p.effect === 'allow') return acc.concat(`${p.policy}, `);\n return acc;\n }, '');\n return policyStr.slice(0, policyStr.length - 2);\n};\n\nexport const getConditionalPermissionsData = (\n conditionalPermissions: RoleConditionalPolicyDecision<PermissionAction>[],\n permissionPolicies: PluginsPermissionPoliciesData,\n allPermissionPolicies: PluginPermissionMetaData[],\n): PermissionsData[] => {\n return conditionalPermissions.reduce((acc: any, cp) => {\n const conditions = getConditionsData(cp.conditions);\n const allowedPermissions = cp.permissionMapping.map(action =>\n action.toLocaleLowerCase('en-US'),\n );\n\n const pluginPermissionMetaData = allPermissionPolicies.find(\n pp => pp.pluginId === cp.pluginId,\n );\n\n const perms =\n pluginPermissionMetaData?.policies.filter(\n po =>\n isResourcedPolicy(po) &&\n po.resourceType === cp.resourceType &&\n allowedPermissions.includes(po.policy.toLocaleLowerCase('en-US')),\n ) ?? [];\n\n const allPolicies = (pm: string) =>\n permissionPolicies.pluginsPermissions?.[cp.pluginId]?.policies?.[pm]\n ?.policies ?? [];\n\n return [\n ...acc,\n ...(conditions\n ? perms.map((perm, index, arr) => {\n const policies = getPoliciesData(\n allowedPermissions,\n allPolicies(perm.name),\n );\n return {\n plugin: cp.pluginId,\n permission: perm.name,\n resourceType: cp.resourceType,\n isResourced: true,\n policies,\n policyString: getPolicyString(policies),\n conditions,\n ...(index === 0 ||\n !!policies.find(\n pl =>\n pl.policy.toLocaleLowerCase('en-US') ===\n arr[index - 1].policy && pl.effect === 'allow',\n )\n ? { id: cp.id }\n : {}),\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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-rbac",
|
|
3
|
-
"version": "1.42.
|
|
3
|
+
"version": "1.42.2",
|
|
4
4
|
"main": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
"@backstage/plugin-permission-common": "^0.9.0",
|
|
45
45
|
"@backstage/plugin-permission-react": "^0.4.34",
|
|
46
46
|
"@backstage/theme": "^0.6.6",
|
|
47
|
-
"@janus-idp/shared-react": "^2.16.0",
|
|
48
47
|
"@mui/icons-material": "5.16.14",
|
|
49
48
|
"@mui/material": "^5.14.18",
|
|
50
49
|
"@mui/styles": "^6.1.7",
|