Skip to content

Commit ebd4726

Browse files
committed
samples: matter: lock: Add ValidatePINResult
Return `ValidatePINResult` containing user id and credential used for validation. Signed-off-by: Adrian Gielniewski <adrian.gielniewski@nordicsemi.no>
1 parent b63da0e commit ebd4726

File tree

5 files changed

+38
-12
lines changed

5 files changed

+38
-12
lines changed

samples/matter/lock/src/access/access_manager.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ bool AccessManager<CRED_BIT_MASK>::ValidateCustom(CredentialTypeEnum type, chip:
5454
}
5555

5656
template <CredentialsBits CRED_BIT_MASK>
57-
bool AccessManager<CRED_BIT_MASK>::ValidatePIN(const Optional<ByteSpan> &pinCode, OperationErrorEnum &err)
57+
bool AccessManager<CRED_BIT_MASK>::ValidatePIN(const Optional<ByteSpan> &pinCode, OperationErrorEnum &err,
58+
Nullable<ValidatePINResult> &result)
5859
{
5960
/* Optionality of the PIN code is validated by the caller, so assume it is OK not to provide the PIN
6061
* code. */
@@ -72,6 +73,18 @@ bool AccessManager<CRED_BIT_MASK>::ValidatePIN(const Optional<ByteSpan> &pinCode
7273
}
7374

7475
if (credential.credentialData.data_equal(pinCode.Value())) {
76+
uint32_t credentialUserId;
77+
if (GetCredentialUserId(index, CredentialTypeEnum::kPin, credentialUserId) ==
78+
CHIP_NO_ERROR) {
79+
result = ValidatePINResult{
80+
.userId = static_cast<uint16_t>(credentialUserId),
81+
.credential = LockOpCredentials{ CredentialTypeEnum::kPin,
82+
static_cast<uint16_t>(index) },
83+
};
84+
} else {
85+
result = {};
86+
}
87+
7588
LOG_DBG("Valid lock PIN code provided");
7689
return true;
7790
}

samples/matter/lock/src/access/access_manager.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313

1414
template <DoorLockData::CredentialsBits CRED_BIT_MASK> class AccessManager {
1515
public:
16+
struct ValidatePINResult {
17+
uint16_t userId;
18+
LockOpCredentials credential;
19+
};
20+
1621
/**
1722
* @brief Signature of the callback fired when the credential is set.
1823
*
@@ -234,9 +239,11 @@ template <DoorLockData::CredentialsBits CRED_BIT_MASK> class AccessManager {
234239
*
235240
* @param pinCode PIN code data.
236241
* @param err specific error code enumeration.
242+
* @param result user and credential data set on success.
237243
* @return true on success, false otherwise.
238244
*/
239-
bool ValidatePIN(const Optional<chip::ByteSpan> &pinCode, OperationErrorEnum &err);
245+
bool ValidatePIN(const Optional<chip::ByteSpan> &pinCode, OperationErrorEnum &err,
246+
Nullable<ValidatePINResult> &result);
240247
bool ValidateCustom(CredentialTypeEnum type, chip::MutableByteSpan &secret);
241248

242249
/**

samples/matter/lock/src/bolt_lock_manager.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ DlStatus BoltLockManager::SetHolidaySchedule(uint8_t holidayIndex, DlScheduleSta
9696

9797
#endif /* CONFIG_LOCK_SCHEDULES */
9898

99-
bool BoltLockManager::ValidatePIN(const Optional<ByteSpan> &pinCode, OperationErrorEnum &err)
99+
bool BoltLockManager::ValidatePIN(const Optional<chip::ByteSpan> &pinCode, OperationErrorEnum &err,
100+
Nullable<ValidatePINResult> &result)
100101
{
101-
return AccessMgr::Instance().ValidatePIN(pinCode, err);
102+
return AccessMgr::Instance().ValidatePIN(pinCode, err, result);
102103
}
103104

104105
void BoltLockManager::SetRequirePIN(bool require)

samples/matter/lock/src/bolt_lock_manager.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
struct BoltLockManagerEvent;
1919

2020
class BoltLockManager {
21+
using AccessMgr = AccessManager<DoorLockData::PIN>;
22+
2123
public:
2224
static constexpr size_t kMaxCredentialLength = 128;
2325

@@ -39,6 +41,7 @@ class BoltLockManager {
3941

4042
using OperationSource = chip::app::Clusters::DoorLock::OperationSourceEnum;
4143
using StateChangeCallback = void (*)(State, OperationSource);
44+
using ValidatePINResult = AccessMgr::ValidatePINResult;
4245

4346
static constexpr uint32_t kActuatorMovementTimeMs = 2000;
4447

@@ -74,7 +77,8 @@ class BoltLockManager {
7477
uint32_t localEndTime, OperatingModeEnum operatingMode);
7578
#endif /* CONFIG_LOCK_SCHEDULES */
7679

77-
bool ValidatePIN(const Optional<chip::ByteSpan> &pinCode, OperationErrorEnum &err);
80+
bool ValidatePIN(const Optional<chip::ByteSpan> &pinCode, OperationErrorEnum &err,
81+
Nullable<ValidatePINResult> &result);
7882

7983
void Lock(OperationSource source);
8084
void Unlock(OperationSource source);
@@ -85,7 +89,6 @@ class BoltLockManager {
8589
void FactoryReset();
8690

8791
private:
88-
using AccessMgr = AccessManager<DoorLockData::PIN>;
8992
friend class AppTask;
9093

9194
void SetState(State state, OperationSource source);

samples/matter/lock/src/zcl_callbacks.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,30 @@ bool emberAfPluginDoorLockOnDoorLockCommand(EndpointId endpointId, const Nullabl
6363
const Nullable<chip::NodeId> &nodeId, const Optional<ByteSpan> &pinCode,
6464
OperationErrorEnum &err)
6565
{
66-
bool result = BoltLockMgr().ValidatePIN(pinCode, err);
66+
Nullable<BoltLockManager::ValidatePINResult> validatePINResult;
67+
bool success = BoltLockMgr().ValidatePIN(pinCode, err, validatePINResult);
6768

6869
/* Handle changing attribute state on command reception */
69-
if (result) {
70+
if (success) {
7071
BoltLockMgr().Lock(BoltLockManager::OperationSource::kRemote);
7172
}
7273

73-
return result;
74+
return success;
7475
}
7576

7677
bool emberAfPluginDoorLockOnDoorUnlockCommand(EndpointId endpointId, const Nullable<chip::FabricIndex> &fabricIdx,
7778
const Nullable<chip::NodeId> &nodeId, const Optional<ByteSpan> &pinCode,
7879
OperationErrorEnum &err)
7980
{
80-
bool result = BoltLockMgr().ValidatePIN(pinCode, err);
81+
Nullable<BoltLockManager::ValidatePINResult> validatePINResult;
82+
bool success = BoltLockMgr().ValidatePIN(pinCode, err, validatePINResult);
8183

8284
/* Handle changing attribute state on command reception */
83-
if (result) {
85+
if (success) {
8486
BoltLockMgr().Unlock(BoltLockManager::OperationSource::kRemote);
8587
}
8688

87-
return result;
89+
return success;
8890
}
8991

9092
void emberAfDoorLockClusterInitCallback(EndpointId endpoint)

0 commit comments

Comments
 (0)