Skip to content

Commit

Permalink
tie the global tokens to broadcast token request response
Browse files Browse the repository at this point in the history
oy committed Nov 20, 2018

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent abdde05 commit 8011e3e
Showing 4 changed files with 20 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/engine/shared/network.h
Original file line number Diff line number Diff line change
@@ -184,7 +184,7 @@ class CNetTokenManager

int ProcessMessage(const NETADDR *pAddr, const CNetPacketConstruct *pPacket, bool Notify);

bool CheckToken(const NETADDR *pAddr, TOKEN Token, TOKEN ResponseToken, bool Notify);
bool CheckToken(const NETADDR *pAddr, TOKEN Token, TOKEN ResponseToken, bool Notify, bool *BroadcastResponse);
TOKEN GenerateToken(const NETADDR *pAddr) const;
static TOKEN GenerateToken(const NETADDR *pAddr, int64 Seed);

@@ -218,7 +218,7 @@ class CNetTokenCache
void SendPacketConnless(const NETADDR *pAddr, const void *pData, int DataSize, CSendCBData *pCallbackData = 0);
void PurgeStoredPacket(int TrackID);
void FetchToken(const NETADDR *pAddr);
void AddToken(const NETADDR *pAddr, TOKEN PeerToken);
void AddToken(const NETADDR *pAddr, TOKEN PeerToken, bool AllowBroadcasts);
TOKEN GetToken(const NETADDR *pAddr);
void Update();

