Commit ec32f3c5 authored by guillecxb's avatar guillecxb
Browse files

Integrated configuration para ACL sizes

parent 6c8f13b5
Loading
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -21,6 +21,23 @@ class InternalServiceOps(Resource):

        mycol = self.db.get_col_by_name(self.db.acls)

        # 🚨 Nueva Lógica: Recuperar configuración desde capifConfiguration en MongoDB
        config_col = self.db.get_col_by_name("capifConfiguration")
        capif_config = config_col.find_one({"config_name": "default"})

        if capif_config:
            settings = capif_config.get("settings", {}).get("acl_policy_settings", {})
            allowed_total_invocations = settings.get("allowedTotalInvocations", 100)
            allowed_invocations_per_second = settings.get("allowedInvocationsPerSecond", 10)
            time_range_days = settings.get("allowedInvocationTimeRangeDays", 365)
        else:
            current_app.logger.error("CAPIF Configuration not found, applying all values to 0.")
            allowed_total_invocations = 0
            allowed_invocations_per_second = 0
            time_range_days = 0

        

        res = mycol.find_one(
            {"service_id": service_id, "aef_id": aef_id}, {"_id": 0})

@@ -28,9 +45,9 @@ class InternalServiceOps(Resource):
            current_app.logger.info(
                f"Adding invoker ACL for invoker {invoker_id}")
            range_list = [TimeRangeList(
                datetime.utcnow(), datetime.utcnow()+timedelta(days=365))]
                datetime.utcnow(), datetime.utcnow()+timedelta(days=time_range_days))]
            invoker_acl = ApiInvokerPolicy(
                invoker_id, current_app.config["invocations"]["total"], current_app.config["invocations"]["perSecond"], range_list)
                invoker_id, allowed_total_invocations, allowed_invocations_per_second, range_list)
            r = mycol.find_one({"service_id": service_id, "aef_id": aef_id,
                               "api_invoker_policies.api_invoker_id": invoker_id}, {"_id": 0})
            if r is None:
@@ -40,9 +57,9 @@ class InternalServiceOps(Resource):
            current_app.logger.info(
                f"Creating service ACLs for service: {service_id}")
            range_list = [TimeRangeList(
                datetime.utcnow(), datetime.utcnow()+timedelta(days=365))]
                datetime.utcnow(), datetime.utcnow()+timedelta(days=time_range_days))]
            invoker_acl = ApiInvokerPolicy(
                invoker_id, current_app.config["invocations"]["total"], current_app.config["invocations"]["perSecond"], range_list)
                invoker_id, allowed_total_invocations, allowed_invocations_per_second, range_list)

            service_acls = {
                "service_id": service_id,
+7 −3
Original line number Diff line number Diff line
@@ -25,11 +25,15 @@ capifConfiguration: {
  description: "Default CAPIF Configuration",
  settings: {
    certify_expiration_period: 30,
    acls_size_configuration: 24,
    security_method_priority: {
      psk: 1,
      oauth: 1,
      pki: 2,
      oauth: 3
      psk: 3
    },
    acl_policy_settings: {
      allowedTotalInvocations: 5,
      allowedInvocationsPerSecond: 10,
      allowedInvocationTimeRangeDays: 365
    }
  }
}
+29 −0
Original line number Diff line number Diff line
@@ -113,3 +113,32 @@ def getEvents():
@helper_routes.route("/helper/deleteEntities/<uuid>", methods=["DELETE"])
def deleteUserEntities(uuid):
    return helper_operation.remove_entities(uuid)


@helper_routes.route("/helper/getConfiguration", methods=["GET"])
def getConfiguration():
    """Devuelve toda la configuración actual"""
    return helper_operation.get_configuration()


@helper_routes.route("/helper/updateConfigParam", methods=["PATCH"])
def updateConfigParam():
    """Actualiza un único parámetro de la configuración"""
    data = request.json
    param_path = data.get("param_path")  # Ej. "settings.acl_policy_settings.allowedTotalInvocations"
    new_value = data.get("new_value")

    if not param_path or new_value is None:
        return jsonify(message="Missing 'param_path' or 'new_value' in request body"), 400

    return helper_operation.update_config_param(param_path, new_value)


@helper_routes.route("/helper/replaceConfiguration", methods=["PUT"])
def replaceConfiguration():
    """Reemplaza toda la configuración con una nueva"""
    new_config = request.json
    if not new_config:
        return jsonify(message="Missing new configuration in request body"), 400

    return helper_operation.replace_configuration(new_config)
+48 −0
Original line number Diff line number Diff line
@@ -201,6 +201,54 @@ class HelperOperations:
        current_app.logger.debug(f"User entities removed successfully")
        return jsonify(message="User entities removed successfully"), 200

    def get_configuration(self):
        """Recupera toda la configuración actual"""
        current_app.logger.debug("Retrieving current CAPIF configuration")
        config_col = self.db.get_col_by_name(self.db.capifConfiguration)
        config = config_col.find_one({"config_name": "default"}, {"_id": 0})

        if not config:
            return jsonify(message="No CAPIF configuration found"), 404

        return jsonify(config), 200
    

    def update_config_param(self, param_path, new_value):
        """
        Actualiza un único parámetro en la configuración.
        param_path: Ruta del parámetro (ej. settings.acl_policy_settings.allowedTotalInvocations)
        """
        current_app.logger.debug(f"Updating configuration parameter: {param_path} with value: {new_value}")

        config_col = self.db.get_col_by_name(self.db.capifConfiguration)
        
        # Construir el query dinámico para actualizar un parámetro específico
        update_query = {"$set": {param_path: new_value}}

        result = config_col.update_one({"config_name": "default"}, update_query)

        if result.modified_count == 0:
            return jsonify(message=f"No configuration found or parameter '{param_path}' not updated"), 404

        return jsonify(message=f"Parameter '{param_path}' updated successfully"), 200
    

    def replace_configuration(self, new_config):
        """
        Reemplaza toda la configuración actual con una nueva.
        """
        current_app.logger.debug("Replacing entire CAPIF configuration")

        config_col = self.db.get_col_by_name(self.db.capifConfiguration)

        # Reemplazar la configuración existente con la nueva
        result = config_col.replace_one({"config_name": "default"}, new_config, upsert=True)

        if result.matched_count == 0:
            return jsonify(message="No existing configuration found; a new one was created"), 201

        return jsonify(message="Configuration replaced successfully"), 200