From b5c957c473ffc924f72f4650d458994a0341bf48 Mon Sep 17 00:00:00 2001 From: Koncord Date: Tue, 17 Jul 2018 00:58:37 +0800 Subject: [PATCH] [Server] Move PreInit code to preInit method --- apps/openmw-mp/Networking.cpp | 145 ++++++++++++++++++---------------- apps/openmw-mp/Networking.hpp | 3 +- 2 files changed, 77 insertions(+), 71 deletions(-) diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index 41780a00c..1d622ff3f 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -212,88 +212,84 @@ void Networking::processWorldstatePacket(RakNet::Packet *packet) } -void Networking::update(RakNet::Packet *packet) +bool Networking::preInit(RakNet::Packet *packet, RakNet::BitStream &bsIn) { - Player *player = Players::getPlayer(packet->guid); - - RakNet::BitStream bsIn(&packet->data[1], packet->length, false); - - bsIn.IgnoreBytes((unsigned int) RakNet::RakNetGUID::size()); // Ignore GUID from received packet - - if (player == nullptr) + if (packet->data[0] != ID_GAME_PREINIT) { - if (packet->data[0] == ID_GAME_PREINIT) - { - DEBUG_PRINTF("ID_GAME_PREINIT"); - PacketPreInit::PluginContainer plugins; + LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "%s sent wrong first packet (ID_GAME_PREINIT was expected)", + packet->systemAddress.ToString()); + peer->CloseConnection(packet->systemAddress, true); + } - PacketPreInit packetPreInit(peer); - packetPreInit.SetReadStream(&bsIn); - packetPreInit.setChecksums(&plugins); - packetPreInit.Read(); + DEBUG_PRINTF("ID_GAME_PREINIT"); + PacketPreInit::PluginContainer plugins; - if (!packetPreInit.isPacketValid()) - { - LOG_APPEND(Log::LOG_ERROR, "Invalid packetPreInit"); - peer->CloseConnection(packet->systemAddress, false); // close connection without notification - return; - } + PacketPreInit packetPreInit(peer); + packetPreInit.SetReadStream(&bsIn); + packetPreInit.setChecksums(&plugins); + packetPreInit.Read(); - auto plugin = plugins.begin(); - if (samples.size() == plugins.size()) - { - for (int i = 0; plugin != plugins.end(); plugin++, i++) - { - LOG_APPEND(Log::LOG_VERBOSE, "- %X\t%s", plugin->second[0], plugin->first.c_str()); - // Check if the filenames match, ignoring case - if (Misc::StringUtils::ciEqual(samples[i].first, plugin->first)) - { - auto &hashList = samples[i].second; - // Proceed if no checksums have been listed for this plugin on the server - if (hashList.empty()) - continue; - auto it = find(hashList.begin(), hashList.end(), plugin->second[0]); - // Break the loop if the client's checksum isn't among those accepted by - // the server - if (it == hashList.end()) - break; - - } - else // name is incorrect - break; - } - } - RakNet::BitStream bs; - packetPreInit.SetSendStream(&bs); + if (!packetPreInit.isPacketValid()) + { + LOG_APPEND(Log::LOG_ERROR, "Invalid packetPreInit"); + peer->CloseConnection(packet->systemAddress, false); // close connection without notification + return false; + } - // If the loop above was broken, then the client's plugins do not match the server's - if (pluginEnforcementState && plugin != plugins.end()) - { - LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was not allowed to connect due to incompatible plugins", packet->systemAddress.ToString()); - packetPreInit.setChecksums(&samples); - packetPreInit.Send(packet->systemAddress); - peer->CloseConnection(packet->systemAddress, true); - } - else + auto plugin = plugins.begin(); + if (samples.size() == plugins.size()) + { + for (int i = 0; plugin != plugins.end(); plugin++, i++) + { + LOG_APPEND(Log::LOG_VERBOSE, "- %X\t%s", plugin->second[0], plugin->first.c_str()); + // Check if the filenames match, ignoring case + if (Misc::StringUtils::ciEqual(samples[i].first, plugin->first)) { - LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was allowed to connect", packet->systemAddress.ToString()); - PacketPreInit::PluginContainer tmp; - packetPreInit.setChecksums(&tmp); - packetPreInit.Send(packet->systemAddress); + auto &hashList = samples[i].second; + // Proceed if no checksums have been listed for this plugin on the server + if (hashList.empty()) + continue; + auto it = find(hashList.begin(), hashList.end(), plugin->second[0]); + // Break the loop if the client's checksum isn't among those accepted by + // the server + if (it == hashList.end()) + break; } - return; + else // name is incorrect + break; } + } + RakNet::BitStream bs; + packetPreInit.SetSendStream(&bs); - playerPacketController->SetStream(&bsIn, 0); - + // If the loop above was broken, then the client's plugins do not match the server's + if (pluginEnforcementState && plugin != plugins.end()) + { + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was not allowed to connect due to incompatible plugins", packet->systemAddress.ToString()); + packetPreInit.setChecksums(&samples); + packetPreInit.Send(packet->systemAddress); + peer->CloseConnection(packet->systemAddress, true); + } + else + { + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was allowed to connect", packet->systemAddress.ToString()); + PacketPreInit::PluginContainer tmp; + packetPreInit.setChecksums(&tmp); + packetPreInit.Send(packet->systemAddress); + Players::newPlayer(packet->guid); // create player if connection allowed + playerPacketController->SetStream(&bsIn, nullptr); // and request handshake playerPacketController->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid); - Players::newPlayer(packet->guid); - player = Players::getPlayer(packet->guid); - return; + return true; } - else if (playerPacketController->ContainsPacket(packet->data[0])) + + return false; +} + +void Networking::update(RakNet::Packet *packet, RakNet::BitStream &bsIn) +{ + if (playerPacketController->ContainsPacket(packet->data[0])) { - playerPacketController->SetStream(&bsIn, 0); + playerPacketController->SetStream(&bsIn, nullptr); processPlayerPacket(packet); } else if (actorPacketController->ContainsPacket(packet->data[0])) @@ -531,8 +527,17 @@ int Networking::mainLoop() case ID_UNCONNECTED_PING: break; default: - update(packet); + { + RakNet::BitStream bsIn(&packet->data[1], packet->length, false); + bsIn.IgnoreBytes((unsigned int) RakNet::RakNetGUID::size()); // Ignore GUID from received packet + + + if (Players::isPlayerExists(packet->guid)) + update(packet, bsIn); + else + preInit(packet, bsIn); break; + } } } TimerAPI::Tick(); diff --git a/apps/openmw-mp/Networking.hpp b/apps/openmw-mp/Networking.hpp index c1c003315..3b1801d4c 100644 --- a/apps/openmw-mp/Networking.hpp +++ b/apps/openmw-mp/Networking.hpp @@ -29,7 +29,7 @@ namespace mwmp void processActorPacket(RakNet::Packet *packet); void processObjectPacket(RakNet::Packet *packet); void processWorldstatePacket(RakNet::Packet *packet); - void update(RakNet::Packet *packet); + void update(RakNet::Packet *packet, RakNet::BitStream &bsIn); unsigned short numberOfConnections() const; unsigned int maxConnections() const; @@ -65,6 +65,7 @@ namespace mwmp void postInit(); private: + bool preInit(RakNet::Packet *packet, RakNet::BitStream &bsIn); PacketPreInit::PluginContainer getPluginListSample(); std::string serverPassword; static Networking *sThis;