Skip to content

Commit 302c0dd

Browse files
authored
Add support for matching multiple resources in SecureComponent (#1536)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
1 parent 3d70427 commit 302c0dd

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

portal-ui/src/common/SecureComponent/SecureComponent.tsx

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { store } from "../../store";
1919
import { hasAccessToResource } from "./permissions";
2020

2121
export const hasPermission = (
22-
resource: string | undefined,
22+
resource: string | string[] | undefined,
2323
scopes: string[],
2424
matchAll?: boolean,
2525
containsResource?: boolean
@@ -29,17 +29,31 @@ export const hasPermission = (
2929
}
3030
const state = store.getState();
3131
const sessionGrants = state.console.session.permissions || {};
32-
const resourceGrants =
33-
sessionGrants[resource] ||
34-
sessionGrants[`arn:aws:s3:::${resource}/*`] ||
35-
[];
32+
3633
const globalGrants = sessionGrants["arn:aws:s3:::*"] || [];
34+
let resources: string[] = [];
35+
let resourceGrants: string[] = [];
3736
let containsResourceGrants: string[] = [];
38-
if (containsResource) {
39-
const matchResource = `arn:aws:s3:::${resource}`;
40-
for (const [key, value] of Object.entries(sessionGrants)) {
41-
if (key.includes(matchResource)) {
42-
containsResourceGrants = containsResourceGrants.concat(value);
37+
38+
if (Array.isArray(resource)) {
39+
resources = resources.concat(resource);
40+
} else {
41+
resources.push(resource);
42+
}
43+
for (let i = 0; i < resources.length; i++) {
44+
if (resources[i]) {
45+
resourceGrants = resourceGrants.concat(
46+
sessionGrants[resources[i]] ||
47+
sessionGrants[`arn:aws:s3:::${resources[i]}/*`] ||
48+
[]
49+
);
50+
if (containsResource) {
51+
const matchResource = `arn:aws:s3:::${resources[i]}`;
52+
for (const [key, value] of Object.entries(sessionGrants)) {
53+
if (key.includes(matchResource)) {
54+
containsResourceGrants = containsResourceGrants.concat(value);
55+
}
56+
}
4357
}
4458
}
4559
}
@@ -56,7 +70,7 @@ interface ISecureComponentProps {
5670
matchAll?: boolean;
5771
children: any;
5872
scopes: string[];
59-
resource: string;
73+
resource: string | string[];
6074
containsResource?: boolean;
6175
}
6276

portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,6 @@ const ListBuckets = ({
176176

177177
const renderItemLine = (index: number) => {
178178
const bucket = filteredRecords[index] || null;
179-
180179
if (bucket) {
181180
return (
182181
<BucketListItem
@@ -188,10 +187,12 @@ const ListBuckets = ({
188187
/>
189188
);
190189
}
191-
192190
return null;
193191
};
194192

193+
const createBucketButtonResources: string[] =
194+
Array.from(Object.keys(session.permissions)) || [];
195+
195196
return (
196197
<Fragment>
197198
{deleteOpen && (
@@ -263,7 +264,7 @@ const ListBuckets = ({
263264

264265
<SecureComponent
265266
scopes={[IAM_SCOPES.S3_CREATE_BUCKET]}
266-
resource={CONSOLE_UI_RESOURCE}
267+
resource={createBucketButtonResources}
267268
errorProps={{ disabled: true }}
268269
>
269270
<RBIconButton

portal-ui/src/screens/Console/Console.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ const Console = ({
218218
{
219219
component: Buckets,
220220
path: IAM_PAGES.ADD_BUCKETS,
221+
customPermissionFnc: () => {
222+
const createBucketResources: string[] =
223+
Array.from(Object.keys(session.permissions)) || [];
224+
return hasPermission(
225+
createBucketResources,
226+
IAM_PAGES_PERMISSIONS[IAM_PAGES.ADD_BUCKETS]
227+
);
228+
},
221229
},
222230
{
223231
component: Buckets,

0 commit comments

Comments
 (0)