From 6191a2d221fdadd056b959c84ad79c541dc4bacd Mon Sep 17 00:00:00 2001 From: iAmir Date: Sun, 5 Jan 2025 22:06:52 +0330 Subject: [PATCH] omp user detection & server to client encryption for omp users (#1026) * omp user detection & server to client encryption for omp users * sync raknet * send bits to RakServer::Send instead of bytes * sync raknet * add use_omp_encryption * sync raknet (one map for encryption data) * fix abi i guess * configure omp user even if encryption is disabled --- SDK | 2 +- .../LegacyNetwork/legacy_network_impl.cpp | 13 ++++++++++--- .../LegacyNetwork/legacy_network_impl.hpp | 12 ++++++------ Server/Components/Pawn/Scripting/Player/Natives.cpp | 7 ++++++- Server/Source/core_impl.hpp | 1 + Server/Source/player_impl.hpp | 7 +++++++ Shared/NetCode/core.hpp | 2 ++ lib/RakNet | 2 +- 8 files changed, 34 insertions(+), 12 deletions(-) diff --git a/SDK b/SDK index 3dc9cf854..18addb6c7 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 3dc9cf854c2a002a683baf50d5845f396c634e2c +Subproject commit 18addb6c7175439d17bc88166abfe70fe01538b2 diff --git a/Server/Components/LegacyNetwork/legacy_network_impl.cpp b/Server/Components/LegacyNetwork/legacy_network_impl.cpp index 5fb4b520f..25ad93192 100644 --- a/Server/Components/LegacyNetwork/legacy_network_impl.cpp +++ b/Server/Components/LegacyNetwork/legacy_network_impl.cpp @@ -313,7 +313,7 @@ enum LegacyClientVersion LegacyClientVersion_03DL = 4062 }; -IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOfficialClient) +IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOmp, bool isUsingOfficialClient) { const RakNet::PlayerID rid = rpcParams->sender; @@ -344,6 +344,7 @@ IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bo params.bot = isNPC; params.serial = serial; params.isUsingOfficialClient = isUsingOfficialClient; + params.isUsingOmp = isUsingOmp; newConnectionResult = core->getPlayers().requestPlayer(netData, params); } else @@ -425,7 +426,13 @@ void RakNetLegacyNetwork::OnPlayerConnect(RakNet::RPCParameters* rpcParams, void return; } - IPlayer* newPeer = network->OnPeerConnect(rpcParams, false, serial, playerConnectRPC.VersionNumber, playerConnectRPC.VersionString, playerConnectRPC.ChallengeResponse, playerConnectRPC.Name, playerConnectRPC.IsUsingOfficialClient); + bool isUsingOmp = SAMPRakNet::IsPlayerUsingOmp(rpcParams->sender); + if (isUsingOmp) + { + SAMPRakNet::SetPlayerOmpVersion(rpcParams->sender, playerConnectRPC.OmpVersion); + } + + IPlayer* newPeer = network->OnPeerConnect(rpcParams, false, serial, playerConnectRPC.VersionNumber, playerConnectRPC.VersionString, playerConnectRPC.ChallengeResponse, playerConnectRPC.Name, isUsingOmp, playerConnectRPC.IsUsingOfficialClient); if (!newPeer) { network->rakNetServer.Kick(rpcParams->sender); @@ -474,7 +481,7 @@ void RakNetLegacyNetwork::OnNPCConnect(RakNet::RPCParameters* rpcParams, void* e NetCode::RPC::NPCConnect NPCConnectRPC; if (NPCConnectRPC.read(bs)) { - IPlayer* newPeer = network->OnPeerConnect(rpcParams, true, "", NPCConnectRPC.VersionNumber, "npc", NPCConnectRPC.ChallengeResponse, NPCConnectRPC.Name); + IPlayer* newPeer = network->OnPeerConnect(rpcParams, true, "", NPCConnectRPC.VersionNumber, "npc", NPCConnectRPC.ChallengeResponse, NPCConnectRPC.Name, false); if (newPeer) { if (!network->inEventDispatcher.stopAtFalse( diff --git a/Server/Components/LegacyNetwork/legacy_network_impl.hpp b/Server/Components/LegacyNetwork/legacy_network_impl.hpp index 02263a1d1..6d64a2210 100644 --- a/Server/Components/LegacyNetwork/legacy_network_impl.hpp +++ b/Server/Components/LegacyNetwork/legacy_network_impl.hpp @@ -37,8 +37,8 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi ICore* core = nullptr; Query query; RakNet::RakServerInterface& rakNetServer; - std::array playerFromRakIndex; - std::array playerRemoteSystem; + StaticArray playerFromRakIndex; + StaticArray playerRemoteSystem; Milliseconds cookieSeedTime; TimePoint lastCookieSeed; @@ -130,11 +130,11 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi const PeerNetworkData::NetworkID& nid = netData.networkID; const RakNet::PlayerID rid { unsigned(nid.address.v4), nid.port }; - return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfUnreadBits(), RakNet::HIGH_PRIORITY, reliability, channel, rid, true); + return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, true); } } - return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfUnreadBits(), RakNet::HIGH_PRIORITY, reliability, channel, RakNet::UNASSIGNED_PLAYER_ID, true); + return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, RakNet::UNASSIGNED_PLAYER_ID, true); } bool sendPacket(IPlayer& peer, Span data, int channel, bool dispatchEvents) override @@ -177,7 +177,7 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi const PeerNetworkData::NetworkID& nid = netData.networkID; const RakNet::PlayerID rid { unsigned(nid.address.v4), nid.port }; const RakNet::PacketReliability reliability = (channel == OrderingChannel_Reliable) ? RakNet::RELIABLE : ((channel == OrderingChannel_Unordered) ? RakNet::UNRELIABLE : RakNet::UNRELIABLE_SEQUENCED); - return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBytesUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, false); + return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, false); } bool broadcastRPC(int id, Span data, int channel, const IPlayer* exceptPeer, bool dispatchEvents) override @@ -275,7 +275,7 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi static void OnPlayerConnect(RakNet::RPCParameters* rpcParams, void* extra); static void OnNPCConnect(RakNet::RPCParameters* rpcParams, void* extra); - IPlayer* OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOfficialClient = false); + IPlayer* OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOmp, bool isUsingOfficialClient = false); template static void RPCHook(RakNet::RPCParameters* rpcParams, void* extra); void onTick(Microseconds elapsed, TimePoint now) override; diff --git a/Server/Components/Pawn/Scripting/Player/Natives.cpp b/Server/Components/Pawn/Scripting/Player/Natives.cpp index f15b3600e..437c678ea 100644 --- a/Server/Components/Pawn/Scripting/Player/Natives.cpp +++ b/Server/Components/Pawn/Scripting/Player/Natives.cpp @@ -1158,7 +1158,7 @@ SCRIPT_API(ArePlayerWeaponsAllowed, bool(IPlayer& player)) return player.areWeaponsAllowed(); } -SCRIPT_API(IsPlayerUsingOfficialClient, int(IPlayer& player)) +SCRIPT_API(IsPlayerUsingOfficialClient, bool(IPlayer& player)) { return player.isUsingOfficialClient(); } @@ -1195,3 +1195,8 @@ SCRIPT_API(IsPlayerCuffed, bool(IPlayer& player)) } return false; } + +SCRIPT_API(IsPlayerUsingOmp, bool(IPlayer& player)) +{ + return player.isUsingOmp(); +} diff --git a/Server/Source/core_impl.hpp b/Server/Source/core_impl.hpp index e8229c829..2dcfc4f46 100644 --- a/Server/Source/core_impl.hpp +++ b/Server/Source/core_impl.hpp @@ -123,6 +123,7 @@ static const std::map Defaults { { "network.use_lan_mode", false }, { "network.allow_037_clients", true }, { "network.grace_period", 5000 }, + { "network.use_omp_encryption", false }, // rcon { "rcon.allow_teleport", false }, { "rcon.enable", false }, diff --git a/Server/Source/player_impl.hpp b/Server/Source/player_impl.hpp index b68717804..27ee50634 100644 --- a/Server/Source/player_impl.hpp +++ b/Server/Source/player_impl.hpp @@ -117,6 +117,7 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy bool allowWeapons_; bool allowTeleport_; bool isUsingOfficialClient_; + bool isUsingOmp_; PrimarySyncUpdateType primarySyncUpdateType_; int secondarySyncUpdateType_; @@ -259,6 +260,7 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy , allowWeapons_(true) , allowTeleport_(false) , isUsingOfficialClient_(params.isUsingOfficialClient) + , isUsingOmp_(params.isUsingOmp) , primarySyncUpdateType_(PrimarySyncUpdateType::None) , secondarySyncUpdateType_(0) , lastScoresAndPings_(Time::now()) @@ -321,6 +323,11 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy return isUsingOfficialClient_; } + bool isUsingOmp() const override + { + return isUsingOmp_; + } + void setState(PlayerState state, bool dispatchEvents = true); PlayerState getState() const override diff --git a/Shared/NetCode/core.hpp b/Shared/NetCode/core.hpp index 1849777d7..36de48f10 100644 --- a/Shared/NetCode/core.hpp +++ b/Shared/NetCode/core.hpp @@ -39,6 +39,7 @@ namespace RPC HybridString<16> Key; HybridString<16> VersionString; bool IsUsingOfficialClient; + uint32_t OmpVersion; bool read(NetworkBitStream& bs) { @@ -51,6 +52,7 @@ namespace RPC uint32_t dummyVar = 0; IsUsingOfficialClient = bs.readUINT32(dummyVar); + OmpVersion = dummyVar; return readFailed; } diff --git a/lib/RakNet b/lib/RakNet index 7bfb64ad9..03d7129e2 160000 --- a/lib/RakNet +++ b/lib/RakNet @@ -1 +1 @@ -Subproject commit 7bfb64ad99584ba2efcff68a2e096f6edc276291 +Subproject commit 03d7129e2c5e3b7efa851cf889dacf0a0d167aa1