/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#ifndef LWM2M_OBJ_ACCESS_CONTROL_H
#define LWM2M_OBJ_ACCESS_CONTROL_H
#include "lwm2m_engine.h"
#include "lwm2m_object.h"

/**
 * @brief Main access control logic. Checks if the server with instance id @p server_obj_inst are
 * allowed to do @p operation on the object instance of object id @p obj_id
 * and object instance id @p obj_inst_id. If access control is enabled, this should
 * be called before every operation to test access.
 *
 * @param obj_id object id of the object instance having its rights checked.
 * @param obj_inst_id object instance id of the object instance having its rights checked.
 * @param server_obj_inst object instance id of the server attempting to do the operation.
 * @param operation lwm2m operation / permission (like LWM2M_OP_READ)
 * @param bootstrap_mode 1/0. Bootstrap servers should have complete access during bootstrap.
 * @return int to signal access:
 *		 0		- server has access
 *		-EACCES	- unauthorized
 *		-EPERM	- method not allowed
 */
int access_control_check_access(uint16_t obj_id, uint16_t obj_inst_id, uint16_t server_obj_inst,
				uint16_t operation, bool bootstrap_mode);

/**
 * @brief Creates an access control object instance. Should be called every
 * time an object instance is created.
 *
 * @param obj_id object id of the object instance getting an access control.
 * @param obj_inst_id object instance id of the object instance getting access control.
 * @param server_obj_inst_id object instance id of the server creating the object instance.
 */
void access_control_add(uint16_t obj_id, uint16_t obj_inst_id, int server_obj_inst_id);

/**
 * @brief Creates an access control object instance for objects. Should be called if servers should
 * have access to create object instances of object id @p obj_id.
 *
 * @param obj_id object id of the object getting access control.
 * @param server_obj_inst_id object instance id of the server creating the access control
 * object instance.
 */
void access_control_add_obj(uint16_t obj_id, int server_obj_inst_id);

/**
 * @brief Removes the access control instance that contains the access rights concerning
 * the object instance of object id @p obj_id and object instance id @p obj_inst_id.
 * Does nothing if obj_id == 2 (i.e. object id for access control). Should be called
 * automatically any time an object instance is unregistered/deleted.
 *
 * @param obj_id object id of the object instance getting removed.
 * @param obj_inst_id object instance id of the object instance getting removed.
 */
void access_control_remove(uint16_t obj_id, uint16_t obj_inst_id);

/**
 * @brief Removes the access control instance that contains the access rights concerning
 * the object with object id @p obj_id.
 *
 * @param obj_id object id of the object gettting removed.
 */
void access_control_remove_obj(uint16_t obj_id);

#endif
