Commit fa824011 authored by Sergio Gimenez's avatar Sergio Gimenez
Browse files

fix: normalize federated application identifiers in OEG

parent 0737a71c
Loading
Loading
Loading
Loading
+71 −43
Original line number Diff line number Diff line
@@ -90,6 +90,28 @@ def _ensure_res_pool(value, fallback_source):
    return candidate[:32]


def _normalize_federated_app_id(app_id):
    pattern = (
        r"^(?:[A-Za-z][A-Za-z0-9_]{7,63}|"
        r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-"
        r"[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
    )
    if app_id and re.match(pattern, str(app_id)):
        return app_id
    return str(uuid.uuid5(uuid.NAMESPACE_URL, f"federated-app:{app_id}"))


def _normalize_federated_app_provider_id(app_provider_id, fallback_source):
    return _ensure_gsma_id(
        app_provider_id,
        r"^[A-Za-z][A-Za-z0-9_]{7,63}$",
        "provider",
        8,
        64,
        fallback_source,
    )


def submit_app(body: dict):
    """
    Controller for submitting application metadata.
@@ -304,6 +326,8 @@ def create_app_instance():
                    "appId": app_id
                }), 404

            federated_app_id = _normalize_federated_app_id(app_id)

            # ============================================================
            # Step 2: Compose GSMA artefact payload
            # artefactId == appId (INTENTIONAL)
@@ -347,6 +371,10 @@ def create_app_instance():
                64,
                app_id,
            )
            federated_app_provider_id = _normalize_federated_app_provider_id(
                app_provider_id,
                app_id,
            )
            app_name = _ensure_gsma_id(
                app_name,
                r"^[A-Za-z][A-Za-z0-9_]{7,31}$",
@@ -491,8 +519,8 @@ def create_app_instance():


            onboard_app = {
                "appId": app_id,
                "appProviderId": app_provider_id,
                "appId": federated_app_id,
                "appProviderId": federated_app_provider_id,
                "appMetaData": {
                    "appName": app_name,
                    "version": app_version,
@@ -550,8 +578,8 @@ def create_app_instance():
                zone.get("edgeCloudZoneId")
            )
            deploy_app = {
                "appId": app_id,
                "appProviderId": app_provider_id,
                "appId": federated_app_id,
                "appProviderId": federated_app_provider_id,
                "appVersion": app_version,
                "appInstCallbackLink": appData.get("appInstCallbackLink", ""),
                "zoneInfo": {