From 01b432afc645324f6a88da1a133f69e2b26d95ca Mon Sep 17 00:00:00 2001 From: gabdevele Date: Wed, 17 Jun 2026 21:10:50 +0200 Subject: [PATCH] feat: enhance redirect handling and add scope support in VisioneStartView --- relying_party/relying_party/visione_views.py | 20 +++++++++++++++---- .../spid_cie_oidc/entity/views.py | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/relying_party/relying_party/visione_views.py b/relying_party/relying_party/visione_views.py index 740d23a..e704201 100644 --- a/relying_party/relying_party/visione_views.py +++ b/relying_party/relying_party/visione_views.py @@ -3,6 +3,7 @@ import hmac import json import urllib.error import urllib.request +from urllib.parse import urlencode from django.conf import settings from django.http import HttpResponseBadRequest, HttpResponseRedirect, HttpResponseServerError @@ -36,9 +37,11 @@ class VisioneStartView(View): request.session["visione_frontend_redirect_uri"] = frontend_redirect_uri request.session["visione_provider_issuer"] = provider - return HttpResponseRedirect( - f"/oidc/rp/authorization?provider={provider}&profile={profile}" - ) + query = {"provider": provider, "profile": profile} + scope = request.GET.get("scope") + if scope: + query["scope"] = scope + return HttpResponseRedirect(f"/oidc/rp/authorization?{urlencode(query)}") class VisioneCompleteView(View): @@ -83,7 +86,7 @@ class VisioneCompleteView(View): opener = urllib.request.build_opener(_NoRedirectHandler) try: - opener.open(req) + response = opener.open(req) except urllib.error.HTTPError as exc: if exc.code in (301, 302, 303, 307, 308): location = exc.headers.get("Location") @@ -102,4 +105,13 @@ class VisioneCompleteView(View): except Exception as exc: return HttpResponseServerError(f"Visione backend exchange failed: {exc}") + try: + payload = response.read().decode("utf-8") + data = json.loads(payload) if payload else {} + except Exception: + return HttpResponseServerError("Visione backend exchange did not redirect") + + redirect_url = data.get("redirect_url") + if redirect_url: + return HttpResponseRedirect(redirect_url) return HttpResponseServerError("Visione backend exchange did not redirect") diff --git a/vendor/spid-cie-oidc-django/spid_cie_oidc/entity/views.py b/vendor/spid-cie-oidc-django/spid_cie_oidc/entity/views.py index 20cf3a8..4bc1f65 100644 --- a/vendor/spid-cie-oidc-django/spid_cie_oidc/entity/views.py +++ b/vendor/spid-cie-oidc-django/spid_cie_oidc/entity/views.py @@ -58,6 +58,8 @@ def entity_configuration(request): sub__in=_sub_values, is_active=True, ).first() + if not conf: + conf = FederationEntityConfiguration.objects.filter(is_active=True).first() if not conf: # pragma: no cover raise Http404() @@ -188,6 +190,8 @@ def openid_jwks(request, metadata_type:str, resource_type:str): sub__in=_lookup_values, is_active=True, ).first() + if not conf: + conf = FederationEntityConfiguration.objects.filter(is_active=True).first() if not conf: # pragma: no cover raise Http404() content = conf.entity_configuration_as_dict['metadata'].get(