Skip to content

Commit 14d7dc2

Browse files
silabs-borislrzr
authored andcommitted
UIC-3222: Fix credential discovery
0 nodes are better handled Credential node are properly deleted when no credential is available
1 parent ff8c0de commit 14d7dc2

File tree

2 files changed

+38
-25
lines changed

2 files changed

+38
-25
lines changed

applications/zpc/components/zwave_command_classes/src/zwave_command_class_user_credential.cpp

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -475,13 +475,6 @@ static sl_status_t zwave_command_class_user_credential_credential_get(
475475
frame_generator.add_value(cred_nodes.type_node, REPORTED_ATTRIBUTE);
476476
frame_generator.add_value(cred_nodes.slot_node, DESIRED_ATTRIBUTE);
477477
frame_generator.validate_frame(frame_length);
478-
479-
// Delete special nodes (start interview of credentials)
480-
if (cred_nodes.type_node.reported<user_credential_type_t>() == 0
481-
&& cred_nodes.slot_node.desired<user_credential_slot_t>() == 0) {
482-
cred_nodes.type_node.delete_node();
483-
cred_nodes.slot_node.delete_node();
484-
}
485478
} catch (const std::exception &e) {
486479
sl_log_error(LOG_TAG,
487480
"Error while generating Credential Get frame : %s",
@@ -675,14 +668,43 @@ sl_status_t zwave_command_class_user_credential_credential_handle_report(
675668
return SL_STATUS_OK;
676669
// Update desired value if found, otherwise create the nodes
677670
case credential_report_type_t::RESPONSE_TO_GET:
671+
// First check if this is the first credential interview
678672
credential_type_node
679-
= create_or_update_desired_value(user_id_node,
680-
ATTRIBUTE(CREDENTIAL_TYPE),
681-
credential_type);
682-
credential_slot_node
683-
= create_or_update_desired_value(credential_type_node,
684-
ATTRIBUTE(CREDENTIAL_SLOT),
685-
credential_slot);
673+
= user_id_node.child_by_type_and_value(ATTRIBUTE(CREDENTIAL_TYPE),
674+
0,
675+
REPORTED_ATTRIBUTE);
676+
credential_slot_node = credential_type_node.child_by_type_and_value(
677+
ATTRIBUTE(CREDENTIAL_SLOT),
678+
0,
679+
DESIRED_ATTRIBUTE);
680+
// Update the values of the first nodes if present
681+
if (credential_type_node.is_valid()
682+
&& credential_slot_node.is_valid()) {
683+
// If no credential are reported, we can delete the nodes
684+
if (credential_type == 0 && credential_slot == 0) {
685+
sl_log_debug(LOG_TAG, "No credential to get for user %d", user_id);
686+
credential_type_node.delete_node();
687+
credential_slot_node.delete_node();
688+
return SL_STATUS_OK;
689+
} else {
690+
sl_log_debug(LOG_TAG,
691+
"First credential : Updating credential type and slot for user %d",
692+
user_id);
693+
credential_type_node.set_reported(credential_type);
694+
credential_slot_node.clear_desired();
695+
credential_slot_node.set_reported(credential_slot);
696+
}
697+
} else {
698+
// Otherwise create or get the nodes
699+
credential_type_node
700+
= create_or_update_desired_value(user_id_node,
701+
ATTRIBUTE(CREDENTIAL_TYPE),
702+
credential_type);
703+
credential_slot_node
704+
= create_or_update_desired_value(credential_type_node,
705+
ATTRIBUTE(CREDENTIAL_SLOT),
706+
credential_slot);
707+
}
686708
break;
687709
case credential_report_type_t::CREDENTIAL_ADD_REJECTED_LOCATION_OCCUPIED:
688710
sl_log_error(LOG_TAG,
@@ -809,6 +831,8 @@ sl_status_t zwave_command_class_user_credential_credential_handle_report(
809831
trigger_get_credential(user_id_node,
810832
next_credential_type,
811833
next_credential_slot);
834+
} else {
835+
sl_log_debug(LOG_TAG, "No more credential to get.");
812836
}
813837

814838
} catch (const std::exception &e) {

applications/zpc/components/zwave_command_classes/test/zwave_command_class_user_credential_test.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,17 +1349,6 @@ void test_user_credential_credential_report_happy_case()
13491349
next_credential_slot);
13501350

13511351
// Test values
1352-
TEST_ASSERT_FALSE_MESSAGE(first_credential_type_node.is_valid(),
1353-
"Credential type node 0 should have been deleted");
1354-
TEST_ASSERT_FALSE_MESSAGE(first_credential_slot_node.is_valid(),
1355-
"Credential slot node 0 should have been deleted");
1356-
1357-
first_credential_type_node
1358-
= helper_test_and_get_node(ATTRIBUTE(CREDENTIAL_TYPE), user_id_node);
1359-
first_credential_slot_node
1360-
= helper_test_and_get_node(ATTRIBUTE(CREDENTIAL_SLOT),
1361-
first_credential_type_node);
1362-
13631352
test_credential_values(first_credential_type_node,
13641353
first_credential_slot_node);
13651354
// We should have 1 credential type and 2 credential slot

0 commit comments

Comments
 (0)