Loading capif_backend/backoffice_service/controllers/me_controller.py +10 −2 Viewed Changes for capif_backend/backoffice_service/controllers/me_controller.py: 10 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -30,12 +30,20 @@ def onboard_invoker(user_uuid): @capif_user_required def list_my_invokers(user_uuid): try: invoker_ids = list_invokers(user_uuid) invokers = [] for invoker_id in list_invokers(user_uuid): secret = read_invoker(user_uuid, invoker_id) if secret is None: continue # deleted between the list and the read invokers.append({ "apiInvokerId": invoker_id, "onboardedAt": invoker_ops.onboarded_at(secret), }) except VaultError as e: print(f"ERROR: {e}") return jsonify({"error": "Could not list invokers."}), 500 return jsonify({"invokers": invoker_ids}), 200 return jsonify({"invokers": invokers}), 200 @me_routes.route("/invokers/<api_invoker_id>/apis", methods=["GET"]) @jwt_required() Loading capif_backend/backoffice_service/core/invoker_ops.py +9 −1 Viewed Changes for capif_backend/backoffice_service/core/invoker_ops.py: 9 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ import os import requests from ..utils.certs import generate_keypair_and_csr, mtls_files, SecureTempUnavailable from ..utils.certs import generate_keypair_and_csr, mtls_files, not_valid_before, SecureTempUnavailable from ..utils.vault import store_invoker # CCF (OpenCAPIF) answers discover with 404 when nothing matches, instead of 200 with an empty list. Loading Loading @@ -118,3 +118,11 @@ def discover(discover_url, invoker_id, certificate, private_key): return {"error": "CCF discover failed.", "ccf_status": response.status_code, "ccf_response": data}, 502 return data, 200 def onboarded_at(invoker_secret): """Return when an invoker was onboarded, as an ISO 8601 UTC string, or None if unknown. Taken from the invoker certificate's not-before date, since the secret stores no date of its own. Vault backdates not-before by about 30 seconds, which is close enough for display. """ return not_valid_before(invoker_secret.get("certificate")) capif_backend/backoffice_service/core/provider_ops.py +2 −10 Viewed Changes for capif_backend/backoffice_service/core/provider_ops.py: 2 added lines, 10 removed lines. Original line number Diff line number Diff line Loading @@ -2,9 +2,8 @@ import os import requests from cryptography import x509 from ..utils.certs import generate_keypair_and_csr, mtls_files, SecureTempUnavailable from ..utils.certs import generate_keypair_and_csr, mtls_files, not_valid_before, SecureTempUnavailable from ..utils.vault import store_provider PROVIDER_ROLES = ("AEF", "APF", "AMF") Loading Loading @@ -276,11 +275,4 @@ def onboarded_at(provider_secret): about 30 seconds, which is close enough for display. """ certificate = ((provider_secret.get("functions") or {}).get("apf") or {}).get("certificate") if not certificate: return None try: cert = x509.load_pem_x509_certificate(certificate.encode("utf-8")) except ValueError: print("WARNING: could not parse a stored APF certificate") return None return cert.not_valid_before_utc.isoformat() No newline at end of file return not_valid_before(certificate) No newline at end of file capif_backend/backoffice_service/utils/certs.py +11 −0 Viewed Changes for capif_backend/backoffice_service/utils/certs.py: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -68,3 +68,14 @@ def mtls_files(cert_pem, key_pem): os.unlink(path) except FileNotFoundError: pass def not_valid_before(certificate_pem): """Return a PEM certificate's not-before date as an ISO 8601 UTC string, or None if unknown.""" if not certificate_pem: return None try: cert = x509.load_pem_x509_certificate(certificate_pem.encode("utf-8")) except ValueError: print("WARNING: could not parse a stored certificate") return None return cert.not_valid_before_utc.isoformat() No newline at end of file Loading
capif_backend/backoffice_service/controllers/me_controller.py +10 −2 Viewed Changes for capif_backend/backoffice_service/controllers/me_controller.py: 10 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -30,12 +30,20 @@ def onboard_invoker(user_uuid): @capif_user_required def list_my_invokers(user_uuid): try: invoker_ids = list_invokers(user_uuid) invokers = [] for invoker_id in list_invokers(user_uuid): secret = read_invoker(user_uuid, invoker_id) if secret is None: continue # deleted between the list and the read invokers.append({ "apiInvokerId": invoker_id, "onboardedAt": invoker_ops.onboarded_at(secret), }) except VaultError as e: print(f"ERROR: {e}") return jsonify({"error": "Could not list invokers."}), 500 return jsonify({"invokers": invoker_ids}), 200 return jsonify({"invokers": invokers}), 200 @me_routes.route("/invokers/<api_invoker_id>/apis", methods=["GET"]) @jwt_required() Loading
capif_backend/backoffice_service/core/invoker_ops.py +9 −1 Viewed Changes for capif_backend/backoffice_service/core/invoker_ops.py: 9 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ import os import requests from ..utils.certs import generate_keypair_and_csr, mtls_files, SecureTempUnavailable from ..utils.certs import generate_keypair_and_csr, mtls_files, not_valid_before, SecureTempUnavailable from ..utils.vault import store_invoker # CCF (OpenCAPIF) answers discover with 404 when nothing matches, instead of 200 with an empty list. Loading Loading @@ -118,3 +118,11 @@ def discover(discover_url, invoker_id, certificate, private_key): return {"error": "CCF discover failed.", "ccf_status": response.status_code, "ccf_response": data}, 502 return data, 200 def onboarded_at(invoker_secret): """Return when an invoker was onboarded, as an ISO 8601 UTC string, or None if unknown. Taken from the invoker certificate's not-before date, since the secret stores no date of its own. Vault backdates not-before by about 30 seconds, which is close enough for display. """ return not_valid_before(invoker_secret.get("certificate"))
capif_backend/backoffice_service/core/provider_ops.py +2 −10 Viewed Changes for capif_backend/backoffice_service/core/provider_ops.py: 2 added lines, 10 removed lines. Original line number Diff line number Diff line Loading @@ -2,9 +2,8 @@ import os import requests from cryptography import x509 from ..utils.certs import generate_keypair_and_csr, mtls_files, SecureTempUnavailable from ..utils.certs import generate_keypair_and_csr, mtls_files, not_valid_before, SecureTempUnavailable from ..utils.vault import store_provider PROVIDER_ROLES = ("AEF", "APF", "AMF") Loading Loading @@ -276,11 +275,4 @@ def onboarded_at(provider_secret): about 30 seconds, which is close enough for display. """ certificate = ((provider_secret.get("functions") or {}).get("apf") or {}).get("certificate") if not certificate: return None try: cert = x509.load_pem_x509_certificate(certificate.encode("utf-8")) except ValueError: print("WARNING: could not parse a stored APF certificate") return None return cert.not_valid_before_utc.isoformat() No newline at end of file return not_valid_before(certificate) No newline at end of file
capif_backend/backoffice_service/utils/certs.py +11 −0 Viewed Changes for capif_backend/backoffice_service/utils/certs.py: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -68,3 +68,14 @@ def mtls_files(cert_pem, key_pem): os.unlink(path) except FileNotFoundError: pass def not_valid_before(certificate_pem): """Return a PEM certificate's not-before date as an ISO 8601 UTC string, or None if unknown.""" if not certificate_pem: return None try: cert = x509.load_pem_x509_certificate(certificate_pem.encode("utf-8")) except ValueError: print("WARNING: could not parse a stored certificate") return None return cert.not_valid_before_utc.isoformat() No newline at end of file