Skip to content

Commit 6191a2d

Browse files
authored
omp user detection & server to client encryption for omp users (openmultiplayer#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
1 parent 8e9a310 commit 6191a2d

File tree

8 files changed

+34
-12
lines changed

8 files changed

+34
-12
lines changed

SDK

Server/Components/LegacyNetwork/legacy_network_impl.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ enum LegacyClientVersion
313313
LegacyClientVersion_03DL = 4062
314314
};
315315

316-
IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOfficialClient)
316+
IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOmp, bool isUsingOfficialClient)
317317
{
318318
const RakNet::PlayerID rid = rpcParams->sender;
319319

@@ -344,6 +344,7 @@ IPlayer* RakNetLegacyNetwork::OnPeerConnect(RakNet::RPCParameters* rpcParams, bo
344344
params.bot = isNPC;
345345
params.serial = serial;
346346
params.isUsingOfficialClient = isUsingOfficialClient;
347+
params.isUsingOmp = isUsingOmp;
347348
newConnectionResult = core->getPlayers().requestPlayer(netData, params);
348349
}
349350
else
@@ -425,7 +426,13 @@ void RakNetLegacyNetwork::OnPlayerConnect(RakNet::RPCParameters* rpcParams, void
425426
return;
426427
}
427428

428-
IPlayer* newPeer = network->OnPeerConnect(rpcParams, false, serial, playerConnectRPC.VersionNumber, playerConnectRPC.VersionString, playerConnectRPC.ChallengeResponse, playerConnectRPC.Name, playerConnectRPC.IsUsingOfficialClient);
429+
bool isUsingOmp = SAMPRakNet::IsPlayerUsingOmp(rpcParams->sender);
430+
if (isUsingOmp)
431+
{
432+
SAMPRakNet::SetPlayerOmpVersion(rpcParams->sender, playerConnectRPC.OmpVersion);
433+
}
434+
435+
IPlayer* newPeer = network->OnPeerConnect(rpcParams, false, serial, playerConnectRPC.VersionNumber, playerConnectRPC.VersionString, playerConnectRPC.ChallengeResponse, playerConnectRPC.Name, isUsingOmp, playerConnectRPC.IsUsingOfficialClient);
429436
if (!newPeer)
430437
{
431438
network->rakNetServer.Kick(rpcParams->sender);
@@ -474,7 +481,7 @@ void RakNetLegacyNetwork::OnNPCConnect(RakNet::RPCParameters* rpcParams, void* e
474481
NetCode::RPC::NPCConnect NPCConnectRPC;
475482
if (NPCConnectRPC.read(bs))
476483
{
477-
IPlayer* newPeer = network->OnPeerConnect(rpcParams, true, "", NPCConnectRPC.VersionNumber, "npc", NPCConnectRPC.ChallengeResponse, NPCConnectRPC.Name);
484+
IPlayer* newPeer = network->OnPeerConnect(rpcParams, true, "", NPCConnectRPC.VersionNumber, "npc", NPCConnectRPC.ChallengeResponse, NPCConnectRPC.Name, false);
478485
if (newPeer)
479486
{
480487
if (!network->inEventDispatcher.stopAtFalse(

Server/Components/LegacyNetwork/legacy_network_impl.hpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
3737
ICore* core = nullptr;
3838
Query query;
3939
RakNet::RakServerInterface& rakNetServer;
40-
std::array<IPlayer*, PLAYER_POOL_SIZE> playerFromRakIndex;
41-
std::array<RakNet::RakPeer::RemoteSystemStruct*, PLAYER_POOL_SIZE> playerRemoteSystem;
40+
StaticArray<IPlayer*, PLAYER_POOL_SIZE> playerFromRakIndex;
41+
StaticArray<RakNet::RakPeer::RemoteSystemStruct*, PLAYER_POOL_SIZE> playerRemoteSystem;
4242
Milliseconds cookieSeedTime;
4343
TimePoint lastCookieSeed;
4444

@@ -130,11 +130,11 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
130130
const PeerNetworkData::NetworkID& nid = netData.networkID;
131131
const RakNet::PlayerID rid { unsigned(nid.address.v4), nid.port };
132132

133-
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfUnreadBits(), RakNet::HIGH_PRIORITY, reliability, channel, rid, true);
133+
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, true);
134134
}
135135
}
136136

137-
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfUnreadBits(), RakNet::HIGH_PRIORITY, reliability, channel, RakNet::UNASSIGNED_PLAYER_ID, true);
137+
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, RakNet::UNASSIGNED_PLAYER_ID, true);
138138
}
139139

