Skip to content

Commit 60d70e3

Browse files
authored
Added anonymous access modal in folder selection (#2736)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
1 parent 5e65f2a commit 60d70e3

File tree

9 files changed

+90
-16
lines changed

9 files changed

+90
-16
lines changed

portal-ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"local-storage-fallback": "^4.1.1",
1919
"lodash": "^4.17.21",
2020
"luxon": "^3.3.0",
21-
"mds": "https://github.com/minio/mds.git#v0.3.1",
21+
"mds": "https://github.com/minio/mds.git#v0.3.2",
2222
"minio": "^7.0.32",
2323
"react": "^18.1.0",
2424
"react-component-export-image": "^1.0.6",

portal-ui/src/screens/Console/Buckets/BucketDetails/AddAccessRule.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

17-
import React, { useState } from "react";
17+
import React, { useState, useEffect } from "react";
1818
import ModalWrapper from "../../Common/ModalWrapper/ModalWrapper";
1919
import { Grid } from "@mui/material";
2020
import { AddAccessRuleIcon, Button } from "mds";
@@ -30,14 +30,18 @@ import {
3030
import api from "../../../../common/api";
3131
import { ErrorResponseHandler } from "../../../../common/types";
3232
import SelectWrapper from "../../Common/FormComponents/SelectWrapper/SelectWrapper";
33-
import { setErrorSnackMessage } from "../../../../systemSlice";
33+
import {
34+
setErrorSnackMessage,
35+
setSnackBarMessage,
36+
} from "../../../../systemSlice";
3437
import { useAppDispatch } from "../../../../store";
3538

3639
interface IAddAccessRule {
3740
classes: any;
3841
modalOpen: boolean;
3942
onClose: () => any;
4043
bucket: string;
44+
prefilledRoute?: string;
4145
}
4246

4347
const styles = (theme: Theme) =>
@@ -51,12 +55,19 @@ const AddAccessRule = ({
5155
onClose,
5256
classes,
5357
bucket,
58+
prefilledRoute,
5459
}: IAddAccessRule) => {
5560
const dispatch = useAppDispatch();
5661

5762
const [prefix, setPrefix] = useState("");
5863
const [selectedAccess, setSelectedAccess] = useState<any>("readonly");
5964

65+
useEffect(() => {
66+
if (prefilledRoute) {
67+
setPrefix(prefilledRoute);
68+
}
69+
}, [prefilledRoute]);
70+
6071
const accessOptions = [
6172
{ label: "readonly", value: "readonly" },
6273
{ label: "writeonly", value: "writeonly" },
@@ -75,6 +86,7 @@ const AddAccessRule = ({
7586
access: selectedAccess,
7687
})
7788
.then((res: any) => {
89+
dispatch(setSnackBarMessage("Access Rule added successfully"));
7890
onClose();
7991
})
8092
.catch((err: ErrorResponseHandler) => {
@@ -86,7 +98,7 @@ const AddAccessRule = ({
8698
return (
8799
<ModalWrapper
88100
modalOpen={modalOpen}
89-
title="Add Access Rule"
101+
title="Add Anonymous Access Rule"
90102
onClose={onClose}
91103
titleIcon={<AddAccessRuleIcon />}
92104
>

portal-ui/src/screens/Console/Buckets/BucketDetails/DeleteAccessRule.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const DeleteAccessRule = ({
6161

6262
return (
6363
<ConfirmDialog
64-
title={`Delete Access Rule`}
64+
title={`Delete Anonymous Access Rule`}
6565
confirmText={"Delete"}
6666
isOpen={modalOpen}
6767
isLoading={deleteLoading}

portal-ui/src/screens/Console/Buckets/BucketDetails/EditAccessRule.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ const EditAccessRule = ({
8787
<React.Fragment>
8888
<ModalWrapper
8989
modalOpen={modalOpen}
90-
title={`Edit Access Rule for ${`${bucket}/${toEdit || ""}`}`}
90+
title={`Edit Anonymous Access Rule for ${`${bucket}/${toEdit || ""}`}`}
9191
onClose={onClose}
9292
titleIcon={<AddAccessRuleIcon />}
9393
>

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { useDropzone } from "react-dropzone";
2828
import { Theme } from "@mui/material/styles";
2929
import { CSSObject } from "styled-components";
3030
import {
31+
AccessRuleIcon,
3132
BucketsIcon,
3233
Button,
3334
DeleteIcon,
@@ -103,6 +104,7 @@ import {
103104
openList,
104105
resetMessages,
105106
resetRewind,
107+
setAnonymousAccessOpen,
106108
setDownloadRenameModal,
107109
setLoadingObjects,
108110
setLoadingRecords,
@@ -133,11 +135,13 @@ import TooltipWrapper from "../../../../Common/TooltipWrapper/TooltipWrapper";
133135
import ListObjectsTable from "./ListObjectsTable";
134136
import {
135137
downloadSelected,
138+
openAnonymousAccess,
136139
openPreview,
137140
openShare,
138141
} from "../../../../ObjectBrowser/objectBrowserThunks";
139142

140143
import FilterObjectsSB from "../../../../ObjectBrowser/FilterObjectsSB";
144+
import AddAccessRule from "../../../BucketDetails/AddAccessRule";
141145

142146
const DeleteMultipleObjects = withSuspense(
143147
React.lazy(() => import("./DeleteMultipleObjects"))
@@ -280,6 +284,9 @@ const ListObjects = () => {
280284
const colorVariants = useSelector(
281285
(state: AppState) => state.system.overrideStyles
282286
);
287+
const anonymousAccessOpen = useSelector(
288+
(state: AppState) => state.objectBrowser.anonymousAccessOpen
289+
);
283290

284291
const loadingBucket = useSelector(selBucketDetailsLoading);
285292
const bucketInfo = useSelector(selBucketDetailsInfo);
@@ -323,6 +330,13 @@ const ListObjects = () => {
323330
const displayDeleteObject = hasPermission(bucketName, [
324331
IAM_SCOPES.S3_DELETE_OBJECT,
325332
]);
333+
const canSetAnonymousAccess = hasPermission(bucketName, [
334+
IAM_SCOPES.S3_GET_BUCKET_POLICY,
335+
IAM_SCOPES.S3_PUT_BUCKET_POLICY,
336+
IAM_SCOPES.S3_GET_ACTIONS,
337+
IAM_SCOPES.S3_PUT_ACTIONS,
338+
]);
339+
326340
const selectedObjects = useSelector(
327341
(state: AppState) => state.objectBrowser.selectedObjects
328342
);
@@ -782,6 +796,10 @@ const ListObjects = () => {
782796
dispatch(setDownloadRenameModal(null));
783797
};
784798

799+
const closeAddAccessRule = () => {
800+
dispatch(setAnonymousAccessOpen(false));
801+
};
802+
785803
let createdTime = DateTime.now();
786804

787805
if (bucketInfo?.creation_date) {
@@ -855,6 +873,21 @@ const ListObjects = () => {
855873
icon: <PreviewIcon />,
856874
tooltip: canPreviewFile ? "Preview Selected File" : "Preview unavailable",
857875
},
876+
{
877+
action: () => {
878+
dispatch(openAnonymousAccess());
879+
},
880+
label: "Anonymous Access",
881+
disabled:
882+
selectedObjects.length !== 1 ||
883+
!selectedObjects[0].endsWith("/") ||
884+
!canSetAnonymousAccess,
885+
icon: <AccessRuleIcon />,
886+
tooltip:
887+
selectedObjects.length === 1 && selectedObjects[0].endsWith("/")
888+
? "Set Anonymous Access to this Folder"
889+
: "Anonymous Access unavailable",
890+
},
858891
{
859892
action: () => {
860893
setDeleteMultipleOpen(true);
@@ -925,6 +958,14 @@ const ListObjects = () => {
925958
}}
926959
/>
927960
)}
961+
{anonymousAccessOpen && (
962+
<AddAccessRule
963+
onClose={closeAddAccessRule}
964+
bucket={bucketName}
965+
modalOpen={anonymousAccessOpen}
966+
prefilledRoute={`${selectedObjects[0]}*`}
967+
/>
968+
)}
928969

929970
<PageLayout variant={"full"}>
930971
{anonymousMode && (

portal-ui/src/screens/Console/ObjectBrowser/objectBrowserSlice.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ const initialState: ObjectBrowserState = {
6767
previewOpen: false,
6868
shareFileModalOpen: false,
6969
isOpeningObjectDetail: false,
70+
anonymousAccessOpen: false,
7071
retentionConfig: {
7172
mode: "",
7273
unit: "",
@@ -361,6 +362,9 @@ export const objectBrowserSlice = createSlice({
361362
setLongFileOpen: (state, action: PayloadAction<boolean>) => {
362363
state.longFileOpen = action.payload;
363364
},
365+
setAnonymousAccessOpen: (state, action: PayloadAction<boolean>) => {
366+
state.anonymousAccessOpen = action.payload;
367+
},
364368
},
365369
});
366370
export const {
@@ -407,6 +411,7 @@ export const {
407411
setRetentionConfig,
408412
setSelectedBucket,
409413
setLongFileOpen,
414+
setAnonymousAccessOpen,
410415
} = objectBrowserSlice.actions;
411416

412417
export default objectBrowserSlice.reducer;

portal-ui/src/screens/Console/ObjectBrowser/objectBrowserThunks.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
cancelObjectInList,
2525
completeObject,
2626
failObject,
27+
setAnonymousAccessOpen,
2728
setDownloadRenameModal,
2829
setNewObject,
2930
setPreviewOpen,
@@ -155,3 +156,17 @@ export const openShare = createAsyncThunk(
155156
}
156157
}
157158
);
159+
160+
export const openAnonymousAccess = createAsyncThunk(
161+
"objectBrowser/openAnonymousAccess",
162+
async (_, { getState, dispatch }) => {
163+
const state = getState() as AppState;
164+
165+
if (
166+
state.objectBrowser.selectedObjects.length === 1 &&
167+
state.objectBrowser.selectedObjects[0].endsWith("/")
168+
) {
169+
dispatch(setAnonymousAccessOpen(true));
170+
}
171+
}
172+
);

portal-ui/src/screens/Console/ObjectBrowser/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export interface ObjectBrowserState {
9595
isOpeningObjectDetail: boolean;
9696
retentionConfig: IRetentionConfig | null;
9797
longFileOpen: boolean;
98+
anonymousAccessOpen: boolean;
9899
}
99100

100101
export interface ObjectManager {

portal-ui/yarn.lock

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4877,10 +4877,10 @@ destroy@1.2.0:
48774877
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
48784878
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
48794879

4880-
detect-gpu@^5.0.15:
4881-
version "5.0.15"
4882-
resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.15.tgz#d375f89b246f21167859efbbd89eff60ccbcfd4d"
4883-
integrity sha512-ImImgPRhTvo/bmtotR1KG534ZE+L6yIV9sMe4y3zOUzeInnYk/9KOBqxz9M5hKkHXhGKKjY04pMrLMb+rp3FWw==
4880+
detect-gpu@^5.0.16:
4881+
version "5.0.16"
4882+
resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.16.tgz#a42054724f4a75d667add68ad1073c80d29ef733"
4883+
integrity sha512-6+o6Sy+FzgQJG7Ray0fN7B4kRGGPuyaM5FHXJ4N3sLcQhsUO9+NEw9emM7vxN7DroZGG16ZydCX6kpgDmNXyKQ==
48844884
dependencies:
48854885
webgl-constants "^1.1.1"
48864886

@@ -8316,14 +8316,14 @@ mdn-data@2.0.4:
83168316
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
83178317
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
83188318

8319-
"mds@https://github.com/minio/mds.git#v0.3.1":
8320-
version "0.3.1"
8321-
resolved "https://github.com/minio/mds.git#8beec5b36aef3ba4c389b170a0108f301a5f29e3"
8319+
"mds@https://github.com/minio/mds.git#v0.3.2":
8320+
version "0.3.2"
8321+
resolved "https://github.com/minio/mds.git#85654388adaec4d2624b61bee439c7d9cd5801f7"
83228322
dependencies:
83238323
"@types/styled-components" "^5.1.25"
8324-
detect-gpu "^5.0.15"
8324+
detect-gpu "^5.0.16"
83258325
react-virtualized "^9.22.3"
8326-
styled-components "^5.3.8"
8326+
styled-components "^5.3.9"
83278327

83288328
media-typer@0.3.0:
83298329
version "0.3.0"
@@ -11212,7 +11212,7 @@ style-loader@^3.3.1:
1121211212
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899"
1121311213
integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==
1121411214

11215-
styled-components@^5.3.8, styled-components@^5.3.9:
11215+
styled-components@^5.3.9:
1121611216
version "5.3.9"
1121711217
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.9.tgz#641af2a8bb89904de708c71b439caa9633e8f0ba"
1121811218
integrity sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==

0 commit comments

Comments
 (0)