Skip to content

Commit 4f29f84

Browse files
authored
Api bucket policy (#674)
* Adding API for Users with Access to Bucket * changing error logging * Delete .yarn-integrity
1 parent 94747ac commit 4f29f84

14 files changed

+1280
-0
lines changed

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import UsageIcon from "../../../../icons/UsageIcon";
5858
import AddPolicy from "../../Policies/AddPolicy";
5959
import SetAccessPolicy from "./SetAccessPolicy";
6060
import { Policy } from "../../Policies/types";
61+
import { User } from "../../Users/types";
6162

6263
const styles = (theme: Theme) =>
6364
createStyles({
@@ -222,6 +223,8 @@ const ViewBucket = ({
222223
>([]);
223224
const [bucketPolicy, setBucketPolicy] = useState<Policy[]>([]);
224225
const [loadingPolicy, setLoadingPolicy] = useState<boolean>(true);
226+
const [bucketUsers, setBucketUsers] = useState<User[]>([]);
227+
const [loadingUsers, setLoadingUsers] = useState<boolean>(true);
225228
const [loadingBucket, setLoadingBucket] = useState<boolean>(true);
226229
const [loadingEvents, setLoadingEvents] = useState<boolean>(true);
227230
const [loadingVersioning, setLoadingVersioning] = useState<boolean>(true);
@@ -389,6 +392,21 @@ const ViewBucket = ({
389392
}
390393
}, [loadingPolicy, setErrorSnackMessage, bucketName]);
391394

395+
useEffect(() => {
396+
if (loadingUsers) {
397+
api
398+
.invoke("GET", `/api/v1/bucket-users/${bucketName}`)
399+
.then((res: any) => {
400+
setBucketUsers(res);
401+
setLoadingUsers(false);
402+
})
403+
.catch((err: any) => {
404+
setErrorSnackMessage(err);
405+
setLoadingUsers(false);
406+
});
407+
}
408+
}, [loadingUsers, setErrorSnackMessage, bucketName]);
409+
392410
useEffect(() => {
393411
if (loadingSize) {
394412
api
@@ -773,6 +791,7 @@ const ViewBucket = ({
773791
<Tab label="Replication" {...a11yProps(1)} />
774792
)}
775793
<Tab label="Policies" {...a11yProps(2)} />
794+
<Tab label="Users" {...a11yProps(3)} />
776795
</Tabs>
777796
</Grid>
778797
<Grid item xs={6} className={classes.actionsTray}>
@@ -867,6 +886,15 @@ const ViewBucket = ({
867886
idField="name"
868887
/>
869888
</TabPanel>
889+
<TabPanel index={3} value={curTab}>
890+
<TableWrapper
891+
columns={[{ label: "User", elementKey: "accessKey" }]}
892+
isLoading={loadingUsers}
893+
records={bucketUsers}
894+
entityName="Users"
895+
idField="accessKey"
896+
/>
897+
</TabPanel>
870898
</Grid>
871899
</Grid>
872900
</Grid>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ export interface BucketEventList {
4747
total: number;
4848
}
4949

50+
export interface BucketPolicy {
51+
name: string;
52+
body: string;
53+
}
54+
5055
export interface ArnList {
5156
arns: string[];
5257
}

restapi/admin_users.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ func registerUsersHandlers(api *operations.ConsoleAPI) {
9191

9292
return admin_api.NewBulkUpdateUsersGroupsOK()
9393
})
94+
api.AdminAPIListUsersWithAccessToBucketHandler = admin_api.ListUsersWithAccessToBucketHandlerFunc(func(params admin_api.ListUsersWithAccessToBucketParams, session *models.Principal) middleware.Responder {
95+
response, err := getListUsersWithAccessToBucketResponse(session, params.Bucket)
96+
if err != nil {
97+
return admin_api.NewListUsersWithAccessToBucketDefault(int(err.Code)).WithPayload(err)
98+
}
99+
return admin_api.NewListUsersWithAccessToBucketOK().WithPayload(response)
100+
})
94101
}
95102

96103
func listUsers(ctx context.Context, client MinioAdmin) ([]*models.User, error) {
@@ -467,3 +474,66 @@ func getAddUsersListToGroupsResponse(session *models.Principal, params admin_api
467474

468475
return nil
469476
}
477+
478+
func getListUsersWithAccessToBucketResponse(session *models.Principal, bucket string) ([]string, *models.Error) {
479+
ctx := context.Background()
480+
mAdmin, err := newMAdminClient(session)
481+
if err != nil {
482+
return nil, prepareError(err)
483+
}
484+
// create a minioClient interface implementation
485+
// defining the client to be used
486+
adminClient := adminClient{client: mAdmin}
487+
488+
users, err := listUsers(ctx, adminClient)
489+
if err != nil {
490+
return nil, prepareError(err)
491+
}
492+
var retval []string
493+
seen := make(map[string]bool)
494+
for i := 0; i < len(users); i++ {
495+
policy, err := adminClient.getPolicy(ctx, users[i].Policy)
496+
if err == nil {
497+
parsedPolicy, err2 := parsePolicy(users[i].Policy, policy)
498+
if err2 == nil && policyMatchesBucket(parsedPolicy, bucket) {
499+
retval = append(retval, users[i].AccessKey)
500+
seen[users[i].AccessKey] = true
501+
}
502+
if err2 != nil {
503+
log.Println(err2)
504+
}
505+
} else {
506+
log.Println(err)
507+
}
508+
}
509+
510+
groups, err := listGroups(ctx, adminClient)
511+
if err != nil {
512+
log.Println(err)
513+
return retval, nil
514+
}
515+
for i := 0; i < len(*groups); i++ {
516+
info, err := groupInfo(ctx, adminClient, (*groups)[i])
517+
if err == nil {
518+
policy, err2 := adminClient.getPolicy(ctx, info.Policy)
519+
if err2 == nil {
520+
parsedPolicy, err3 := parsePolicy(info.Policy, policy)
521+
for j := 0; j < len(info.Members); j++ {
522+
if err3 == nil && !seen[info.Members[j]] && policyMatchesBucket(parsedPolicy, bucket) {
523+
retval = append(retval, info.Members[j])
524+
seen[info.Members[j]] = true
525+
}
526+
if err3 != nil {
527+
log.Println(err3)
528+
}
529+
}
530+
} else {
531+
log.Println(err2)
532+
}
533+
} else {
534+
log.Println(err)
535+
}
536+
}
537+
// serialize output
538+
return retval, nil
539+
}

restapi/embedded_spec.go

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

restapi/operations/admin_api/list_users_with_access_to_bucket.go

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

0 commit comments

Comments
 (0)