@backstage-community/plugin-rbac 1.42.0 → 1.42.1
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 +9 -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 +1 -1
- package/dist/hooks/useRoles.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
### Dependencies
|
|
2
2
|
|
|
3
|
+
## 1.42.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a2e5d4e: Added optional pagination support to getMembers API
|
|
8
|
+
- aec6bc2: docs(rbac): Removing Janus IDP dynamic plugin installation instructions, switching to relative paths for doc links
|
|
9
|
+
- ac39bff: removed shared-react dependencies
|
|
10
|
+
- 4719a0e: Fix to remove entire permission when no policy is selected.
|
|
11
|
+
|
|
3
12
|
## 1.42.0
|
|
4
13
|
|
|
5
14
|
### 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,
|
|
@@ -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":"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"}
|
|
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>;
|
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.1",
|
|
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",
|