Skip to content

Commit cf0e326

Browse files
authored
Object Browser only mode (#2157)
- Added flag CONSOLE_OBJECT_BROWSER_ONLY=on to trigger between console mode & Object Browser only - Hidden not necessary buttons for object browse - STS Login Signed-off-by: Benjamin Perez <benjamin@bexsoft.net> Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
1 parent e48958f commit cf0e326

File tree

22 files changed

+929
-495
lines changed

22 files changed

+929
-495
lines changed

.github/workflows/jobs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ jobs:
276276
semgrep --config semgrep.yaml $(pwd)/portal-ui --error
277277
278278
no-warnings-and-make-assets:
279-
name: "React Code Has No Warning & Prettified and then Make Assets"
279+
name: "React Code Has No Warnings & is Prettified, then Make Assets"
280280
runs-on: ${{ matrix.os }}
281281
strategy:
282282
matrix:

models/login_request.go

Lines changed: 5 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/principal.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

operatorapi/embedded_spec.go

Lines changed: 6 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/auth/token.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,18 @@ type TokenClaims struct {
6767
STSSessionToken string `json:"stsSessionToken,omitempty"`
6868
AccountAccessKey string `json:"accountAccessKey,omitempty"`
6969
HideMenu bool `json:"hm,omitempty"`
70+
ObjectBrowser bool `json:"ob,omitempty"`
71+
}
72+
73+
// STSClaims claims struct for STS Token
74+
type STSClaims struct {
75+
AccessKey string `json:"accessKey,omitempty"`
7076
}
7177

7278
// SessionFeatures represents features stored in the session
7379
type SessionFeatures struct {
74-
HideMenu bool
80+
HideMenu bool
81+
ObjectBrowser bool
7582
}
7683

7784
// SessionTokenAuthenticate takes a session token, decode it, extract claims and validate the signature
@@ -115,6 +122,7 @@ func NewEncryptedTokenForClient(credentials *credentials.Value, accountAccessKey
115122
}
116123
if features != nil {
117124
tokenClaims.HideMenu = features.HideMenu
125+
tokenClaims.ObjectBrowser = features.ObjectBrowser
118126
}
119127
encryptedClaims, err := encryptClaims(tokenClaims)
120128
if err != nil {

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

Lines changed: 78 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ import {
3636
IAM_ROLES,
3737
IAM_SCOPES,
3838
} from "../../../../common/SecureComponent/permissions";
39-
import SearchBox from "../../Common/SearchBox";
4039
import BackLink from "../../../../common/BackLink";
4140
import {
4241
setSearchObjects,
4342
setSearchVersions,
4443
setVersionsModeEnabled,
4544
} from "../../ObjectBrowser/objectBrowserSlice";
45+
import SearchBox from "../../Common/SearchBox";
46+
import { selFeatures } from "../../consoleSlice";
47+
import { LoginMinIOLogo } from "../../../../icons";
4648

4749
const styles = (theme: Theme) =>
4850
createStyles({
@@ -67,9 +69,13 @@ const BrowserHandler = () => {
6769
(state: AppState) => state.objectBrowser.searchVersions
6870
);
6971

72+
const features = useSelector(selFeatures);
73+
7074
const bucketName = params.bucketName || "";
7175
const internalPaths = get(params, "subpaths", "");
7276

77+
const obOnly = !!features?.includes("object-browser-only");
78+
7379
useEffect(() => {
7480
dispatch(setVersionsModeEnabled({ status: false }));
7581
}, [internalPaths, dispatch]);
@@ -78,59 +84,79 @@ const BrowserHandler = () => {
7884
navigate(`/buckets/${bucketName}/admin`);
7985
};
8086

87+
const searchBar = (
88+
<Fragment>
89+
{!versionsMode ? (
90+
<SecureComponent
91+
scopes={[IAM_SCOPES.S3_LIST_BUCKET]}
92+
resource={bucketName}
93+
errorProps={{ disabled: true }}
94+
>
95+
<SearchBox
96+
placeholder={"Start typing to filter objects in the bucket"}
97+
onChange={(value) => {
98+
dispatch(setSearchObjects(value));
99+
}}
100+
value={searchObjects}
101+
/>
102+
</SecureComponent>
103+
) : (
104+
<Fragment>
105+
<SearchBox
106+
placeholder={`Start typing to filter versions of ${versionedFile}`}
107+
onChange={(value) => {
108+
dispatch(setSearchVersions(value));
109+
}}
110+
value={searchVersions}
111+
/>
112+
</Fragment>
113+
)}
114+
</Fragment>
115+
);
116+
81117
return (
82118
<Fragment>
83-
<PageHeader
84-
label={<BackLink label={"Buckets"} to={IAM_PAGES.BUCKETS} />}
85-
actions={
86-
<SecureComponent
87-
scopes={IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN]}
88-
resource={bucketName}
89-
errorProps={{ disabled: true }}
90-
>
91-
<Tooltip title={"Configure Bucket"}>
92-
<IconButton
93-
color="primary"
94-
aria-label="Configure Bucket"
95-
component="span"
96-
onClick={openBucketConfiguration}
97-
size="large"
98-
>
99-
<SettingsIcon />
100-
</IconButton>
101-
</Tooltip>
102-
</SecureComponent>
103-
}
104-
middleComponent={
105-
<Fragment>
106-
{!versionsMode ? (
107-
<SecureComponent
108-
scopes={[IAM_SCOPES.S3_LIST_BUCKET]}
109-
resource={bucketName}
110-
errorProps={{ disabled: true }}
111-
>
112-
<SearchBox
113-
placeholder={"Start typing to filter objects in the bucket"}
114-
onChange={(value) => {
115-
dispatch(setSearchObjects(value));
116-
}}
117-
value={searchObjects}
118-
/>
119-
</SecureComponent>
120-
) : (
121-
<Fragment>
122-
<SearchBox
123-
placeholder={`Start typing to filter versions of ${versionedFile}`}
124-
onChange={(value) => {
125-
dispatch(setSearchVersions(value));
126-
}}
127-
value={searchVersions}
128-
/>
129-
</Fragment>
130-
)}
131-
</Fragment>
132-
}
133-
/>
119+
{!obOnly ? (
120+
<PageHeader
121+
label={<BackLink label={"Buckets"} to={IAM_PAGES.BUCKETS} />}
122+
actions={
123+
<SecureComponent
124+
scopes={IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN]}
125+
resource={bucketName}
126+
errorProps={{ disabled: true }}
127+
>
128+
<Tooltip title={"Configure Bucket"}>
129+
<IconButton
130+
color="primary"
131+
aria-label="Configure Bucket"
132+
component="span"
133+
onClick={openBucketConfiguration}
134+
size="large"
135+
>
136+
<SettingsIcon />
137+
</IconButton>
138+
</Tooltip>
139+
</SecureComponent>
140+
}
141+
middleComponent={searchBar}
142+
/>
143+
) : (
144+
<Grid
145+
container
146+
sx={{
147+
padding: "20px 32px 0",
148+
}}
149+
>
150+
<Grid>
151+
<LoginMinIOLogo
152+
style={{ width: 105, marginRight: 30, marginTop: 10 }}
153+
/>
154+
</Grid>
155+
<Grid item xs>
156+
{searchBar}
157+
</Grid>
158+
</Grid>
159+
)}
134160
<Grid>
135161
<ListObjects />
136162
</Grid>

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

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ interface IBucketListItem {
163163
onSelect: (e: React.ChangeEvent<HTMLInputElement>) => void;
164164
selected: boolean;
165165
bulkSelect: boolean;
166+
noManage?: boolean;
166167
}
167168

168169
const BucketListItem = ({
@@ -171,6 +172,7 @@ const BucketListItem = ({
171172
onSelect,
172173
selected,
173174
bulkSelect,
175+
noManage = false,
174176
}: IBucketListItem) => {
175177
const usage = niceBytes(`${bucket.size}` || "0");
176178
const usageScalar = usage.split(" ")[0];
@@ -236,24 +238,26 @@ const BucketListItem = ({
236238
</Grid>
237239
</Grid>
238240
<Grid item xs={12} sm={5} className={classes.bucketActionButtons}>
239-
<SecureComponent
240-
scopes={IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN]}
241-
resource={bucket.name}
242-
>
243-
<Link
244-
to={`/buckets/${bucket.name}/admin`}
245-
style={{ textDecoration: "none" }}
241+
{!noManage && (
242+
<SecureComponent
243+
scopes={IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN]}
244+
resource={bucket.name}
246245
>
247-
<RBIconButton
248-
tooltip={"Manage"}
249-
onClick={() => {}}
250-
text={"Manage"}
251-
icon={<SettingsIcon />}
252-
color={"primary"}
253-
variant={"outlined"}
254-
/>
255-
</Link>
256-
</SecureComponent>
246+
<Link
247+
to={`/buckets/${bucket.name}/admin`}
248+
style={{ textDecoration: "none" }}
249+
>
250+
<RBIconButton
251+
tooltip={"Manage"}
252+
onClick={() => {}}
253+
text={"Manage"}
254+
icon={<SettingsIcon />}
255+
color={"primary"}
256+
variant={"outlined"}
257+
/>
258+
</Link>
259+
</SecureComponent>
260+
)}
257261
<Link
258262
to={`/buckets/${bucket.name}/browse`}
259263
style={{ textDecoration: "none" }}

0 commit comments

Comments
 (0)