Return onboarding dates in GET /api/me/invokers

Merge request reports

Loading
+10 −2
Changes for capif_backend/backoffice_service/controllers/me_controller.py: 10 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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()
+9 −1
Changes for capif_backend/backoffice_service/core/invoker_ops.py: 9 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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.
@@ -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"))
+2 −10
Changes for capif_backend/backoffice_service/core/provider_ops.py: 2 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -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")
@@ -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
+11 −0
Changes for capif_backend/backoffice_service/utils/certs.py: 11 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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