diff --git a/edu_federation/relying_party_explicit/views.py b/edu_federation/relying_party_explicit/views.py index d54da42..c0fcea1 100644 --- a/edu_federation/relying_party_explicit/views.py +++ b/edu_federation/relying_party_explicit/views.py @@ -70,8 +70,8 @@ def wkof(): # Any client will do cli = _rph.issuer2rp[list(_rph.issuer2rp.keys())[0]] - _metadata = current_app.server.get_metadata() - _metadata.update(cli.get_metadata()) + _metadata = current_app.server.get_metadata(cli) + #_metadata.update(cli.get_metadata()) _fed_entity = current_app.server["federation_entity"] diff --git a/edu_federation/trust_anchor/views.py b/edu_federation/trust_anchor/views.py index ccc550c..d312b8e 100644 --- a/edu_federation/trust_anchor/views.py +++ b/edu_federation/trust_anchor/views.py @@ -7,6 +7,7 @@ from flask import Blueprint from flask import current_app from flask import redirect +from flask import render_template from flask import request from flask.helpers import make_response from flask.helpers import send_from_directory @@ -133,6 +134,13 @@ def service_endpoint(endpoint): return response +@entity.route('/') +def index(): + _entity = current_app.federation_entity + _keys = _entity.server.subordinate.keys() + display = {k:_entity.server.subordinate[k] for k in _keys} + return render_template('trust_anchor.html', subordinates=display) + @entity.route('/static/') def send_js(path): return send_from_directory('static', path) diff --git a/src/fedservice/appclient/oauth2/registration.py b/src/fedservice/appclient/oauth2/registration.py index 0cbfc6e..bbe2e7d 100644 --- a/src/fedservice/appclient/oauth2/registration.py +++ b/src/fedservice/appclient/oauth2/registration.py @@ -86,7 +86,7 @@ def create_entity_statement(self, request_args: Optional[dict] = None, **kwargs) _federation_entity = get_federation_entity(self) _combo = _federation_entity.upstream_get('unit') - metadata = _combo.get_metadata() + metadata = _combo.get_metadata(client=kwargs.get("client")) _keyjar = _federation_entity.get_attribute("keyjar") _authority_hints = _federation_entity.get_authority_hints() diff --git a/src/fedservice/appclient/oidc/registration.py b/src/fedservice/appclient/oidc/registration.py index e8f649a..00e6e1f 100644 --- a/src/fedservice/appclient/oidc/registration.py +++ b/src/fedservice/appclient/oidc/registration.py @@ -22,6 +22,7 @@ class Registration(registration.Registration): endpoint_name = 'federation_registration_endpoint' request_body_type = 'jwt' response_body_type = 'jwt' + content_type = "application/entity-statement+jwt" name = 'registration' def __init__(self, upstream_get, conf=None, client_authn_factory=None, **kwargs): diff --git a/src/fedservice/appserver/oidc/registration.py b/src/fedservice/appserver/oidc/registration.py index 3b9531d..a87f860 100644 --- a/src/fedservice/appserver/oidc/registration.py +++ b/src/fedservice/appserver/oidc/registration.py @@ -36,7 +36,12 @@ def process_request(self, request=None, **kwargs): :return: """ payload = verify_self_signed_signature(request) - opponent_entity_type = set(payload['metadata'].keys()).difference({'federation_entity'}).pop() + _entity_types = set(payload['metadata'].keys()) + if len(_entity_types) == 1: + opponent_entity_type = _entity_types.pop() + else: + opponent_entity_type = _entity_types.difference({'federation_entity'}).pop() + _federation_entity = get_federation_entity(self) # Collect trust chains for client diff --git a/src/fedservice/combo/__init__.py b/src/fedservice/combo/__init__.py index afdbb91..678bb0e 100644 --- a/src/fedservice/combo/__init__.py +++ b/src/fedservice/combo/__init__.py @@ -5,6 +5,7 @@ from cryptojwt import KeyJar from idpyoidc.client.entity_metadata import EntityMetadata +from idpyoidc.client.rp_handler import RPHandler from idpyoidc.configure import Configuration from idpyoidc.message import Message from idpyoidc.node import Unit @@ -106,10 +107,14 @@ def _get_httpc_params(self, config): return _hp return config["federation_entity"].get("httpc_params") - def get_metadata(self): + def get_metadata(self, client = None): res = {} for federation_type, item in self._part.items(): - if getattr(item, "get_metadata", None): + if isinstance(item, RPHandler): # Special treatment + if client: + _res = client.get_metadata() + res.update(_res) + elif getattr(item, "get_metadata", None): res.update(item.get_metadata(entity_type=federation_type)) return res