140140
bool sendPacket(IPlayer& peer, Span<uint8_t> data, int channel, bool dispatchEvents) override
@@ -177,7 +177,7 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
177177
const PeerNetworkData::NetworkID& nid = netData.networkID;
178178
const RakNet::PlayerID rid { unsigned(nid.address.v4), nid.port };
179179
const RakNet::PacketReliability reliability = (channel == OrderingChannel_Reliable) ? RakNet::RELIABLE : ((channel == OrderingChannel_Unordered) ? RakNet::UNRELIABLE : RakNet::UNRELIABLE_SEQUENCED);
180-
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBytesUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, false);
180+
return rakNetServer.Send((const char*)bs.GetData(), bs.GetNumberOfBitsUsed(), RakNet::HIGH_PRIORITY, reliability, channel, rid, false);
181181
}
182182

183183
bool broadcastRPC(int id, Span<uint8_t> data, int channel, const IPlayer* exceptPeer, bool dispatchEvents) override
@@ -275,7 +275,7 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
275275
static void OnPlayerConnect(RakNet::RPCParameters* rpcParams, void* extra);
276276
static void OnNPCConnect(RakNet::RPCParameters* rpcParams, void* extra);
277277

278-
IPlayer* OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOfficialClient = false);
278+
IPlayer* OnPeerConnect(RakNet::RPCParameters* rpcParams, bool isNPC, StringView serial, uint32_t version, StringView versionName, uint32_t challenge, StringView name, bool isUsingOmp, bool isUsingOfficialClient = false);
279279
template <size_t ID>
280280
static void RPCHook(RakNet::RPCParameters* rpcParams, void* extra);
281281
void onTick(Microseconds elapsed, TimePoint now) override;

Server/Components/Pawn/Scripting/Player/Natives.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,7 @@ SCRIPT_API(ArePlayerWeaponsAllowed, bool(IPlayer& player))
11581158
return player.areWeaponsAllowed();
11591159
}
11601160

1161-
SCRIPT_API(IsPlayerUsingOfficialClient, int(IPlayer& player))
1161+
SCRIPT_API(IsPlayerUsingOfficialClient, bool(IPlayer& player))
11621162
{
11631163
return player.isUsingOfficialClient();
11641164
}
@@ -1195,3 +1195,8 @@ SCRIPT_API(IsPlayerCuffed, bool(IPlayer& player))
11951195
}
11961196
return false;
11971197
}
1198+
1199+
SCRIPT_API(IsPlayerUsingOmp, bool(IPlayer& player))
1200+
{
1201+
return player.isUsingOmp();
1202+
}

Server/Source/core_impl.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ static const std::map<String, ConfigStorage> Defaults {
123123
{ "network.use_lan_mode", false },
124124
{ "network.allow_037_clients", true },
125125
{ "network.grace_period", 5000 },
126+
{ "network.use_omp_encryption", false },
126127
// rcon
127128
{ "rcon.allow_teleport", false },
128129
{ "rcon.enable", false },

Server/Source/player_impl.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy
117117
bool allowWeapons_;
118118
bool allowTeleport_;
119119
bool isUsingOfficialClient_;
120+
bool isUsingOmp_;
120121

121122
PrimarySyncUpdateType primarySyncUpdateType_;
122123
int secondarySyncUpdateType_;
@@ -259,6 +260,7 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy
259260
, allowWeapons_(true)
260261
, allowTeleport_(false)
261262
, isUsingOfficialClient_(params.isUsingOfficialClient)
263+
, isUsingOmp_(params.isUsingOmp)
262264
, primarySyncUpdateType_(PrimarySyncUpdateType::None)
263265
, secondarySyncUpdateType_(0)
264266
, lastScoresAndPings_(Time::now())
@@ -321,6 +323,11 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy
321323
return isUsingOfficialClient_;
322324
}
323325

326+
bool isUsingOmp() const override
327+
{
328+
return isUsingOmp_;
329+
}
330+
324331
void setState(PlayerState state, bool dispatchEvents = true);
325332

326333
PlayerState getState() const override

Shared/NetCode/core.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ namespace RPC
3939
HybridString<16> Key;
4040
HybridString<16> VersionString;
4141
bool IsUsingOfficialClient;
42+
uint32_t OmpVersion;
4243

4344
bool read(NetworkBitStream& bs)
4445
{
@@ -51,6 +52,7 @@ namespace RPC
5152

5253
uint32_t dummyVar = 0;
5354
IsUsingOfficialClient = bs.readUINT32(dummyVar);
55+
OmpVersion = dummyVar;
5456

5557
return readFailed;
5658
}

0 commit comments

Comments
 (0)