blob: cb0b6f0b8f088aa7698f16c599b94372bdc504d1 [file] [log] [blame]
/*
*
* Copyright (c) 2024 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <stdint.h>
#include <lib/core/CHIPError.h>
#include <lib/core/Optional.h>
namespace chip {
namespace app {
/**
* @brief Represents a pair of terms and conditions value and version.
*
* This class encapsulates terms and conditions with methods to validate a user's accepted value and version against required
* criteria.
*/
class TermsAndConditions
{
public:
TermsAndConditions(uint16_t inValue, uint16_t inVersion) : value(inValue), version(inVersion) {}
bool operator==(const TermsAndConditions & other) const { return value == other.value && version == other.version; }
bool operator!=(const TermsAndConditions & other) const { return !(*this == other); }
/**
* @brief Retrieves the terms and conditions value (accepted bits).
*
* @return The value of the terms and conditions.
*/
uint16_t GetValue() const { return value; }
/**
* @brief Retrieves the terms and conditions version.
*
* @return The version of the terms and conditions.
*/
uint16_t GetVersion() const { return version; }
/**
* @brief Validates the terms and conditions value.
*
* Checks whether all required bits are set in the accepted terms and conditions.
*
* @param acceptedTermsAndConditions The user's accepted terms and conditions.
* @return True if all required bits are set, false otherwise.
*/
bool ValidateValue(const TermsAndConditions & acceptedTermsAndConditions) const
{
// Check if all required bits are set in the user-accepted value.
return ((value & acceptedTermsAndConditions.GetValue()) == value);
}
/**
* @brief Validates the terms and conditions version.
*
* Checks whether the accepted version is greater than or equal to the required version.
*
* @param acceptedTermsAndConditions The user's accepted terms and conditions.
* @return True if the accepted version is valid, false otherwise.
*/
bool ValidateVersion(const TermsAndConditions & acceptedTermsAndConditions) const
{
// Check if the version is below the minimum required version.
return (acceptedTermsAndConditions.GetVersion() >= version);
}
/**
* @brief Validates the terms and conditions.
*
* Combines validation of both value and version to ensure compliance with requirements.
*
* @param acceptedTermsAndConditions The user's accepted terms and conditions.
* @return True if both value and version validations pass, false otherwise.
*/
bool Validate(const TermsAndConditions & acceptedTermsAndConditions) const
{
return ValidateVersion(acceptedTermsAndConditions) && ValidateValue(acceptedTermsAndConditions);
}
private:
const uint16_t value;
const uint16_t version;
};
/**
* @brief Data access layer for handling the required terms and conditions and managing user acceptance status.
*
* This class provides methods to manage the acceptance of terms and conditions, including storing, retrieving,
* and verifying the acceptance status. It also supports temporary in-memory storage and persistent storage for
* accepted terms and conditions.
*/
class TermsAndConditionsProvider
{
public:
virtual ~TermsAndConditionsProvider() = default;
/**
* @brief Persists the acceptance of the terms and conditions.
*
* This method commits the in-memory acceptance status to persistent storage. It stores the acceptance
* status in a permanent location and clears the temporary in-memory acceptance state after committing.
*
* @retval CHIP_NO_ERROR if the terms were successfully persisted.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR CommitAcceptance() = 0;
/**
* @brief Retrieves the current acceptance status of the terms and conditions.
*
* This method checks the temporary in-memory acceptance state first. If no in-memory state is found,
* it attempts to retrieve the acceptance status from persistent storage. If no terms have been accepted,
* it returns an empty `Optional`.
*
* @param[out] outTermsAndConditions The current accepted terms and conditions, if any.
*
* @retval CHIP_NO_ERROR if the terms were successfully retrieved or no terms were found.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR GetAcceptance(Optional<TermsAndConditions> & outTermsAndConditions) const = 0;
/**
* @brief Determines if acknowledgments are required.
*
* @param[out] outAcknowledgementsRequired True if acknowledgments are required, false otherwise.
*
* @retval CHIP_NO_ERROR if successful.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR GetAcknowledgementsRequired(bool & outAcknowledgementsRequired) const = 0;
/**
* @brief Retrieves the requirements for the terms and conditions.
*
* This method retrieves the required terms and conditions that must be accepted by the user. These
* requirements are set by the provider and used to validate the acceptance.
*
* @param[out] outTermsAndConditions The required terms and conditions.
*
* @retval CHIP_NO_ERROR if the required terms were successfully retrieved.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR GetRequirements(Optional<TermsAndConditions> & outTermsAndConditions) const = 0;
/**
* @brief Retrieves the deadline for accepting updated terms and conditions.
*
* This method retrieves the deadline by which the user must accept updated terms and conditions.
* If no deadline is set, it returns an empty `Optional`.
*
* @param[out] outUpdateAcceptanceDeadline The deadline (in seconds) by which updated terms must be accepted.
* Returns empty Optional if no deadline is set.
*
* @retval CHIP_NO_ERROR if the deadline was successfully retrieved or no deadline was found.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR GetUpdateAcceptanceDeadline(Optional<uint32_t> & outUpdateAcceptanceDeadline) const = 0;
/**
* @brief Resets the persisted acceptance status.
*
* This method deletes the persisted acceptance of the terms and conditions from storage, effectively
* resetting the stored acceptance status. Any in-memory temporary acceptance will also be cleared
* through this method.
*
* @retval CHIP_NO_ERROR if the terms were successfully reset.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR ResetAcceptance() = 0;
/**
* @brief Clears the in-memory temporary acceptance status.
*
* This method clears any temporary acceptance of the terms and conditions that is held in-memory. It does
* not affect the persisted state stored in storage.
*
* @retval CHIP_NO_ERROR if the in-memory acceptance state was successfully cleared.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR RevertAcceptance() = 0;
/**
* @brief Sets the temporary in-memory acceptance status of the terms and conditions.
*
* This method stores the provided terms and conditions acceptance status in-memory. It does not persist
* the acceptance status to storage. To persist the acceptance, call `CommitAcceptance()` after this method.
*
* @param[in] inTermsAndConditions The terms and conditions to be accepted temporarily.
*
* @retval CHIP_NO_ERROR if the terms were successfully stored in-memory.
* @retval CHIP_ERROR_INVALID_ARGUMENT if the provided terms and conditions are invalid.
* @retval CHIP_ERROR_UNINITIALIZED if the module has not been initialized.
* @retval CHIP_ERROR_* for other errors.
*/
virtual CHIP_ERROR SetAcceptance(const Optional<TermsAndConditions> & inTermsAndConditions) = 0;
};
} // namespace app
} // namespace chip