From 6da5a631526113a09c767abf57f3b1c5348d8801 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Jun 2017 14:53:57 -0700 Subject: [PATCH] verify replicated packets in packet filter --- libraries/networking/src/LimitedNodeList.cpp | 37 ++++++++++++++++++- .../networking/src/udt/PacketHeaders.cpp | 1 + 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index afff71ba23..2212001fec 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -257,8 +257,41 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe PacketType headerType = NLPacket::typeInHeader(packet); if (NON_SOURCED_PACKETS.contains(headerType)) { - emit dataReceived(NodeType::Unassigned, packet.getPayloadSize()); - return true; + if (REPLICATED_PACKET_MAPPING.key(headerType) != PacketType::Unknown) { + // this is a replicated packet type - make sure the socket that sent it to us matches + // one from one of our current upstream nodes + + NodeType_t sendingNodeType { NodeType::Unassigned }; + + eachNodeBreakable([&packet, &sendingNodeType](const SharedNodePointer& node){ + if (node->getType() == NodeType::upstreamType(node->getType()) + && node->getPublicSocket() == packet.getSenderSockAddr()) { + sendingNodeType = node->getType(); + return false; + } else { + return true; + } + }); + + if (sendingNodeType != NodeType::Unassigned) { + emit dataReceived(sendingNodeType, packet.getPayloadSize()); + return true; + } else { + static const QString UNSOLICITED_REPLICATED_REGEX = + "Replicated packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown upstream"; + static QString repeatedMessage + = LogHandler::getInstance().addRepeatedMessageRegex(UNSOLICITED_REPLICATED_REGEX); + + qCDebug(networking) << "Replicated packet of type" << headerType + << "received from unknown upstream" << packet.getSenderSockAddr(); + + return false; + } + + } else { + emit dataReceived(NodeType::Unassigned, packet.getPayloadSize()); + return true; + } } else { QUuid sourceID = NLPacket::sourceIDInHeader(packet); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index fb416cac4d..ad15d04db1 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -51,6 +51,7 @@ const QHash REPLICATED_PACKET_MAPPING { { PacketType::SilentAudioFrame, PacketType::ReplicatedSilentAudioFrame }, { PacketType::AvatarIdentity, PacketType::ReplicatedAvatarIdentity }, { PacketType::KillAvatar, PacketType::ReplicatedKillAvatar }, + { PacketType::BulkAvatarData, PacketType::ReplicatedBulkAvatarData } }; PacketVersion versionForPacketType(PacketType packetType) {