Skip to content

Commit 6a6c409

Browse files
addFromContact: Don't auto-favorite when CLIENT_BASE; don't update last_heard unless CLIENT_BASE (#8495)
Co-authored-by: Ben Meadors <[email protected]>
1 parent 7b14b17 commit 6a6c409

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/mesh/NodeDB.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,13 +1638,32 @@ void NodeDB::addFromContact(meshtastic_SharedContact contact)
16381638
// If should_ignore is set,
16391639
// we need to clear the public key and other cruft, in addition to setting the node as ignored
16401640
info->is_ignored = true;
1641+
info->is_favorite = false;
16411642
info->has_device_metrics = false;
16421643
info->has_position = false;
16431644
info->user.public_key.size = 0;
16441645
info->user.public_key.bytes[0] = 0;
16451646
} else {
1646-
info->last_heard = getValidTime(RTCQualityNTP);
1647-
info->is_favorite = true;
1647+
/* Clients are sending add_contact before every text message DM (because clients may hold a larger node database with
1648+
* public keys than the radio holds). However, we don't want to update last_heard just because we sent someone a DM!
1649+
*/
1650+
1651+
/* "Boring old nodes" are the first to be evicted out of the node database when full. This includes a newly-zeroed
1652+
* nodeinfo because it has: !is_favorite && last_heard==0. To keep this from happening when we addFromContact, we set the
1653+
* new node as a favorite, and we leave last_heard alone (even if it's zero).
1654+
*/
1655+
if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) {
1656+
// Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it
1657+
// without the user doing so deliberately. We don't normally expect users to use a CLIENT_BASE to send DMs or to add
1658+
// contacts, but we should make sure it doesn't auto-favorite in case they do. Instead, as a workaround, we'll set
1659+
// last_heard to now, so that the add_contact node doesn't immediately get evicted.
1660+
info->last_heard = getTime();
1661+
} else {
1662+
// Normal case: set is_favorite to prevent expiration.
1663+
// last_heard will remain as-is (or remain 0 if this entry wasn't in the nodeDB).
1664+
info->is_favorite = true;
1665+
}
1666+
16481667
// As the clients will begin sending the contact with DMs, we want to strictly check if the node is manually verified
16491668
if (contact.manually_verified) {
16501669
info->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK;

src/modules/AdminModule.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,18 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
104104
(config.security.admin_key[2].size == 32 &&
105105
memcmp(mp.public_key.bytes, config.security.admin_key[2].bytes, 32) == 0)) {
106106
LOG_INFO("PKC admin payload with authorized sender key");
107+
108+
// Automatically favorite the node that is using the admin key
107109
auto remoteNode = nodeDB->getMeshNode(mp.from);
108110
if (remoteNode && !remoteNode->is_favorite) {
109-
remoteNode->is_favorite = true;
111+
if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) {
112+
// Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it
113+
// without the user doing so deliberately.
114+
LOG_INFO("PKC admin valid, but not auto-favoriting node %x because role==CLIENT_BASE", mp.from);
115+
} else {
116+
LOG_INFO("PKC admin valid. Auto-favoriting node %x", mp.from);
117+
remoteNode->is_favorite = true;
118+
}
110119
}
111120
} else {
112121
myReply = allocErrorResponse(meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED, &mp);

0 commit comments

Comments
 (0)