Skip to content

Commit bfbe9a2

Browse files
sarkapalkovicovaHejdaJakub
authored andcommitted
fix(admin): buttons authz on member pages
Authz of buttons is checked independently of data loading.
1 parent f910a57 commit bfbe9a2

File tree

5 files changed

+66
-98
lines changed

5 files changed

+66
-98
lines changed

apps/admin-gui/src/app/vos/pages/member-detail-page/member-attributes/member-attributes.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ <h1 class="page-subtitle">{{'MEMBER_DETAIL.SETTINGS.ATTRIBUTES.TITLE' | translat
66
{{'MEMBER_DETAIL.ENTITY' | translate}}
77
</ng-template>
88
<ng-template matTabContent>
9-
<app-one-entity-attribute-page [entityId]="this.memberId" [entity]="'member'">
9+
<app-one-entity-attribute-page [entityId]="member.id" [entity]="'member'">
1010
</app-one-entity-attribute-page>
1111
</ng-template>
1212
</mat-tab>
@@ -19,7 +19,7 @@ <h1 class="page-subtitle">{{'MEMBER_DETAIL.SETTINGS.ATTRIBUTES.TITLE' | translat
1919
<ng-template matTabContent>
2020
<app-two-entity-attribute-page
2121
[firstEntity]="'member'"
22-
[firstEntityId]="memberId"
22+
[firstEntityId]="member.id"
2323
[secondEntity]="'group'"></app-two-entity-attribute-page>
2424
</ng-template>
2525
</mat-tab>
@@ -32,7 +32,7 @@ <h1 class="page-subtitle">{{'MEMBER_DETAIL.SETTINGS.ATTRIBUTES.TITLE' | translat
3232
<ng-template matTabContent>
3333
<app-two-entity-attribute-page
3434
[firstEntity]="'member'"
35-
[firstEntityId]="memberId"
35+
[firstEntityId]="member.id"
3636
[secondEntity]="'resource'"></app-two-entity-attribute-page>
3737
</ng-template>
3838
</mat-tab>
Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Component, HostBinding, OnInit } from '@angular/core';
22
import { ActivatedRoute } from '@angular/router';
3-
import { GuiAuthResolver } from '@perun-web-apps/perun/services';
3+
import { EntityStorageService, GuiAuthResolver } from '@perun-web-apps/perun/services';
44
import { Member, MembersManagerService } from '@perun-web-apps/perun/openapi';
55

66
@Component({
@@ -10,7 +10,6 @@ import { Member, MembersManagerService } from '@perun-web-apps/perun/openapi';
1010
})
1111
export class MemberAttributesComponent implements OnInit {
1212
@HostBinding('class.router-component') true;
13-
memberId: number;
1413
member: Member;
1514
memberResourceAttAuth: boolean;
1615
memberGroupAttAuth: boolean;
@@ -19,28 +18,22 @@ export class MemberAttributesComponent implements OnInit {
1918
constructor(
2019
private route: ActivatedRoute,
2120
private authResolver: GuiAuthResolver,
22-
private memberManager: MembersManagerService
21+
private memberManager: MembersManagerService,
22+
private entityService: EntityStorageService
2323
) {}
2424

2525
ngOnInit(): void {
26-
this.route.parent.params.subscribe((params) => {
27-
this.memberId = Number(params['memberId']);
26+
this.member = this.entityService.getEntity();
2827

29-
this.memberManager.getMemberById(this.memberId).subscribe((member) => {
30-
this.member = member;
31-
32-
this.memberGroupAttAuth = this.authResolver.isAuthorized('getMemberGroups_Member_policy', [
33-
this.member,
34-
]);
35-
this.memberResourceAttAuth = this.authResolver.isAuthorized(
36-
'getAssignedResourcesWithStatus_Member_policy',
37-
[this.member]
38-
);
39-
this.userFacilityAttAuth = this.authResolver.isAuthorized(
40-
'getAssignedFacilities_User_policy',
41-
[{ beanName: 'User', id: member.userId }]
42-
);
43-
});
44-
});
28+
this.memberGroupAttAuth = this.authResolver.isAuthorized('getMemberGroups_Member_policy', [
29+
this.member,
30+
]);
31+
this.memberResourceAttAuth = this.authResolver.isAuthorized(
32+
'getAssignedResourcesWithStatus_Member_policy',
33+
[this.member]
34+
);
35+
this.userFacilityAttAuth = this.authResolver.isAuthorized('getAssignedFacilities_User_policy', [
36+
{ beanName: 'User', id: this.member.userId },
37+
]);
4538
}
4639
}

apps/admin-gui/src/app/vos/pages/member-detail-page/member-groups/member-groups.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ <h1 class="page-subtitle">{{'MEMBER_DETAIL.GROUPS.TITLE' | translate}}</h1>
5757
*perunWebAppsLoader="loading; indicator: spinner"
5858
(refreshTable)="refreshTable()"
5959
[displayedColumns]="['select', 'id', 'name', 'description', 'expiration', 'groupStatus']"
60-
[memberId]="memberId"
60+
[memberId]="member.id"
6161
[disableRouting]="!routeAuth"
6262
[groups]="groups"
6363
[filter]="filterValue"

apps/admin-gui/src/app/vos/pages/member-detail-page/member-groups/member-groups.component.ts

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import {
55
GroupsManagerService,
66
Member,
77
MembersManagerService,
8-
Vo,
98
} from '@perun-web-apps/perun/openapi';
109
import { TABLE_MEMBER_DETAIL_GROUPS } from '@perun-web-apps/config/table-config';
1110
import { SelectionModel } from '@angular/cdk/collections';
1211
import { getDefaultDialogConfig } from '@perun-web-apps/perun/utils';
1312
import { MatDialog } from '@angular/material/dialog';
1413
import { AddMemberGroupDialogComponent } from '../../../../shared/components/dialogs/add-member-group-dialog/add-member-group-dialog.component';
1514
import { RemoveMemberGroupDialogComponent } from '../../../../shared/components/dialogs/remove-member-group-dialog/remove-member-group-dialog.component';
16-
import { GuiAuthResolver } from '@perun-web-apps/perun/services';
15+
import { EntityStorageService, GuiAuthResolver } from '@perun-web-apps/perun/services';
1716
import { Urns } from '@perun-web-apps/perun/urns';
1817
import { Observable } from 'rxjs';
1918
import { map, startWith } from 'rxjs/operators';
@@ -35,7 +34,6 @@ export class MemberGroupsComponent implements OnInit {
3534
@ViewChild('list') private list: GroupsListComponent;
3635

3736
groups: Group[] = [];
38-
memberId: number;
3937
member: Member;
4038
allGroups: Group[];
4139
loading: boolean;
@@ -62,37 +60,39 @@ export class MemberGroupsComponent implements OnInit {
6260
private route: ActivatedRoute,
6361
private dialog: MatDialog,
6462
private authResolver: GuiAuthResolver,
65-
private memberService: MembersManagerService
63+
private memberService: MembersManagerService,
64+
private entityService: EntityStorageService
6665
) {}
6766

6867
ngOnInit(): void {
6968
this.loading = true;
70-
this.route.parent.params.subscribe((parentParams) => {
71-
this.memberId = Number(parentParams['memberId']);
72-
this.memberService.getMemberById(this.memberId).subscribe((member) => {
73-
this.member = member;
74-
this.groupsService.getAllGroups(this.member.voId).subscribe((allGroups) => {
75-
this.allGroups = allGroups;
76-
this.refreshTable();
77-
if (localStorage.getItem('preferedValue') === 'list') {
78-
this.toggle.toggle();
79-
this.showGroupList = true;
80-
}
69+
this.member = this.entityService.getEntity();
70+
71+
this.groupsService.getAllGroups(this.member.voId).subscribe((allGroups) => {
72+
this.allGroups = allGroups;
73+
this.addAuth = this.allGroups.reduce(
74+
(acc, grp) => acc || this.authResolver.isAuthorized('addMember_Group_Member_policy', [grp]),
75+
false
76+
);
77+
78+
this.refreshTable();
79+
if (localStorage.getItem('preferedValue') === 'list') {
80+
this.toggle.toggle();
81+
this.showGroupList = true;
82+
}
8183

82-
this.toggle.change.subscribe(() => {
83-
const value = this.toggle.checked ? 'list' : 'tree';
84-
localStorage.setItem('preferedValue', value);
85-
this.refreshTable();
86-
});
87-
});
84+
this.toggle.change.subscribe(() => {
85+
const value = this.toggle.checked ? 'list' : 'tree';
86+
localStorage.setItem('preferedValue', value);
87+
this.refreshTable();
8888
});
8989
});
9090
}
9191

9292
refreshTable(): void {
9393
this.loading = true;
9494
this.groupsService
95-
.getMemberRichGroupsWithAttributesByNames(this.memberId, [
95+
.getMemberRichGroupsWithAttributesByNames(this.member.id, [
9696
Urns.MEMBER_DEF_GROUP_EXPIRATION,
9797
Urns.MEMBER_GROUP_STATUS,
9898
Urns.MEMBER_GROUP_STATUS_INDIRECT,
@@ -101,7 +101,14 @@ export class MemberGroupsComponent implements OnInit {
101101
next: (groups) => {
102102
this.selection.clear();
103103
this.groups = groups;
104-
this.setAuthRights();
104+
105+
if (this.groups.length !== 0) {
106+
this.routeAuth = this.authResolver.isAuthorized('getGroupById_int_policy', [
107+
{ id: this.member.voId, beanName: 'Vo' },
108+
this.groups[0],
109+
]);
110+
}
111+
105112
this.loading = false;
106113
},
107114
error: () => (this.loading = false),
@@ -112,30 +119,11 @@ export class MemberGroupsComponent implements OnInit {
112119
this.list.changeExpiration(group);
113120
}
114121

115-
setAuthRights(): void {
116-
const vo: Vo = {
117-
id: this.member.voId,
118-
beanName: 'Vo',
119-
};
120-
121-
this.addAuth = this.allGroups.reduce(
122-
(acc, grp) => acc || this.authResolver.isAuthorized('addMember_Group_Member_policy', [grp]),
123-
false
124-
);
125-
126-
if (this.groups.length !== 0) {
127-
this.routeAuth = this.authResolver.isAuthorized('getGroupById_int_policy', [
128-
vo,
129-
this.groups[0],
130-
]);
131-
}
132-
}
133-
134122
addGroup(): void {
135123
const config = getDefaultDialogConfig();
136124
config.width = '850px';
137125
config.data = {
138-
memberId: this.memberId,
126+
memberId: this.member.id,
139127
membersGroups: new Set<number>(this.groups.map((grp) => grp.id)),
140128
theme: 'member-theme',
141129
};
@@ -153,7 +141,7 @@ export class MemberGroupsComponent implements OnInit {
153141
const config = getDefaultDialogConfig();
154142
config.width = '650px';
155143
config.data = {
156-
memberId: this.memberId,
144+
memberId: this.member.id,
157145
groups: this.selection.selected,
158146
theme: 'member-theme',
159147
};

apps/admin-gui/src/app/vos/pages/member-detail-page/member-resources/member-resources.component.ts

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { TABLE_MEMBER_RESOURCE_LIST } from '@perun-web-apps/config/table-config'
1111
import { ActivatedRoute } from '@angular/router';
1212
import { getDefaultDialogConfig } from '@perun-web-apps/perun/utils';
1313
import { AddMemberToResourceDialogComponent } from '../../../../shared/components/dialogs/add-member-to-resource-dialog/add-member-to-resource-dialog.component';
14-
import { GuiAuthResolver } from '@perun-web-apps/perun/services';
14+
import { EntityStorageService, GuiAuthResolver } from '@perun-web-apps/perun/services';
1515

1616
@Component({
1717
selector: 'app-member-resources',
@@ -27,25 +27,25 @@ export class MemberResourcesComponent implements OnInit {
2727
tableId = TABLE_MEMBER_RESOURCE_LIST;
2828
routeAuth: boolean;
2929
addAuth: boolean;
30+
voBean: PerunBean;
3031

3132
constructor(
3233
private dialog: MatDialog,
3334
private memberManager: MembersManagerService,
3435
private resourceManager: ResourcesManagerService,
3536
private route: ActivatedRoute,
36-
private authResolver: GuiAuthResolver
37+
private authResolver: GuiAuthResolver,
38+
private entityService: EntityStorageService
3739
) {}
3840

3941
ngOnInit(): void {
4042
this.loading = true;
41-
this.route.parent.params.subscribe((parentParams) => {
42-
const memberId = Number(parentParams['memberId']);
43-
44-
this.memberManager.getMemberById(memberId).subscribe((member) => {
45-
this.member = member;
46-
this.refreshTable();
47-
});
48-
});
43+
this.member = this.entityService.getEntity();
44+
this.voBean = { id: this.member.voId, beanName: 'Vo' };
45+
this.addAuth =
46+
this.authResolver.isAuthorized('getRichResources_Vo_policy', [this.voBean]) &&
47+
this.authResolver.isAuthorized('addMembers_Group_List<Member>_policy', [this.voBean]);
48+
this.refreshTable();
4949
}
5050

5151
addResource(): void {
@@ -72,29 +72,16 @@ export class MemberResourcesComponent implements OnInit {
7272
.getAssignedRichResourcesWithMember(this.member.id)
7373
.subscribe((resources) => {
7474
this.resources = resources;
75-
this.setAuthRights();
75+
if (this.resources.length !== 0) {
76+
this.routeAuth = this.authResolver.isAuthorized('getResourceById_int_policy', [
77+
this.voBean,
78+
this.resources[0],
79+
]);
80+
}
7681
this.loading = false;
7782
});
7883
}
7984

80-
setAuthRights(): void {
81-
const vo: PerunBean = {
82-
id: this.member.voId,
83-
beanName: 'Vo',
84-
};
85-
86-
this.addAuth =
87-
this.authResolver.isAuthorized('getRichResources_Vo_policy', [vo]) &&
88-
this.authResolver.isAuthorized('addMembers_Group_List<Member>_policy', [vo]);
89-
90-
if (this.resources.length !== 0) {
91-
this.routeAuth = this.authResolver.isAuthorized('getResourceById_int_policy', [
92-
vo,
93-
this.resources[0],
94-
]);
95-
}
96-
}
97-
9885
applyFilter(filterValue: string): void {
9986
this.filterValue = filterValue;
10087
}

0 commit comments

Comments
 (0)