Skip to content

Commit 1140934

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Make sure to generate events when we clear credentials. (#25028)
* Make sure to generate events when we clear credentials. We could end up in a situation where we cleared some credentials, then hit an error, and never generated the event for the credentials we had cleared. * Address review comment.
1 parent 3b645a2 commit 1140934

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/app/clusters/door-lock-server/door-lock-server.cpp

+20-6
Original file line numberDiff line numberDiff line change
@@ -2895,23 +2895,37 @@ EmberAfStatus DoorLockServer::clearCredentials(chip::EndpointId endpointId, chip
28952895
return EMBER_ZCL_STATUS_FAILURE;
28962896
}
28972897

2898+
EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS;
2899+
bool clearedCredential = false;
28982900
for (uint16_t i = 1; i < maxNumberOfCredentials; ++i)
28992901
{
2900-
auto status = clearCredential(endpointId, modifier, sourceNodeId, credentialType, i, false);
2901-
if (EMBER_ZCL_STATUS_SUCCESS != status)
2902+
EmberAfStatus clearStatus = clearCredential(endpointId, modifier, sourceNodeId, credentialType, i, false);
2903+
if (EMBER_ZCL_STATUS_SUCCESS != clearStatus)
29022904
{
29032905
ChipLogError(Zcl,
29042906
"[clearCredentials] Unable to clear the credential - internal error "
29052907
"[endpointId=%d,credentialType=%u,credentialIndex=%d,status=%d]",
29062908
endpointId, to_underlying(credentialType), i, status);
2907-
return status;
2909+
if (status == EMBER_ZCL_STATUS_SUCCESS)
2910+
{
2911+
status = clearStatus;
2912+
}
2913+
}
2914+
else
2915+
{
2916+
clearedCredential = true;
29082917
}
29092918
}
29102919

2911-
sendRemoteLockUserChange(endpointId, credentialTypeToLockDataType(credentialType), DataOperationTypeEnum::kClear, sourceNodeId,
2912-
modifier, 0xFFFE, 0xFFFE);
2920+
// Generate the event if we cleared any credentials, even if we then had errors
2921+
// clearing other ones, so we don't have credentials silently disappearing.
2922+
if (clearedCredential)
2923+
{
2924+
sendRemoteLockUserChange(endpointId, credentialTypeToLockDataType(credentialType), DataOperationTypeEnum::kClear,
2925+
sourceNodeId, modifier, 0xFFFE, 0xFFFE);
2926+
}
29132927

2914-
return EMBER_ZCL_STATUS_SUCCESS;
2928+
return status;
29152929
}
29162930

29172931
bool DoorLockServer::clearFabricFromCredentials(chip::EndpointId endpointId, CredentialTypeEnum credentialType,

0 commit comments

Comments
 (0)