diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 892ac3648..37d1c7a78 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -1567,6 +1567,17 @@ bool NodeDB::hasValidPosition(const meshtastic_NodeInfoLite *n) return n->has_position && (n->position.latitude_i != 0 || n->position.longitude_i != 0); } +/// If we have a node / user and they report is_licensed = true +/// we consider them licensed +UserLicenseStatus NodeDB::getLicenseStatus(uint32_t nodeNum) +{ + meshtastic_NodeInfoLite *info = getMeshNode(nodeNum); + if (!info || !info->has_user) { + return UserLicenseStatus::NotKnown; + } + return info->user.is_licensed ? UserLicenseStatus::Licensed : UserLicenseStatus::NotLicensed; +} + /// Record an error that should be reported via analytics void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, const char *filename) { diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index e281b5a3e..44e2ebcc8 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -68,6 +68,8 @@ enum LoadFileResult { OTHER_FAILURE = 5 }; +enum UserLicenseStatus { NotKnown, NotLicensed, Licensed }; + class NodeDB { // NodeNum provisionalNodeNum; // if we are trying to find a node num this is our current attempt @@ -167,6 +169,8 @@ class NodeDB virtual meshtastic_NodeInfoLite *getMeshNode(NodeNum n); size_t getNumMeshNodes() { return numMeshNodes; } + UserLicenseStatus getLicenseStatus(uint32_t nodeNum); + size_t getMaxNodesAllocatedSize() { meshtastic_NodeDatabase emptyNodeDatabase; diff --git a/src/modules/RoutingModule.cpp b/src/modules/RoutingModule.cpp index a501e319b..34ef2ddd1 100644 --- a/src/modules/RoutingModule.cpp +++ b/src/modules/RoutingModule.cpp @@ -20,6 +20,11 @@ bool RoutingModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mesh if ((nodeDB->getMeshNode(mp.from) == NULL || !nodeDB->getMeshNode(mp.from)->has_user) && (nodeDB->getMeshNode(mp.to) == NULL || !nodeDB->getMeshNode(mp.to)->has_user)) return false; + } else if (owner.is_licensed && nodeDB->getLicenseStatus(mp.from) == UserLicenseStatus::NotLicensed) { + // Don't let licensed users to rebroadcast packets from unlicensed users + // If we know they are in-fact unlicensed + LOG_DEBUG("Packet from unlicensed user, ignoring packet"); + return false; } printPacket("Routing sniffing", &mp);