blob: 1db9006f5f59654a59eb3de9bccbce8e375a0719 [file] [log] [blame]
#include "IcdManagementServer.h"
#include <app/icd/IcdMonitoringTable.h>
using namespace chip;
using namespace chip::Protocols;
namespace chip {
IcdManagementServer IcdManagementServer::mInstance;
Status IcdManagementServer::RegisterClient(PersistentStorageDelegate & storage, FabricIndex fabric_index, chip::NodeId node_id,
uint64_t monitored_subject, chip::ByteSpan key,
Optional<chip::ByteSpan> verification_key, bool is_admin)
{
IcdMonitoringTable table(storage, fabric_index, GetClientsSupportedPerFabric());
// Get current entry, if exists
IcdMonitoringEntry entry;
CHIP_ERROR err = table.Find(node_id, entry);
if (CHIP_NO_ERROR == err)
{
// Existing entry: Validate Key if, and only if, the ISD has NOT administrator permissions
if (!is_admin)
{
VerifyOrReturnError(verification_key.HasValue(), InteractionModel::Status::Failure);
VerifyOrReturnError(verification_key.Value().data_equal(entry.key), InteractionModel::Status::Failure);
}
}
else if (CHIP_ERROR_NOT_FOUND == err)
{
// New entry
VerifyOrReturnError(entry.index < table.Limit(), InteractionModel::Status::ResourceExhausted);
}
else
{
// Error
return InteractionModel::Status::Failure;
}
// Save
entry.checkInNodeID = node_id;
entry.monitoredSubject = monitored_subject;
entry.key = key;
err = table.Set(entry.index, entry);
VerifyOrReturnError(CHIP_ERROR_INVALID_ARGUMENT != err, InteractionModel::Status::ConstraintError);
VerifyOrReturnError(CHIP_NO_ERROR == err, InteractionModel::Status::Failure);
return InteractionModel::Status::Success;
}
Status IcdManagementServer::UnregisterClient(PersistentStorageDelegate & storage, FabricIndex fabric_index, chip::NodeId node_id,
Optional<chip::ByteSpan> verificationKey, bool is_admin)
{
IcdMonitoringTable table(storage, fabric_index, GetClientsSupportedPerFabric());
// Get current entry, if exists
IcdMonitoringEntry entry;
CHIP_ERROR err = table.Find(node_id, entry);
VerifyOrReturnError(CHIP_ERROR_NOT_FOUND != err, InteractionModel::Status::NotFound);
VerifyOrReturnError(CHIP_NO_ERROR == err, InteractionModel::Status::Failure);
// Existing entry: Validate Key if, and only if, the ISD has NOT administrator permissions
if (!is_admin)
{
VerifyOrReturnError(verificationKey.HasValue(), InteractionModel::Status::Failure);
VerifyOrReturnError(verificationKey.Value().data_equal(entry.key), InteractionModel::Status::Failure);
}
err = table.Remove(entry.index);
VerifyOrReturnError(CHIP_NO_ERROR == err, InteractionModel::Status::Failure);
return InteractionModel::Status::Success;
}
Status IcdManagementServer::StayActiveRequest(FabricIndex fabric_index)
{
// TODO: Implementent stay awake logic for end device
return InteractionModel::Status::UnsupportedCommand;
}
} // namespace chip