Skip to content

Commit 6b9aab9

Browse files
committed
WIP for IdP policies
1 parent 751e000 commit 6b9aab9

12 files changed

Lines changed: 108 additions & 8 deletions

File tree

client/src/App.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import MyOrganization from "./pages/MyOrganization.jsx";
4141
import ApplicationOverview from "./pages/ApplicationOverview.jsx";
4242
import Profile from "./pages/Profile.jsx";
4343
import {UserFeedbackWidget} from "./components/UserFeedbackWidget.jsx";
44+
import Policies from "./pages/Policies.jsx";
4445

4546
const App = () => {
4647

@@ -146,6 +147,7 @@ const App = () => {
146147
<Route path="/refresh-route/:path" element={<RefreshRoute/>}/>
147148
<Route path="/feedback" element={<Feedback/>}/>
148149
<Route path="/idp/:organizationId" element={<MyOrganization refreshUser={refreshUser}/>}/>
150+
<Route path="/policies/:page?/:policyId?" element={<Policies/>}/>
149151
<Route path="/authentication-switch" element={<AuthenticationSwitch/>}/>
150152
<Route path="/accessible-apps" element={<ApplicationOverview accessible={true}/>}/>
151153
<Route path="/catalogue" element={<ApplicationOverview accessible={false}/>}/>

client/src/api/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ export function getPolicyByServiceProviderEntityId(entityId) {
225225
return fetchJson(`/api/v1/manage/policies?entityId=${encodeURIComponent(entityId)}`);
226226
}
227227

228+
export function getPolicyByIdentityProvider() {
229+
return fetchJson("/api/v1/manage/identity-provider/policies");
230+
}
231+
228232
export function uniqueEntityID(environment, entityID) {
229233
return postPutJson(`/api/v1/manage/unique-entity-id/${environment}`, {entityID: entityID}, "POST");
230234
}

client/src/locale/en.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ const en = {
8585
idp: "My organisation",
8686
users: "SURF Access users",
8787
applications: "Applications",
88+
policies: "Policies",
8889
teams: "Teams",
8990
support: "Support",
9091
serviceDesk: "SURF Servicedesk",

client/src/policies/PolicyOverview.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ export const PolicyOverview = ({policies, backToAccess, policyDetails, refreshPo
133133
children={<TrashIcon onClick={() => doDeletePolicy(true, policy)}/>}/>
134134
</div>
135135
</div>)}
136-
137136
</>}
138137
</InfoBlock>
139138
</div>

client/src/utils/MenuItems.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import LaptopIcon from "@surfnet/sds/icons/illustrative-icons/laptop.svg";
33
import HierarchyIcon from "@surfnet/sds/icons/illustrative-icons/hierarchy.svg";
44
import LaptopFloatIcon from "@surfnet/sds/icons/illustrative-icons/laptop-1.svg";
55
import UserIcon from "@surfnet/sds/icons/functional-icons/id-2.svg";
6+
import PolicyIcon from "@surfnet/sds/icons/functional-icons/lock.svg";
67
import ScreenIcon from "@surfnet/sds/icons/illustrative-icons/screen.svg";
78
import HomeIcon from "@surfnet/sds/icons/illustrative-icons/home.svg";
89
import ConnectedIcon from "@surfnet/sds/icons/illustrative-icons/connected.svg";
@@ -18,16 +19,20 @@ export const mainMenuItems = {
1819
idp: "idp",
1920
yourApps: "yourApps",
2021
catalogue: "catalogue",
22+
policies: "policies",
2123
accessibleApps: "accessibleApps",
2224
invite: "invite",
2325
sram: "sram",
2426
serviceDesk: "serviceDesk",
2527
feedback: "feedback"
2628
}
2729

28-
const doMenuItemsForUser = (user, currentOrganization) => {
30+
const doMenuItemsForUser = (user, currentOrganization, feedbackWidgetEnabled = useAppStore.getState().config.feedbackWidgetEnabled) => {
2931
//Every user has access to the home, catalogue and help menu items
3032
const newMenuItems = [mainMenuItems.home, mainMenuItems.catalogue, mainMenuItems.serviceDesk];
33+
if (!feedbackWidgetEnabled) {
34+
newMenuItems.push(mainMenuItems.feedback);
35+
}
3136
const noOrganizationMemberships = isEmpty(user.organizationMemberships);
3237
if (noOrganizationMemberships) {
3338
return newMenuItems;
@@ -42,16 +47,22 @@ const doMenuItemsForUser = (user, currentOrganization) => {
4247
if (onlyGuest) {
4348
return newMenuItems;
4449
}
45-
const isMemberOrAdmin = user.organizationMemberships
46-
.some(m => [authorities.MEMBER, authorities.ADMIN].includes(m.authority) &&
50+
const isMember = user.organizationMemberships
51+
.some(m => authorities.MEMBER === m.authority &&
52+
m.organization.id === currentOrganization.id);
53+
const isAdmin = user.organizationMemberships
54+
.some(m => authorities.ADMIN === m.authority &&
4755
m.organization.id === currentOrganization.id);
4856

49-
if (isMemberOrAdmin) {
57+
if (isMember || isAdmin) {
5058
newMenuItems.push(mainMenuItems.users);
5159
}
5260
if (!user.externalUser) {
5361
newMenuItems.push(mainMenuItems.accessibleApps, mainMenuItems.idp, mainMenuItems.invite, mainMenuItems.sram);
5462
}
63+
if ((isAdmin || user.superUser) && !isEmpty(currentOrganization.manageIdentifier)) {
64+
newMenuItems.push(mainMenuItems.policies);
65+
}
5566
return newMenuItems;
5667
}
5768

@@ -122,6 +133,11 @@ export const allMenuGroups = [
122133
path: "/users/organizationId",
123134
Logo: UserIcon
124135
},
136+
{
137+
name: mainMenuItems.policies,
138+
path: "/policies/overview",
139+
Logo: PolicyIcon
140+
},
125141
]
126142
},
127143
{

client/src/utils/Policy.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {isEmpty, splitListSemantically} from "./Utils.js";
22

3-
export const policyTemplate = (identityProviderEntityId, serviceProviderEntityId) => ({
3+
export const policyTemplate = (identityProviderEntityId, serviceProviderEntityId = null) => ({
44
data: {
55
active: true,
66
allAttributesMustMatch: false,
@@ -13,7 +13,7 @@ export const policyTemplate = (identityProviderEntityId, serviceProviderEntityId
1313
identityProviderIds: [{name: identityProviderEntityId}],
1414
metaDataFields: {},
1515
name: "",
16-
serviceProviderIds: [{name: serviceProviderEntityId}],
16+
serviceProviderIds: isEmpty(serviceProviderEntityId) ? [] : [{name: serviceProviderEntityId}],
1717
type: "reg"
1818
},
1919
type: "policy"

server/src/main/java/access/api/ManageController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,17 @@ public ResponseEntity<List<Map<String, Object>>> identityProviders(@PathVariable
9797
return ResponseEntity.ok(providers);
9898
}
9999

100+
@SneakyThrows
101+
@GetMapping("/identity-provider/policies")
102+
@SuppressWarnings("unchecked")
103+
public ResponseEntity<List<Map<String, Object>>> identityProviderPolicies(@Parameter(hidden = true) User user) {
104+
LOG.debug("/identityProviderPolicies for " + user.getEmail());
105+
106+
confirmInstitutionAdmin(user);
107+
List<Map<String, Object>> policies = this.manage.policiesByIdentityProvider(user.getAuthenticatingAuthority());
108+
return ResponseEntity.ok(policies);
109+
}
110+
100111
@SneakyThrows
101112
@GetMapping("/policies")
102113
@SuppressWarnings("unchecked")

server/src/main/java/access/manage/LocalManage.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,20 @@ public List<Map<String, Object>> policiesByServiceProvider(String identityProvid
264264
.toList();
265265
}
266266

267+
@Override
268+
public List<Map<String, Object>> policiesByIdentityProvider(String identityProviderEntityId) {
269+
return this.allProviders.get(EntityType.policy).stream()
270+
.filter(policy -> {
271+
Map<String, Object> data = getData(policy);
272+
List<Map<String, String>> identityProviderIds = (List<Map<String, String>>)
273+
data.getOrDefault("identityProviderIds", List.of());
274+
return identityProviderIds.stream()
275+
.anyMatch(m -> m.get("name").equals(identityProviderEntityId));
276+
})
277+
.toList();
278+
}
279+
280+
267281
@Override
268282
public Map<String, Object> createPolicy(Map<String, Object> policy) {
269283
String id = UUID.randomUUID().toString();

server/src/main/java/access/manage/Manage.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public interface Manage {
4949
List<Map<String, Object>> policiesByServiceProvider(String identityProviderEntityId,
5050
String serviceProviderEntityId);
5151

52+
List<Map<String, Object>> policiesByIdentityProvider(String identityProviderEntityId);
53+
5254
Map<String, Object> createPolicy(Map<String, Object> policy);
5355

5456
Map<String, Object> updatePolicy(Map<String, Object> policy);

server/src/main/java/access/manage/RemoteManage.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package access.manage;
22

33
import access.exception.NotFoundException;
4-
import access.model.*;
4+
import access.model.Connection;
5+
import access.model.EntityType;
6+
import access.model.Environment;
7+
import access.model.Organization;
8+
import access.model.State;
9+
import access.model.User;
510
import access.remote.RestTemplateFactory;
611
import com.fasterxml.jackson.core.type.TypeReference;
712
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -370,6 +375,17 @@ public List<Map<String, Object>> policiesByServiceProvider(String identityProvid
370375
return restTemplate.postForEntity(url, query, List.class).getBody();
371376
}
372377

378+
@Override
379+
public List<Map<String, Object>> policiesByIdentityProvider(String identityProviderEntityId) {
380+
Map<String, Object> query = Map.of(
381+
"data.identityProviderIds.name", identityProviderEntityId
382+
);
383+
RestTemplate restTemplate = environmentRestTemplate(Environment.PROD);
384+
String url = String.format("%s/manage/api/internal/rawSearch/%s",
385+
environmentUrl(Environment.PROD), EntityType.policy);
386+
return restTemplate.postForEntity(url, query, List.class).getBody();
387+
}
388+
373389
@Override
374390
public Map<String, Object> createPolicy(Map<String, Object> policy) {
375391
RestTemplate restTemplate = environmentRestTemplate(Environment.PROD);

0 commit comments

Comments
 (0)