4 changes: 2 additions & 2 deletions src/engine/shared/network_client.cpp
Original file line number Diff line number Diff line change
@@ -97,9 +97,9 @@ int CNetClient::Recv(CNetChunk *pChunk, TOKEN *pResponseToken)
if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL)
{
if(m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_TOKEN)
m_TokenCache.AddToken(&Addr, m_RecvUnpacker.m_Data.m_ResponseToken);
m_TokenCache.AddToken(&Addr, m_RecvUnpacker.m_Data.m_ResponseToken, true);
}
else if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS)
else if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS && Accept != -1)
{
pChunk->m_Flags = NETSENDFLAG_CONNLESS;
pChunk->m_ClientID = -1;
8 changes: 3 additions & 5 deletions src/engine/shared/network_server.cpp
Original file line number Diff line number Diff line change
@@ -160,11 +160,11 @@ int CNetServer::Recv(CNetChunk *pChunk, TOKEN *pResponseToken)
continue;

int Accept = m_TokenManager.ProcessMessage(&Addr, &m_RecvUnpacker.m_Data, true);
if(Accept <= 0)
continue;

if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL)
{
if(!Accept)
continue;
if(m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_CONNECT)
{
bool Found = false;
@@ -213,12 +213,10 @@ int CNetServer::Recv(CNetChunk *pChunk, TOKEN *pResponseToken)
}
}
else if(m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_TOKEN)
m_TokenCache.AddToken(&Addr, m_RecvUnpacker.m_Data.m_ResponseToken);
m_TokenCache.AddToken(&Addr, m_RecvUnpacker.m_Data.m_ResponseToken, false);
}
else if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS)
{
if(Accept <= 0)
continue;
pChunk->m_Flags = NETSENDFLAG_CONNLESS;
pChunk->m_ClientID = -1;
pChunk->m_Address = Addr;
25 changes: 13 additions & 12 deletions src/engine/shared/network_token.cpp
Original file line number Diff line number Diff line change
@@ -37,20 +37,21 @@ void CNetTokenManager::Update()

int CNetTokenManager::ProcessMessage(const NETADDR *pAddr, const CNetPacketConstruct *pPacket, bool Notify)
{
bool BroadcastResponse = false;
if(pPacket->m_Token != NET_TOKEN_NONE
&& !CheckToken(pAddr, pPacket->m_Token, pPacket->m_ResponseToken, Notify))
&& !CheckToken(pAddr, pPacket->m_Token, pPacket->m_ResponseToken, Notify, &BroadcastResponse))
return 0; // wrong token, silent ignore

bool Verified = pPacket->m_Token != NET_TOKEN_NONE;
bool TokenMessage = (pPacket->m_Flags & NET_PACKETFLAG_CONTROL)
&& pPacket->m_aChunkData[0] == NET_CTRLMSG_TOKEN;

if(pPacket->m_Flags&NET_PACKETFLAG_CONNLESS)
return (Verified) ? 1 : 0; // connless packets without token are not allowed
return (Verified && !BroadcastResponse) ? 1 : 0; // connless packets without token are not allowed

if(!TokenMessage)
{
if(Verified)
if(Verified && !BroadcastResponse)
return 1; // verified packet
else
// the only allowed not connless packet
@@ -59,7 +60,7 @@ int CNetTokenManager::ProcessMessage(const NETADDR *pAddr, const CNetPacketConst
}

if(Verified && TokenMessage)
return 1; // everything is fine, token exchange complete
return BroadcastResponse ? -1 : 1; // everything is fine, token exchange complete

// client requesting token
CNetBase::SendControlMsgWithToken(m_Socket, (NETADDR *)pAddr,
@@ -112,7 +113,7 @@ TOKEN CNetTokenManager::GenerateToken(const NETADDR *pAddr, int64 Seed)
return Result;
}

bool CNetTokenManager::CheckToken(const NETADDR *pAddr, TOKEN Token, TOKEN ResponseToken, bool Notify)
bool CNetTokenManager::CheckToken(const NETADDR *pAddr, TOKEN Token, TOKEN ResponseToken, bool Notify, bool *BroadcastResponse)
{
TOKEN CurrentToken = GenerateToken(pAddr, m_Seed);
if(CurrentToken == Token)
@@ -127,13 +128,14 @@ bool CNetTokenManager::CheckToken(const NETADDR *pAddr, TOKEN Token, TOKEN Respo
return true;
}
else if(Token == m_GlobalToken)
{
*BroadcastResponse = true;
return true;
}
else if(Token == m_PrevGlobalToken)
{
if(Notify)
CNetBase::SendControlMsgWithToken(m_Socket, (NETADDR *)pAddr,
ResponseToken, 0, NET_CTRLMSG_TOKEN, m_GlobalToken);
// notify the peer about the new token
// no need to notify the peer, just a broadcast token response
*BroadcastResponse = true;
return true;
}

@@ -256,7 +258,7 @@ void CNetTokenCache::FetchToken(const NETADDR *pAddr)
NET_CTRLMSG_TOKEN, m_pTokenManager->GenerateToken(pAddr));
}

void CNetTokenCache::AddToken(const NETADDR *pAddr, TOKEN Token)
void CNetTokenCache::AddToken(const NETADDR *pAddr, TOKEN Token, bool AllowBroadcasts)
{
if(Token == NET_TOKEN_NONE)
return;
@@ -277,12 +279,11 @@ void CNetTokenCache::AddToken(const NETADDR *pAddr, TOKEN Token)
static NETADDR NullAddr = { 0 };
NullAddr.type = 7; // cover broadcasts
NullAddr.port = pAddr->port;
if(net_addr_comp(&pInfo->m_Addr, pAddr) == 0 || net_addr_comp(&pInfo->m_Addr, &NullAddr) == 0)
if(net_addr_comp(&pInfo->m_Addr, pAddr) == 0 || (AllowBroadcasts && net_addr_comp(&pInfo->m_Addr, &NullAddr) == 0))
{
// notify the user that the packet gets delivered
if(pInfo->m_pfnCallback)
pInfo->m_pfnCallback(pInfo->m_TrackID, pInfo->m_pCallbackUser);
// todo: make sure if we got the result of a broadcast or not
CNetBase::SendPacketConnless(m_Socket, &(pInfo->m_Addr), Token,
m_pTokenManager->GenerateToken(pAddr),
pInfo->m_aData, pInfo->m_DataSize);

0 comments on commit 8011e3e

Please sign in to comment.