diff --git a/Makefile b/Makefile index 946e786f90..f41ec2cdca 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ swagger-console: assets: @(if [ -f "${NVM_DIR}/nvm.sh" ]; then \. "${NVM_DIR}/nvm.sh" && nvm install && nvm use && npm install -g yarn ; fi &&\ - cd web-app; corepack enable; yarn install --prefer-offline; make build-static; yarn prettier --write . --loglevel warn; cd ..) + cd web-app; corepack enable; yarn install --prefer-offline; make build-static; yarn prettier --write . --log-level warn; cd ..) test-integration: @(docker stop pgsqlcontainer || true) diff --git a/web-app/package.json b/web-app/package.json index 5217f9ad45..2b04906c70 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -7,6 +7,7 @@ "dependencies": { "@reduxjs/toolkit": "^1.9.7", "clsx": "^2.1.1", + "dompurify": "^3.2.4", "http-status-codes": "^2.3.0", "kbar": "^0.1.0-beta.45", "local-storage-fallback": "^4.1.2", @@ -78,6 +79,7 @@ "@types/webpack-env": "^1.18.5", "babel-plugin-istanbul": "^6.1.1", "customize-cra": "^1.0.0", + "dompurify": "^3.2.4", "knip": "^5.27.2", "minio": "^8.0.1", "nyc": "^15.1.0", diff --git a/web-app/src/common/SecureComponent/__tests__/accessControl.test.ts b/web-app/src/common/SecureComponent/__tests__/accessControl.test.ts index f616d56ccd..5cd0ceacf9 100644 --- a/web-app/src/common/SecureComponent/__tests__/accessControl.test.ts +++ b/web-app/src/common/SecureComponent/__tests__/accessControl.test.ts @@ -176,7 +176,7 @@ test("Can delete an object inside a bucket prefix", () => { "xref_cust_guid_actd-v1.jpg", "test/digitalinsights/xref_cust_guid_actd-v1.jpg", ], - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], ), ).toBe(true); }); @@ -186,7 +186,7 @@ test("Can't delete an object inside a bucket prefix", () => { expect( hasPermission( ["xref_cust_guid_actd-v1.jpg", "test/xref_cust_guid_actd-v1.jpg"], - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], ), ).toBe(false); }); diff --git a/web-app/src/common/SecureComponent/permissions.ts b/web-app/src/common/SecureComponent/permissions.ts index 481b93f9d6..71d2afc1fa 100644 --- a/web-app/src/common/SecureComponent/permissions.ts +++ b/web-app/src/common/SecureComponent/permissions.ts @@ -30,6 +30,7 @@ export const IAM_SCOPES = { S3_PUT_OBJECT: "s3:PutObject", S3_GET_ACTIONS: "s3:Get*", S3_PUT_ACTIONS: "s3:Put*", + S3_DELETE_ACTIONS: "s3:Delete*", S3_GET_OBJECT_LEGAL_HOLD: "s3:GetObjectLegalHold", S3_PUT_OBJECT_LEGAL_HOLD: "s3:PutObjectLegalHold", S3_DELETE_OBJECT: "s3:DeleteObject", @@ -197,6 +198,7 @@ export const IAM_PERMISSIONS = { IAM_SCOPES.S3_PUT_OBJECT, IAM_SCOPES.S3_PUT_ACTIONS, IAM_SCOPES.S3_DELETE_OBJECT, + IAM_SCOPES.S3_DELETE_ACTIONS, ], [IAM_ROLES.BUCKET_VIEWER]: [ IAM_SCOPES.S3_LIST_BUCKET, diff --git a/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx b/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx index 98d929ad7b..f55990a589 100644 --- a/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx +++ b/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx @@ -278,7 +278,7 @@ const ListObjects = () => { ]); const canDelete = hasPermission( [pathAsResourceInPolicy, ...sessionGrantWildCards], - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], ); const canUpload = hasPermission( @@ -912,7 +912,7 @@ const ListObjects = () => { tooltip: canDelete ? "Delete Selected Files" : permissionTooltipHelper( - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], "delete objects in this bucket", ), }, diff --git a/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx b/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx index 52a222be00..335edb2400 100644 --- a/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx +++ b/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx @@ -352,7 +352,7 @@ const ObjectDetailPanel = ({ ]); const canDelete = hasPermission( [bucketName, currentItem, [bucketName, actualInfo.name].join("/")], - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], ); let objectType: AllowedPreviews = previewObjectType(metaData, currentItem); @@ -649,7 +649,7 @@ const ObjectDetailPanel = ({ canDelete ? "" : permissionTooltipHelper( - [IAM_SCOPES.S3_DELETE_OBJECT], + [IAM_SCOPES.S3_DELETE_OBJECT, IAM_SCOPES.S3_DELETE_ACTIONS], "delete this object", ) } @@ -665,7 +665,10 @@ const ObjectDetailPanel = ({ currentItem, [bucketName, actualInfo.name].join("/"), ]} - scopes={[IAM_SCOPES.S3_DELETE_OBJECT]} + scopes={[ + IAM_SCOPES.S3_DELETE_OBJECT, + IAM_SCOPES.S3_DELETE_ACTIONS, + ]} errorProps={{ disabled: true }} >