Skip to content

Commit db7cee4

Browse files
committed
Fixes #608
1 parent 460efa5 commit db7cee4

7 files changed

Lines changed: 22 additions & 10 deletions

File tree

server/src/main/java/invite/api/InvitationController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ private void saveOAuth2AuthenticationToken(Authentication authentication,
404404
DefaultOidcUser existingTokenPrincipal = (DefaultOidcUser) existingToken.getPrincipal();
405405
//Claims of the tokenPrincipal are immutable, so we need to instantiate a new Map
406406
Map<String, Object> claims = new HashMap<>(existingTokenPrincipal.getClaims());
407-
claims.putAll(manage.enrichInstitutionAdmin(user.getOrganizationGUID()));
407+
claims.putAll(manage.enrichInstitutionAdmin(user.getOrganizationGUID(), claims));
408408
DefaultOidcUser oidcUser = new DefaultOidcUser(
409409
existingToken.getAuthorities(),
410410
existingTokenPrincipal.getIdToken(),

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,22 @@ default List<GroupedProviders> getGroupedProviders(List<Role> requestedRoles) {
172172
.toList();
173173
}
174174

175-
default Map<String, Object> enrichInstitutionAdmin(String organizationGUID) {
175+
default Map<String, Object> enrichInstitutionAdmin(String organizationGUID, Map<String, Object> userClaims) {
176176
Map<String, Object> claims = new HashMap<>();
177177
claims.put(INSTITUTION_ADMIN, true);
178178
claims.put(ORGANIZATION_GUID, organizationGUID);
179179
List<Map<String, Object>> identityProviders = identityProvidersByInstitutionalGUID(organizationGUID);
180-
claims.put(INSTITUTION, identityProviders.size() == 0 ? null : identityProviders.getFirst());
180+
if (identityProviders.size() > 1) {
181+
//try to find the IdP which entityID equals the authenticating authority of the user login
182+
String authenticatingAuthority = (String) userClaims.get("authenticating_authority");
183+
Map<String, Object> identityProvider = identityProviders.stream()
184+
.filter(idp -> idp.get("entityid").equals(authenticatingAuthority))
185+
.findFirst()
186+
.orElse(identityProviders.getFirst());
187+
claims.put(INSTITUTION, identityProvider);
188+
} else {
189+
claims.put(INSTITUTION, identityProviders.isEmpty() ? null : identityProviders.getFirst());
190+
}
181191
List<Map<String, Object>> applications = this.providersAllowedByIdPs(identityProviders);
182192
claims.put(APPLICATIONS, applications);
183193
return claims;

server/src/main/java/invite/security/CustomOidcUserService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2Authenticatio
6666
newClaims.put(ORGANIZATION_GUID, organizationGuid);
6767

6868
if (institutionAdmin && StringUtils.hasText(organizationGuid)) {
69-
Map<String, Object> manageClaims = manage.enrichInstitutionAdmin(organizationGuid);
69+
Map<String, Object> manageClaims = manage.enrichInstitutionAdmin(organizationGuid, newClaims);
7070
newClaims.putAll(manageClaims);
7171
}
7272
optionalUser.ifPresent(user -> {

server/src/main/java/invite/security/UserHandlerMethodArgumentResolver.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public User resolveArgument(MethodParameter methodParameter,
9292
User user = apiUsers.getFirst();
9393
if (StringUtils.hasText(organizationGUID)) {
9494
//The overhead is needed / justified for API usage as this are stateless
95-
addInstitutionAdminAttributes(user, organizationGUID);
95+
addInstitutionAdminAttributes(user, organizationGUID, Map.of());
9696
}
9797
return user;
9898
} else {
@@ -138,7 +138,7 @@ public User resolveArgument(MethodParameter methodParameter,
138138
String organizationGUID = user.getOrganizationGUID();
139139
if (validImpersonation.get()) {
140140
//The overhead for retrieving data from manage is justified when super_user is impersonating institutionAdmin
141-
addInstitutionAdminAttributes(user, organizationGUID);
141+
addInstitutionAdminAttributes(user, organizationGUID, attributes);
142142
} else {
143143
user.updateRemoteAttributes(attributes);
144144
}
@@ -148,8 +148,8 @@ public User resolveArgument(MethodParameter methodParameter,
148148

149149
}
150150

151-
private void addInstitutionAdminAttributes(User user, String organizationGUID) {
152-
Map<String, Object> attributes = manage.enrichInstitutionAdmin(organizationGUID);
151+
private void addInstitutionAdminAttributes(User user, String organizationGUID, Map<String, Object> claims) {
152+
Map<String, Object> attributes = manage.enrichInstitutionAdmin(organizationGUID, claims);
153153
user.updateRemoteAttributes(attributes);
154154
}
155155

server/src/main/resources/manage/saml20_idp.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@
9898
"name:en": "EduID EN",
9999
"name:nl": "EduID NL",
100100
"OrganizationName:en": "SURF bv",
101-
"logo:0:url": "https://static.surfconext.nl/media/idp/surfconext.png"
101+
"logo:0:url": "https://static.surfconext.nl/media/idp/surfconext.png",
102+
"coin:institution_guid": "ad93daef-0911-e511-80d0-005056956c1a"
102103
}
103104
}
104105
}

server/src/test/java/invite/api/ManageControllerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void identityProviders() throws Exception {
102102
.get("/api/v1/manage/identity-providers")
103103
.as(new TypeRef<>() {
104104
});
105-
assertEquals(2, result.size());
105+
assertEquals(3, result.size());
106106
}
107107

108108
@Test

server/src/test/resources/user-info.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"eduperson_principal_name": "eduperson_principal_name",
3+
"authenticating_authority": "http://mock-idp",
34
"email": "email",
45
"email_verified": true,
56
"family_name": "Doe",

0 commit comments

Comments
 (0)