11package access .api ;
22
3+ import access .config .Config ;
34import access .manage .Manage ;
4- import access .manage .ManageData ;
55import access .model .EntityType ;
66import access .model .Environment ;
77import lombok .SneakyThrows ;
88import org .apache .commons .logging .Log ;
99import org .apache .commons .logging .LogFactory ;
1010import org .springframework .http .MediaType ;
1111import org .springframework .http .ResponseEntity ;
12+ import org .springframework .security .core .Authentication ;
13+ import org .springframework .security .oauth2 .core .oidc .user .DefaultOidcUser ;
1214import org .springframework .web .bind .annotation .GetMapping ;
1315import org .springframework .web .bind .annotation .PathVariable ;
1416import org .springframework .web .bind .annotation .RequestMapping ;
1517import org .springframework .web .bind .annotation .RestController ;
1618
1719import java .util .List ;
1820import java .util .Map ;
21+ import java .util .Set ;
22+ import java .util .stream .Collectors ;
23+
24+ import static access .manage .ManageData .getData ;
25+ import static access .manage .ManageData .getMetaDataFields ;
1926
2027@ RestController
2128@ RequestMapping (value = {"/api/v1/public" }, produces = MediaType .APPLICATION_JSON_VALUE )
29+ @ SuppressWarnings ("unchecked" )
2230public class PublicController {
2331
2432 private static final Log LOG = LogFactory .getLog (PublicController .class );
2533
2634 private final Manage manage ;
35+ private final Config config ;
2736
2837 @ SneakyThrows
29- public PublicController (Manage manage ) {
38+ public PublicController (Manage manage , Config config ) {
3039 this .manage = manage ;
40+ this .config = config ;
3141 }
3242
3343 @ GetMapping ("/service-providers" )
34- public ResponseEntity <List <Map <String , Object >>> serviceProviders () {
44+ public ResponseEntity <List <Map <String , Object >>> serviceProviders (Authentication authentication ) {
3545 LOG .debug ("/serviceProviders" );
36- return ResponseEntity .ok (manage .serviceProvidersLight (Environment .PROD ));
46+ List <Map <String , Object >> providers = manage .serviceProvidersLight (Environment .PROD );
47+ if (authentication == null ) {
48+ providers .removeIf (provider -> removeNonPublicProvider (provider ));
49+ } else {
50+ DefaultOidcUser user = (DefaultOidcUser ) authentication .getPrincipal ();
51+ String schacHomeOrganization = (String ) user .getClaims ().get ("schac_home_organization" );
52+ boolean isExternalUserFromSchacHome = schacHomeOrganization .equals (config .getEduIdSchacHomeOrganization ());
53+ if (isExternalUserFromSchacHome ) {
54+ providers .removeIf (provider -> removeNonPublicProvider (provider ));
55+ } else {
56+ //We need the identity provider to see which providers are connected and are therefore visiblle
57+ String authenticatingAuthority = (String ) user .getClaims ().get ("authenticating_authority" );
58+ Map <String , Object > identityProvider = manage .identityProviderByEntityID (authenticatingAuthority );
59+ Set <String > allowedEntities = ((List <Map <String , String >>) getData (identityProvider ).getOrDefault ("allowedEntities" , List .of ()))
60+ .stream ()
61+ .map (allowedEntity -> allowedEntity .get ("name" ))
62+ .collect (Collectors .toSet ());
63+ providers .removeIf (provider -> removeNonPublicProvider (provider , allowedEntities ));
64+ }
65+ }
66+ return ResponseEntity .ok (providers );
3767 }
3868
3969 @ GetMapping ("/identity-providers" )
@@ -49,10 +79,23 @@ public ResponseEntity<Map<String, Object>> serviceProviderDetail(
4979 LOG .debug ("/identityProviders" );
5080 Map <String , Object > provider = manage
5181 .providerById (entityType , identifier , Environment .PROD );
52- ManageData . getMetaDataFields (ManageData . getData (provider )).keySet ()
82+ getMetaDataFields (getData (provider )).keySet ()
5383 .removeIf (key -> key .startsWith ("contacts:" ));
5484 return ResponseEntity .ok (provider );
5585 }
5686
87+ private boolean removeNonPublicProvider (Map <String , Object > provider ) {
88+ Map <String , Object > metaDataFields = getMetaDataFields (getData (provider ));
89+ boolean hidden = (boolean ) metaDataFields .getOrDefault ("coin:ss:hidden" , false );
90+ boolean idpVisibleOnly = (boolean ) metaDataFields .getOrDefault ("coin:ss:idp_visible_only" , false );
91+ return hidden || idpVisibleOnly ;
92+ }
5793
94+ private boolean removeNonPublicProvider (Map <String , Object > provider , Set <String > allowedEntities ) {
95+ Map <String , Object > data = getData (provider );
96+ Map <String , Object > metaDataFields = getMetaDataFields (data );
97+ boolean hidden = (boolean ) metaDataFields .getOrDefault ("coin:ss:hidden" , false );
98+ boolean idpVisibleOnly = (boolean ) metaDataFields .getOrDefault ("coin:ss:idp_visible_only" , false );
99+ return hidden || (idpVisibleOnly && !allowedEntities .contains ((String ) data .get ("entityid" )));
100+ }
58101}
0 commit comments