@backstage-community/plugin-rbac 1.32.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 +761 -0
- package/README.md +106 -0
- package/app-config.yaml +19 -0
- package/dist/api/LicensedUsersClient.esm.js +45 -0
- package/dist/api/LicensedUsersClient.esm.js.map +1 -0
- package/dist/api/RBACBackendClient.esm.js +337 -0
- package/dist/api/RBACBackendClient.esm.js.map +1 -0
- package/dist/components/Administration.esm.js +23 -0
- package/dist/components/Administration.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js +23 -0
- package/dist/components/ConditionalAccess/AddNestedConditionButton.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js +149 -0
- package/dist/components/ConditionalAccess/ComplexConditionRow.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js +62 -0
- package/dist/components/ConditionalAccess/ComplexConditionRowButtons.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ConditionRule.esm.js +34 -0
- package/dist/components/ConditionalAccess/ConditionRule.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js +93 -0
- package/dist/components/ConditionalAccess/ConditionalAccessSidebar.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js +204 -0
- package/dist/components/ConditionalAccess/ConditionsForm.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js +459 -0
- package/dist/components/ConditionalAccess/ConditionsFormRow.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js +209 -0
- package/dist/components/ConditionalAccess/ConditionsFormRowFields.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js +33 -0
- package/dist/components/ConditionalAccess/CriteriaToggleButton.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/CustomArrayField.esm.js +47 -0
- package/dist/components/ConditionalAccess/CustomArrayField.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js +24 -0
- package/dist/components/ConditionalAccess/RulesDropdownOption.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/const.esm.js +21 -0
- package/dist/components/ConditionalAccess/const.esm.js.map +1 -0
- package/dist/components/ConditionalAccess/types.esm.js +8 -0
- package/dist/components/ConditionalAccess/types.esm.js.map +1 -0
- package/dist/components/CreateRole/AddMembersForm.esm.js +94 -0
- package/dist/components/CreateRole/AddMembersForm.esm.js.map +1 -0
- package/dist/components/CreateRole/AddedMembersTable.esm.js +31 -0
- package/dist/components/CreateRole/AddedMembersTable.esm.js.map +1 -0
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js +77 -0
- package/dist/components/CreateRole/AddedMembersTableColumn.esm.js.map +1 -0
- package/dist/components/CreateRole/CreateRolePage.esm.js +53 -0
- package/dist/components/CreateRole/CreateRolePage.esm.js.map +1 -0
- package/dist/components/CreateRole/EditRolePage.esm.js +65 -0
- package/dist/components/CreateRole/EditRolePage.esm.js.map +1 -0
- package/dist/components/CreateRole/MembersDropdownOption.esm.js +40 -0
- package/dist/components/CreateRole/MembersDropdownOption.esm.js.map +1 -0
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js +144 -0
- package/dist/components/CreateRole/PermissionPoliciesForm.esm.js.map +1 -0
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js +179 -0
- package/dist/components/CreateRole/PermissionPoliciesFormRow.esm.js.map +1 -0
- package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js +76 -0
- package/dist/components/CreateRole/PoliciesCheckboxGroup.esm.js.map +1 -0
- package/dist/components/CreateRole/ReviewStep.esm.js +50 -0
- package/dist/components/CreateRole/ReviewStep.esm.js.map +1 -0
- package/dist/components/CreateRole/ReviewStepTable.esm.js +29 -0
- package/dist/components/CreateRole/ReviewStepTable.esm.js.map +1 -0
- package/dist/components/CreateRole/RoleDetailsForm.esm.js +57 -0
- package/dist/components/CreateRole/RoleDetailsForm.esm.js.map +1 -0
- package/dist/components/CreateRole/RoleForm.esm.js +271 -0
- package/dist/components/CreateRole/RoleForm.esm.js.map +1 -0
- package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js +34 -0
- package/dist/components/CreateRole/SelectedPermissionPoliciesColumn.esm.js.map +1 -0
- package/dist/components/CreateRole/const.esm.js +14 -0
- package/dist/components/CreateRole/const.esm.js.map +1 -0
- package/dist/components/DownloadUserStatistics.esm.js +51 -0
- package/dist/components/DownloadUserStatistics.esm.js.map +1 -0
- package/dist/components/EditRole.esm.js +30 -0
- package/dist/components/EditRole.esm.js.map +1 -0
- package/dist/components/RbacPage.esm.js +18 -0
- package/dist/components/RbacPage.esm.js.map +1 -0
- package/dist/components/RoleOverview/AboutCard.esm.js +89 -0
- package/dist/components/RoleOverview/AboutCard.esm.js.map +1 -0
- package/dist/components/RoleOverview/MembersCard.esm.js +87 -0
- package/dist/components/RoleOverview/MembersCard.esm.js.map +1 -0
- package/dist/components/RoleOverview/MembersListColumns.esm.js +48 -0
- package/dist/components/RoleOverview/MembersListColumns.esm.js.map +1 -0
- package/dist/components/RoleOverview/PermissionsCard.esm.js +99 -0
- package/dist/components/RoleOverview/PermissionsCard.esm.js.map +1 -0
- package/dist/components/RoleOverview/PermissionsListColumns.esm.js +43 -0
- package/dist/components/RoleOverview/PermissionsListColumns.esm.js.map +1 -0
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js +49 -0
- package/dist/components/RoleOverview/RoleOverviewPage.esm.js.map +1 -0
- package/dist/components/RolesList/DeleteRole.esm.js +32 -0
- package/dist/components/RolesList/DeleteRole.esm.js.map +1 -0
- package/dist/components/RolesList/DeleteRoleDialog.esm.js +142 -0
- package/dist/components/RolesList/DeleteRoleDialog.esm.js.map +1 -0
- package/dist/components/RolesList/RolesList.esm.js +102 -0
- package/dist/components/RolesList/RolesList.esm.js.map +1 -0
- package/dist/components/RolesList/RolesListColumns.esm.js +76 -0
- package/dist/components/RolesList/RolesListColumns.esm.js.map +1 -0
- package/dist/components/RolesList/RolesListToolbar.esm.js +48 -0
- package/dist/components/RolesList/RolesListToolbar.esm.js.map +1 -0
- package/dist/components/Router.esm.js +57 -0
- package/dist/components/Router.esm.js.map +1 -0
- package/dist/components/SnackbarAlert.esm.js +23 -0
- package/dist/components/SnackbarAlert.esm.js.map +1 -0
- package/dist/components/ToastContext.esm.js +19 -0
- package/dist/components/ToastContext.esm.js.map +1 -0
- package/dist/components/index.esm.js +5 -0
- package/dist/components/index.esm.js.map +1 -0
- package/dist/hooks/useCheckIfLicensePluginEnabled.esm.js +20 -0
- package/dist/hooks/useCheckIfLicensePluginEnabled.esm.js.map +1 -0
- package/dist/hooks/useConditionRules.esm.js +64 -0
- package/dist/hooks/useConditionRules.esm.js.map +1 -0
- package/dist/hooks/useLocationToast.esm.js +15 -0
- package/dist/hooks/useLocationToast.esm.js.map +1 -0
- package/dist/hooks/useMembers.esm.js +92 -0
- package/dist/hooks/useMembers.esm.js.map +1 -0
- package/dist/hooks/usePermissionPolicies.esm.js +80 -0
- package/dist/hooks/usePermissionPolicies.esm.js.map +1 -0
- package/dist/hooks/useRole.esm.js +23 -0
- package/dist/hooks/useRole.esm.js.map +1 -0
- package/dist/hooks/useRoles.esm.js +169 -0
- package/dist/hooks/useRoles.esm.js.map +1 -0
- package/dist/hooks/useSelectedMembers.esm.js +39 -0
- package/dist/hooks/useSelectedMembers.esm.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.esm.js +4 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +49 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +23 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/utils/conditional-access-utils.esm.js +268 -0
- package/dist/utils/conditional-access-utils.esm.js.map +1 -0
- package/dist/utils/create-role-utils.esm.js +231 -0
- package/dist/utils/create-role-utils.esm.js.map +1 -0
- package/dist/utils/rbac-utils.esm.js +256 -0
- package/dist/utils/rbac-utils.esm.js.map +1 -0
- package/dist/utils/role-form-utils.esm.js +66 -0
- package/dist/utils/role-form-utils.esm.js.map +1 -0
- package/package.json +120 -0
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# RBAC frontend plugin for Backstage
|
|
2
|
+
|
|
3
|
+
The RBAC UI plugin offers a streamlined user interface for effectively managing permissions in your Backstage instance. It allows you to assign permissions to users and groups, empowering them to view, create, modify and delete Roles, provided they have the necessary permissions.
|
|
4
|
+
|
|
5
|
+
## For administrators
|
|
6
|
+
|
|
7
|
+
### Installation
|
|
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
|
+
#### Prerequisites
|
|
17
|
+
|
|
18
|
+
Follow the RBAC backend plugin [README](https://github.com/backstage/community-plugins/blob/main/workspaces/rbac/plugins/rbac-backend/README.md) to integrate rbac in your Backstage instance.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
**NOTE**
|
|
23
|
+
|
|
24
|
+
- For non-admin users, to enable create/edit role button on Administration -> RBAC roles list page, the role associated with your user should have the following permission policies associated with it. Add the following in your permission policies configuration file:
|
|
25
|
+
|
|
26
|
+
```CSV
|
|
27
|
+
p, role:default/team_a, catalog-entity, read, allow
|
|
28
|
+
p, role:default/team_a, policy-entity, read, allow
|
|
29
|
+
p, role:default/team_a, policy-entity, create, allow
|
|
30
|
+
g, user:default/<login-id/user-name>, role:default/team_a
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
> Note: Make sure required users/groups are available in catalog as a role cannot be created without users/groups.
|
|
34
|
+
|
|
35
|
+
> 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
|
+
|
|
37
|
+
- To fetch the permissions from other plugins like `Kubernetes` and `Jenkins` in the Role Form as mentioned [here](https://github.com/janus-idp/backstage-plugins/blob/main/plugins/rbac-backend/docs/permissions.md), add the following configuration in your `app-config.yaml`:
|
|
38
|
+
|
|
39
|
+
```yaml title="app-config.yaml"
|
|
40
|
+
permission:
|
|
41
|
+
enabled: true
|
|
42
|
+
rbac:
|
|
43
|
+
pluginsWithPermission:
|
|
44
|
+
- kubernetes
|
|
45
|
+
- jenkins
|
|
46
|
+
admin:
|
|
47
|
+
users:
|
|
48
|
+
- name: user:default/<user-name>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
#### Procedure
|
|
54
|
+
|
|
55
|
+
1. Install the RBAC UI plugin executing the following command from the Backstage root directory :
|
|
56
|
+
|
|
57
|
+
```console
|
|
58
|
+
yarn workspace app add @backstage-community/plugin-rbac
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2. Add Route in `packages/app/src/App.tsx`:
|
|
62
|
+
|
|
63
|
+
```tsx title="packages/app/src/App.tsx"
|
|
64
|
+
/* highlight-add-next-line */
|
|
65
|
+
import { RbacPage } from '@backstage-community/plugin-rbac';
|
|
66
|
+
|
|
67
|
+
<Route path="/rbac" element={<RbacPage />} />;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
3. Add **Administration** Sidebar Item in `packages/app/src/components/Root/Root.tsx`:
|
|
71
|
+
|
|
72
|
+
```tsx title="packages/app/src/components/Root/Root.tsx"
|
|
73
|
+
/* highlight-add-next-line */
|
|
74
|
+
import { Administration } from '@backstage-community/plugin-rbac';
|
|
75
|
+
|
|
76
|
+
export const Root = ({ children }: PropsWithChildren<{}>) => (
|
|
77
|
+
<SidebarPage>
|
|
78
|
+
<Sidebar>
|
|
79
|
+
...
|
|
80
|
+
<Administration />
|
|
81
|
+
...
|
|
82
|
+
</Sidebar>
|
|
83
|
+
</SidebarPage>
|
|
84
|
+
);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
4. For users with vanilla backstage instance, would need to integrate [`Auth`](https://backstage.io/docs/auth/) in to the instance:
|
|
88
|
+
|
|
89
|
+
- ```yaml title="app-config.yaml"
|
|
90
|
+
# see https://backstage.io/docs/auth/ to learn about auth providers
|
|
91
|
+
environment: development
|
|
92
|
+
providers:
|
|
93
|
+
# Plugin: GitHub
|
|
94
|
+
github:
|
|
95
|
+
development:
|
|
96
|
+
clientId: ${GITHUB_BUCKET_CLIENT_ID}
|
|
97
|
+
clientSecret: ${GITHUB_BUCKET_SECRET}
|
|
98
|
+
# Plugin: BitBucket
|
|
99
|
+
bitbucket:
|
|
100
|
+
development:
|
|
101
|
+
clientId: ${BIT_BUCKET_CLIENT_ID}
|
|
102
|
+
clientSecret: ${BIT_BUCKET_SECRET}
|
|
103
|
+
...
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- Integrate the [`SignIn`](https://backstage.io/docs/auth/#sign-in-configuration) component to be able to sign-in to the Backstage instance.
|
package/app-config.yaml
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
dynamicPlugins:
|
|
2
|
+
frontend:
|
|
3
|
+
backstage-community.backstage-plugin-rbac:
|
|
4
|
+
appIcons:
|
|
5
|
+
- name: rbacIcon
|
|
6
|
+
importName: RbacIcon
|
|
7
|
+
module: RbacPlugin
|
|
8
|
+
dynamicRoutes:
|
|
9
|
+
- path: /rbac
|
|
10
|
+
module: RbacPlugin
|
|
11
|
+
importName: RbacPage
|
|
12
|
+
menuItem:
|
|
13
|
+
icon: rbacIcon
|
|
14
|
+
text: RBAC
|
|
15
|
+
menuItems:
|
|
16
|
+
rbac:
|
|
17
|
+
parent: admin
|
|
18
|
+
icon: rbacIcon
|
|
19
|
+
priority: 10
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createApiRef } from '@backstage/core-plugin-api';
|
|
2
|
+
|
|
3
|
+
const licensedUsersApiRef = createApiRef({
|
|
4
|
+
id: "plugin.licensed-users-info.service"
|
|
5
|
+
});
|
|
6
|
+
class LicensedUsersAPIClient {
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
configApi;
|
|
9
|
+
identityApi;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.configApi = options.configApi;
|
|
12
|
+
this.identityApi = options.identityApi;
|
|
13
|
+
}
|
|
14
|
+
async isLicensePluginEnabled() {
|
|
15
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
16
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
17
|
+
const jsonResponse = await fetch(
|
|
18
|
+
`${backendUrl}/api/licensed-users-info/health`,
|
|
19
|
+
{
|
|
20
|
+
headers: {
|
|
21
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
return jsonResponse.ok;
|
|
26
|
+
}
|
|
27
|
+
async downloadStatistics() {
|
|
28
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
29
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
30
|
+
const response = await fetch(
|
|
31
|
+
`${backendUrl}/api/licensed-users-info/users`,
|
|
32
|
+
{
|
|
33
|
+
method: "GET",
|
|
34
|
+
headers: {
|
|
35
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
36
|
+
"Content-Type": "text/csv"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { LicensedUsersAPIClient, licensedUsersApiRef };
|
|
45
|
+
//# sourceMappingURL=LicensedUsersClient.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicensedUsersClient.esm.js","sources":["../../src/api/LicensedUsersClient.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 ConfigApi,\n createApiRef,\n IdentityApi,\n} from '@backstage/core-plugin-api';\n\nexport type LicensedUsersAPI = {\n isLicensePluginEnabled(): Promise<boolean>;\n downloadStatistics: () => Promise<Response>;\n};\n\n// @public\nexport const licensedUsersApiRef = createApiRef<LicensedUsersAPI>({\n id: 'plugin.licensed-users-info.service',\n});\n\nexport type Options = {\n configApi: ConfigApi;\n identityApi: IdentityApi;\n};\n\nexport class LicensedUsersAPIClient implements LicensedUsersAPI {\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 async isLicensePluginEnabled(): Promise<boolean> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const jsonResponse = await fetch(\n `${backendUrl}/api/licensed-users-info/health`,\n {\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n },\n );\n\n return jsonResponse.ok;\n }\n\n async downloadStatistics(): Promise<Response> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const backendUrl = this.configApi.getString('backend.baseUrl');\n const response = await fetch(\n `${backendUrl}/api/licensed-users-info/users`,\n {\n method: 'GET',\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n 'Content-Type': 'text/csv',\n },\n },\n );\n return response;\n }\n}\n"],"names":[],"mappings":";;AA2BO,MAAM,sBAAsB,YAA+B,CAAA;AAAA,EAChE,EAAI,EAAA,oCAAA;AACN,CAAC,EAAA;AAOM,MAAM,sBAAmD,CAAA;AAAA;AAAA,EAE7C,SAAA,CAAA;AAAA,EACA,WAAA,CAAA;AAAA,EAEjB,YAAY,OAAkB,EAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA,CAAA;AACzB,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA,CAAA;AAAA,GAC7B;AAAA,EACA,MAAM,sBAA2C,GAAA;AAC/C,IAAA,MAAM,EAAE,KAAO,EAAA,OAAA,KAAY,MAAM,IAAA,CAAK,YAAY,cAAe,EAAA,CAAA;AACjE,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,iBAAiB,CAAA,CAAA;AAC7D,IAAA,MAAM,eAAe,MAAM,KAAA;AAAA,MACzB,GAAG,UAAU,CAAA,+BAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAS,EAAA;AAAA,UACP,GAAI,OAAW,IAAA,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,OAAO,CAAG,CAAA,EAAA;AAAA,SACtD;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAA,OAAO,YAAa,CAAA,EAAA,CAAA;AAAA,GACtB;AAAA,EAEA,MAAM,kBAAwC,GAAA;AAC5C,IAAA,MAAM,EAAE,KAAO,EAAA,OAAA,KAAY,MAAM,IAAA,CAAK,YAAY,cAAe,EAAA,CAAA;AACjE,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,iBAAiB,CAAA,CAAA;AAC7D,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,UAAU,CAAA,8BAAA,CAAA;AAAA,MACb;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA;AAAA,UACP,GAAI,OAAW,IAAA,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,OAAO,CAAG,CAAA,EAAA;AAAA,UACpD,cAAgB,EAAA,UAAA;AAAA,SAClB;AAAA,OACF;AAAA,KACF,CAAA;AACA,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AACF;;;;"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { parseEntityRef } from '@backstage/catalog-model';
|
|
2
|
+
import { createApiRef } from '@backstage/core-plugin-api';
|
|
3
|
+
|
|
4
|
+
const rbacApiRef = createApiRef({
|
|
5
|
+
id: "plugin.rbac.service"
|
|
6
|
+
});
|
|
7
|
+
class RBACBackendClient {
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
configApi;
|
|
10
|
+
identityApi;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.configApi = options.configApi;
|
|
13
|
+
this.identityApi = options.identityApi;
|
|
14
|
+
}
|
|
15
|
+
async getUserAuthorization() {
|
|
16
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
17
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
18
|
+
const jsonResponse = await fetch(`${backendUrl}/api/permission/`, {
|
|
19
|
+
headers: {
|
|
20
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return jsonResponse.json();
|
|
24
|
+
}
|
|
25
|
+
async getRoles() {
|
|
26
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
27
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
28
|
+
const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {
|
|
29
|
+
headers: {
|
|
30
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
34
|
+
return jsonResponse;
|
|
35
|
+
}
|
|
36
|
+
return jsonResponse.json();
|
|
37
|
+
}
|
|
38
|
+
async getPolicies() {
|
|
39
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
40
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
41
|
+
const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {
|
|
42
|
+
headers: {
|
|
43
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
47
|
+
return jsonResponse;
|
|
48
|
+
}
|
|
49
|
+
return jsonResponse.json();
|
|
50
|
+
}
|
|
51
|
+
async getAssociatedPolicies(entityReference) {
|
|
52
|
+
const { kind, namespace, name } = parseEntityRef(entityReference);
|
|
53
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
54
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
55
|
+
const jsonResponse = await fetch(
|
|
56
|
+
`${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,
|
|
57
|
+
{
|
|
58
|
+
headers: {
|
|
59
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
64
|
+
return jsonResponse;
|
|
65
|
+
}
|
|
66
|
+
return jsonResponse.json();
|
|
67
|
+
}
|
|
68
|
+
async deleteRole(role) {
|
|
69
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
70
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
71
|
+
const { kind, namespace, name } = parseEntityRef(role);
|
|
72
|
+
const jsonResponse = await fetch(
|
|
73
|
+
`${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,
|
|
74
|
+
{
|
|
75
|
+
headers: {
|
|
76
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
77
|
+
"Content-Type": "application/json"
|
|
78
|
+
},
|
|
79
|
+
method: "DELETE"
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
return jsonResponse;
|
|
83
|
+
}
|
|
84
|
+
async getRole(role) {
|
|
85
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
86
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
87
|
+
const { kind, namespace, name } = parseEntityRef(role);
|
|
88
|
+
const jsonResponse = await fetch(
|
|
89
|
+
`${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,
|
|
90
|
+
{
|
|
91
|
+
headers: {
|
|
92
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
93
|
+
"Content-Type": "application/json"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
98
|
+
return jsonResponse;
|
|
99
|
+
}
|
|
100
|
+
return jsonResponse.json();
|
|
101
|
+
}
|
|
102
|
+
async getMembers() {
|
|
103
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
104
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
105
|
+
const jsonResponse = await fetch(
|
|
106
|
+
`${backendUrl}/api/catalog/entities?filter=kind=user&filter=kind=group`,
|
|
107
|
+
{
|
|
108
|
+
headers: {
|
|
109
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
110
|
+
"Content-Type": "application/json"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
115
|
+
return jsonResponse;
|
|
116
|
+
}
|
|
117
|
+
return jsonResponse.json();
|
|
118
|
+
}
|
|
119
|
+
async listPermissions() {
|
|
120
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
121
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
122
|
+
const jsonResponse = await fetch(
|
|
123
|
+
`${backendUrl}/api/permission/plugins/policies`,
|
|
124
|
+
{
|
|
125
|
+
headers: {
|
|
126
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
127
|
+
"Content-Type": "application/json"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 204) {
|
|
132
|
+
return jsonResponse;
|
|
133
|
+
}
|
|
134
|
+
return jsonResponse.json();
|
|
135
|
+
}
|
|
136
|
+
async createRole(role) {
|
|
137
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
138
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
139
|
+
const jsonResponse = await fetch(`${backendUrl}/api/permission/roles`, {
|
|
140
|
+
method: "POST",
|
|
141
|
+
headers: {
|
|
142
|
+
"Content-Type": "application/json",
|
|
143
|
+
Accept: "application/json",
|
|
144
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
145
|
+
},
|
|
146
|
+
body: JSON.stringify(role)
|
|
147
|
+
});
|
|
148
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {
|
|
149
|
+
return jsonResponse.json();
|
|
150
|
+
}
|
|
151
|
+
return jsonResponse;
|
|
152
|
+
}
|
|
153
|
+
async updateRole(oldRole, newRole) {
|
|
154
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
155
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
156
|
+
const { kind, namespace, name } = parseEntityRef(oldRole.name);
|
|
157
|
+
const body = {
|
|
158
|
+
oldRole,
|
|
159
|
+
newRole
|
|
160
|
+
};
|
|
161
|
+
const jsonResponse = await fetch(
|
|
162
|
+
`${backendUrl}/api/permission/roles/${kind}/${namespace}/${name}`,
|
|
163
|
+
{
|
|
164
|
+
method: "PUT",
|
|
165
|
+
headers: {
|
|
166
|
+
"Content-Type": "application/json",
|
|
167
|
+
Accept: "application/json",
|
|
168
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify(body)
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201 && jsonResponse.status !== 204) {
|
|
174
|
+
return jsonResponse.json();
|
|
175
|
+
}
|
|
176
|
+
return jsonResponse;
|
|
177
|
+
}
|
|
178
|
+
async updatePolicies(entityReference, oldPolicies, newPolicies) {
|
|
179
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
180
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
181
|
+
const { kind, namespace, name } = parseEntityRef(entityReference);
|
|
182
|
+
const body = {
|
|
183
|
+
oldPolicy: oldPolicies,
|
|
184
|
+
newPolicy: newPolicies
|
|
185
|
+
};
|
|
186
|
+
const jsonResponse = await fetch(
|
|
187
|
+
`${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,
|
|
188
|
+
{
|
|
189
|
+
method: "PUT",
|
|
190
|
+
headers: {
|
|
191
|
+
"Content-Type": "application/json",
|
|
192
|
+
Accept: "application/json",
|
|
193
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
194
|
+
},
|
|
195
|
+
body: JSON.stringify(body)
|
|
196
|
+
}
|
|
197
|
+
);
|
|
198
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {
|
|
199
|
+
return jsonResponse.json();
|
|
200
|
+
}
|
|
201
|
+
return jsonResponse;
|
|
202
|
+
}
|
|
203
|
+
async deletePolicies(entityReference, policies) {
|
|
204
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
205
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
206
|
+
const { kind, namespace, name } = parseEntityRef(entityReference);
|
|
207
|
+
const jsonResponse = await fetch(
|
|
208
|
+
`${backendUrl}/api/permission/policies/${kind}/${namespace}/${name}`,
|
|
209
|
+
{
|
|
210
|
+
headers: {
|
|
211
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
212
|
+
"Content-Type": "application/json",
|
|
213
|
+
Accept: "application/json"
|
|
214
|
+
},
|
|
215
|
+
body: JSON.stringify(policies),
|
|
216
|
+
method: "DELETE"
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201 && jsonResponse.status !== 204) {
|
|
220
|
+
return jsonResponse.json();
|
|
221
|
+
}
|
|
222
|
+
return jsonResponse;
|
|
223
|
+
}
|
|
224
|
+
async createPolicies(policies) {
|
|
225
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
226
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
227
|
+
const jsonResponse = await fetch(`${backendUrl}/api/permission/policies`, {
|
|
228
|
+
method: "POST",
|
|
229
|
+
headers: {
|
|
230
|
+
"Content-Type": "application/json",
|
|
231
|
+
Accept: "application/json",
|
|
232
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
233
|
+
},
|
|
234
|
+
body: JSON.stringify(policies)
|
|
235
|
+
});
|
|
236
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {
|
|
237
|
+
return jsonResponse.json();
|
|
238
|
+
}
|
|
239
|
+
return jsonResponse;
|
|
240
|
+
}
|
|
241
|
+
async getPluginsConditionRules() {
|
|
242
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
243
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
244
|
+
const jsonResponse = await fetch(
|
|
245
|
+
`${backendUrl}/api/permission/plugins/condition-rules`,
|
|
246
|
+
{
|
|
247
|
+
headers: {
|
|
248
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
249
|
+
"Content-Type": "application/json"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
if (jsonResponse.status !== 200) {
|
|
254
|
+
return jsonResponse;
|
|
255
|
+
}
|
|
256
|
+
return jsonResponse.json();
|
|
257
|
+
}
|
|
258
|
+
async createConditionalPermission(conditionalPermission) {
|
|
259
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
260
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
261
|
+
const jsonResponse = await fetch(
|
|
262
|
+
`${backendUrl}/api/permission/roles/conditions`,
|
|
263
|
+
{
|
|
264
|
+
method: "POST",
|
|
265
|
+
headers: {
|
|
266
|
+
"Content-Type": "application/json",
|
|
267
|
+
Accept: "application/json",
|
|
268
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
269
|
+
},
|
|
270
|
+
body: JSON.stringify(conditionalPermission)
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {
|
|
274
|
+
return jsonResponse.json();
|
|
275
|
+
}
|
|
276
|
+
return jsonResponse;
|
|
277
|
+
}
|
|
278
|
+
async getRoleConditions(roleRef) {
|
|
279
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
280
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
281
|
+
const jsonResponse = await fetch(
|
|
282
|
+
`${backendUrl}/api/permission/roles/conditions?roleEntityRef=${roleRef}`,
|
|
283
|
+
{
|
|
284
|
+
headers: {
|
|
285
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
286
|
+
"Content-Type": "application/json"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
if (jsonResponse.status !== 200) {
|
|
291
|
+
return jsonResponse;
|
|
292
|
+
}
|
|
293
|
+
return jsonResponse.json();
|
|
294
|
+
}
|
|
295
|
+
async updateConditionalPolicies(conditionId, data) {
|
|
296
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
297
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
298
|
+
const jsonResponse = await fetch(
|
|
299
|
+
`${backendUrl}/api/permission/roles/conditions/${conditionId}}`,
|
|
300
|
+
{
|
|
301
|
+
method: "PUT",
|
|
302
|
+
headers: {
|
|
303
|
+
"Content-Type": "application/json",
|
|
304
|
+
Accept: "application/json",
|
|
305
|
+
...idToken && { Authorization: `Bearer ${idToken}` }
|
|
306
|
+
},
|
|
307
|
+
body: JSON.stringify(data)
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201) {
|
|
311
|
+
return jsonResponse.json();
|
|
312
|
+
}
|
|
313
|
+
return jsonResponse;
|
|
314
|
+
}
|
|
315
|
+
async deleteConditionalPolicies(conditionId) {
|
|
316
|
+
const { token: idToken } = await this.identityApi.getCredentials();
|
|
317
|
+
const backendUrl = this.configApi.getString("backend.baseUrl");
|
|
318
|
+
const jsonResponse = await fetch(
|
|
319
|
+
`${backendUrl}/api/permission/roles/conditions/${conditionId}`,
|
|
320
|
+
{
|
|
321
|
+
headers: {
|
|
322
|
+
...idToken && { Authorization: `Bearer ${idToken}` },
|
|
323
|
+
"Content-Type": "application/json",
|
|
324
|
+
Accept: "application/json"
|
|
325
|
+
},
|
|
326
|
+
method: "DELETE"
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
if (jsonResponse.status !== 200 && jsonResponse.status !== 201 && jsonResponse.status !== 204) {
|
|
330
|
+
return jsonResponse.json();
|
|
331
|
+
}
|
|
332
|
+
return jsonResponse;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export { RBACBackendClient, rbacApiRef };
|
|
337
|
+
//# sourceMappingURL=RBACBackendClient.esm.js.map
|
|
@@ -0,0 +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// @public\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// @public\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 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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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useAsync } from 'react-use';
|
|
3
|
+
import { SidebarItem } from '@backstage/core-components';
|
|
4
|
+
import { useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
5
|
+
import RbacIcon from '@mui/icons-material/VpnKeyOutlined';
|
|
6
|
+
import { rbacApiRef } from '../api/RBACBackendClient.esm.js';
|
|
7
|
+
|
|
8
|
+
const Administration = () => {
|
|
9
|
+
const rbacApi = useApi(rbacApiRef);
|
|
10
|
+
const { loading: isUserLoading, value: result } = useAsync(
|
|
11
|
+
async () => await rbacApi.getUserAuthorization(),
|
|
12
|
+
[]
|
|
13
|
+
);
|
|
14
|
+
const config = useApi(configApiRef);
|
|
15
|
+
const isRBACPluginEnabled = config.getOptionalBoolean("permission.enabled");
|
|
16
|
+
if (!isUserLoading && isRBACPluginEnabled) {
|
|
17
|
+
return result?.status === "Authorized" ? /* @__PURE__ */ React.createElement(SidebarItem, { text: "RBAC", to: "rbac", icon: RbacIcon }) : null;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { Administration };
|
|
23
|
+
//# sourceMappingURL=Administration.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Administration.esm.js","sources":["../../src/components/Administration.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 React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { SidebarItem } from '@backstage/core-components';\nimport {\n configApiRef,\n IconComponent,\n useApi,\n} from '@backstage/core-plugin-api';\n\nimport { default as RbacIcon } from '@mui/icons-material/VpnKeyOutlined';\n\nimport { rbacApiRef } from '../api/RBACBackendClient';\n\nexport const Administration = () => {\n const rbacApi = useApi(rbacApiRef);\n const { loading: isUserLoading, value: result } = useAsync(\n async () => await rbacApi.getUserAuthorization(),\n [],\n );\n\n const config = useApi(configApiRef);\n const isRBACPluginEnabled = config.getOptionalBoolean('permission.enabled');\n\n if (!isUserLoading && isRBACPluginEnabled) {\n return result?.status === 'Authorized' ? (\n <SidebarItem text=\"RBAC\" to=\"rbac\" icon={RbacIcon as IconComponent} />\n ) : null;\n }\n return null;\n};\n"],"names":[],"mappings":";;;;;;;AA6BO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,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,EAAC;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA,CAAA;AAClC,EAAM,MAAA,mBAAA,GAAsB,MAAO,CAAA,kBAAA,CAAmB,oBAAoB,CAAA,CAAA;AAE1E,EAAI,IAAA,CAAC,iBAAiB,mBAAqB,EAAA;AACzC,IAAO,OAAA,MAAA,EAAQ,MAAW,KAAA,YAAA,mBACvB,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,IAAK,EAAA,MAAA,EAAO,EAAG,EAAA,MAAA,EAAO,IAAM,EAAA,QAAA,EAA2B,CAClE,GAAA,IAAA,CAAA;AAAA,GACN;AACA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Typography } from '@material-ui/core';
|
|
3
|
+
import Tooltip from '@material-ui/core/Tooltip';
|
|
4
|
+
import HelpOutlineIcon from '@material-ui/icons/HelpOutline';
|
|
5
|
+
|
|
6
|
+
const AddNestedConditionButton = () => {
|
|
7
|
+
const tooltipTitle = () => /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", component: "p", align: "center" }, "Nested conditions are ", /* @__PURE__ */ React.createElement("b", null, "1 layer rules within a main condition"), ". It lets you allow appropriate access by using detailed permissions based on various conditions. You can add multiple nested conditions."), /* @__PURE__ */ React.createElement(Typography, { variant: "body1", component: "p", align: "center" }, "For example, you can allow access to all entity types in the main condition and use a nested condition to limit the access to entities owned by the user."));
|
|
8
|
+
return /* @__PURE__ */ React.createElement(
|
|
9
|
+
Box,
|
|
10
|
+
{
|
|
11
|
+
style: {
|
|
12
|
+
display: "flex",
|
|
13
|
+
justifyContent: "center",
|
|
14
|
+
alignItems: "center"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
/* @__PURE__ */ React.createElement(Typography, { variant: "body1", component: "span" }, "Add Nested Condition"),
|
|
18
|
+
/* @__PURE__ */ React.createElement(Tooltip, { title: tooltipTitle(), placement: "top" }, /* @__PURE__ */ React.createElement(HelpOutlineIcon, { fontSize: "inherit", style: { marginLeft: "0.25rem" } }))
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { AddNestedConditionButton };
|
|
23
|
+
//# sourceMappingURL=AddNestedConditionButton.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddNestedConditionButton.esm.js","sources":["../../../src/components/ConditionalAccess/AddNestedConditionButton.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 React from 'react';\n\nimport { Box, Typography } from '@material-ui/core';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline';\n\nexport const AddNestedConditionButton = () => {\n const tooltipTitle = () => (\n <div>\n <Typography variant=\"body1\" component=\"p\" align=\"center\">\n Nested conditions are <b>1 layer rules within a main condition</b>. It\n lets you allow appropriate access by using detailed permissions based on\n various conditions. You can add multiple nested conditions.\n </Typography>\n <Typography variant=\"body1\" component=\"p\" align=\"center\">\n For example, you can allow access to all entity types in the main\n condition and use a nested condition to limit the access to entities\n owned by the user.\n </Typography>\n </div>\n );\n return (\n <Box\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Typography variant=\"body1\" component=\"span\">\n Add Nested Condition\n </Typography>\n <Tooltip title={tooltipTitle()} placement=\"top\">\n <HelpOutlineIcon fontSize=\"inherit\" style={{ marginLeft: '0.25rem' }} />\n </Tooltip>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;AAqBO,MAAM,2BAA2B,MAAM;AAC5C,EAAA,MAAM,YAAe,GAAA,sBAClB,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAQ,SAAU,EAAA,GAAA,EAAI,KAAM,EAAA,QAAA,EAAA,EAAS,wBACjC,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAE,EAAA,IAAA,EAAA,uCAAqC,CAAI,EAAA,2IAGpE,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,SAAA,EAAU,GAAI,EAAA,KAAA,EAAM,QAAS,EAAA,EAAA,2JAIzD,CACF,CAAA,CAAA;AAEF,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,cAAgB,EAAA,QAAA;AAAA,QAChB,UAAY,EAAA,QAAA;AAAA,OACd;AAAA,KAAA;AAAA,wCAEC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,SAAA,EAAU,UAAO,sBAE7C,CAAA;AAAA,wCACC,OAAQ,EAAA,EAAA,KAAA,EAAO,YAAa,EAAA,EAAG,WAAU,KACxC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAgB,EAAA,EAAA,QAAA,EAAS,WAAU,KAAO,EAAA,EAAE,UAAY,EAAA,SAAA,IAAa,CACxE,CAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
|