Resolve "Supported Features mandatory on POST and PUT Requests"

Proposers

  • Jorge Moratinos (Telefónica)
  • Miguel Ángel Adorna (Telefónica)

Description

This code is meant to prevent creating or updating provider or invoker without sending supported_features or suppFeat fields in request body. Tests have been done to check if the new code works as expected.

Documentation MR: documentation!59 (merged)

Closes #172 (closed)

Edited by Miguel Ángel Adorna Ruiz

Merge request reports

Loading
+14 −0
Changes for services/TS29222_CAPIF_API_Invoker_Management_API/api_invoker_management/core/apiinvokerenrolmentdetails.py: 14 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -100,6 +100,13 @@ class InvokerManagementOperations(Resource):
            current_app.logger.error("Bad url format")
            return bad_request_error(detail="Bad Param", cause="Detected Bad formar of param", invalid_params=[{"param": "notificationDestination", "reason": "Not valid URL format"}])

        if not apiinvokerenrolmentdetail.supported_features:
            return bad_request_error(
                detail="supportedFeatures not present in request",
                cause="supportedFeatures not present",
                invalid_params=[{"param": "supportedFeatures", "reason": "not defined"}]
            )

        current_app.logger.debug("Signing Certificate")

        api_invoker_id = 'INV'+str(secrets.token_hex(15))
@@ -148,6 +155,13 @@ class InvokerManagementOperations(Resource):
            if isinstance(result, Response):
                return result

            if not apiinvokerenrolmentdetail.supported_features:
                return bad_request_error(
                    detail="supportedFeatures not present in request",
                    cause="supportedFeatures not present",
                    invalid_params=[{"param": "supportedFeatures", "reason": "not defined"}]
                )

            if apiinvokerenrolmentdetail.onboarding_information.api_invoker_public_key != result["onboarding_information"]["api_invoker_public_key"]:
                cert = self.__sign_cert(
                    apiinvokerenrolmentdetail.onboarding_information.api_invoker_public_key, result["api_invoker_id"])
+1 −1

File changed.

Contains only whitespace changes.

+14 −0
Changes for services/TS29222_CAPIF_API_Provider_Management_API/api_provider_management/core/provider_enrolment_details_api.py: 14 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -57,6 +57,13 @@ class ProviderManagementOperations(Resource):
                    "Found provider registered with same id")
                return forbidden_error(detail="Provider already registered", cause="Identical provider reg sec")

            if not api_provider_enrolment_details.supp_feat:
                return bad_request_error(
                    detail="suppFeat not present in request",
                    cause="suppFeat not present",
                    invalid_params=[{"param": "suppFeat", "reason": "not defined"}]
                )

            api_provider_enrolment_details.api_prov_dom_id = secrets.token_hex(
                15)
            
@@ -149,6 +156,13 @@ class ProviderManagementOperations(Resource):
            if isinstance(result, Response):
                return result

            if not api_provider_enrolment_details.supp_feat:
                return bad_request_error(
                    detail="suppFeat not present in request",
                    cause="suppFeat not present",
                    invalid_params=[{"param": "suppFeat", "reason": "not defined"}]
                )

            negotiated_supported_features = return_negotiated_supp_feat_dict(api_provider_enrolment_details.supp_feat)
            api_provider_enrolment_details.supp_feat = negotiated_supported_features["Final"]

+1 −1

File changed.

Contains only whitespace changes.

+55 −0
Changes for tests/features/CAPIF Api Invoker Management/capif_api_invoker_managenet.robot: 55 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -182,3 +182,58 @@ Update Onboarded Network App Certificate
    # Check Results
    Check Response Variable Type And Values    ${resp}    200    APIInvokerEnrolmentDetails
    ...    notificationDestination=${new_notification_destination}

Onboard invoker without supported_features
    [Tags]    capif_api_invoker_management-8
    # Default Invoker Registration and Onboarding
    ${register_user_info}=    Register User At Jwt Auth
    ...    username=${invoker_username}    role=${INVOKER_ROLE}

    ${request_body}=    Create Onboarding Notification Body
    ...    http://${CAPIF_CALLBACK_IP}:${CAPIF_CALLBACK_PORT}/netapp_callback
    ...    ${register_user_info['csr_request']}
    ...    ${invoker_username}
    ...    supported_features=${None}

    ${resp}=    Post Request Capif
    ...    ${register_user_info['ccf_onboarding_url']}
    ...    json=${request_body}
    ...    server=${CAPIF_HTTPS_URL}
    ...    verify=ca.crt
    ...    access_token=${register_user_info['access_token']}

    # Check Results
    Check Response Variable Type And Values    ${resp}    400    ProblemDetails
    ...    status=400
    ...    title=Bad Request
    ...    detail=supportedFeatures not present in request
    ...    cause=supportedFeatures not present

Update Onboarded Network App without supported_features
    [Tags]    capif_api_invoker_management-9
    ${new_notification_destination}=    Set Variable
    ...    http://${CAPIF_CALLBACK_IP}:${CAPIF_CALLBACK_PORT}/netapp_new_callback
    # Default Invoker Registration and Onboarding
    ${register_user_info}    ${url}    ${request_body}=    Invoker Default Onboarding

    Set To Dictionary
    ...    ${request_body}
    ...    notificationDestination=${new_notification_destination}

    Remove From Dictionary
    ...    ${request_body}
    ...    supportedFeatures

    ${resp}=    Put Request Capif
    ...    ${url.path}
    ...    ${request_body}
    ...    server=${CAPIF_HTTPS_URL}
    ...    verify=ca.crt
    ...    username=${INVOKER_USERNAME}

    # Check Results
    Check Response Variable Type And Values    ${resp}    400    ProblemDetails
    ...    status=400
    ...    title=Bad Request
    ...    detail=supportedFeatures not present in request
    ...    cause=supportedFeatures not present
Loading
Loading