Skip to content

Commit 78b42a0

Browse files
authored
Merge pull request #26 from x64-dev/main
main -> 60hz
2 parents 2eda1d4 + 9f44aab commit 78b42a0

6 files changed

Lines changed: 169 additions & 125 deletions

File tree

GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/PortMapper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class PortMapper
2929
public:
3030
~PortMapper()
3131
{
32+
// cleanup
33+
plum_cleanup();
34+
3235
CleanupPorts();
3336
}
3437

@@ -117,6 +120,7 @@ class PortMapper
117120
std::thread* m_backgroundThread_NATPMP = nullptr;
118121
std::thread* m_backgroundThread_PCP = nullptr;
119122
bool m_bNATCheckStarted = false;
123+
bool m_bPCPNeedsCleanup = false;
120124
std::atomic<bool> m_bPortMapper_AnyMappingSuccess = false;
121125
std::atomic<bool> m_bPortMapper_NATPMP_Complete = false;
122126
std::atomic<bool> m_bPortMapper_UPNP_Complete = false;

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,29 @@ void HTTPRequest::Threaded_SetComplete(CURLcode result)
124124
// finalize the size, so we can use .size etc
125125
m_vecBuffer.resize(m_currentBufSize_Used);
126126

127+
std::string strURIRedacted = m_strURI;
128+
129+
size_t tokenpos = strURIRedacted.find("token:");
130+
if (tokenpos != -1)
131+
{
132+
std::string strReplace = "<redacted>";
133+
const size_t tokenLen = 32;
134+
strURIRedacted = strURIRedacted.replace(tokenpos + 6, tokenLen, strReplace);
135+
}
136+
127137
std::string strResponse = std::string(reinterpret_cast<const char*>(m_vecBuffer.data()), m_currentBufSize_Used);
128-
NetworkLog("[%p|%s] Transfer is complete: %d bytes total! Curl result is %d", this, m_strURI.c_str(), m_currentBufSize_Used, result);
129-
NetworkLog("[%p|%s] Response was %d - %s!", this, m_strURI.c_str(), m_responseCode, strResponse.c_str());
138+
NetworkLog("[%p|%s] Transfer is complete: %d bytes total! Curl result is %d", this, strURIRedacted.c_str(), m_currentBufSize_Used, result);
139+
140+
// if we got an error, set the response code to 0
141+
142+
std::transform(strResponse.begin(), strResponse.end(), strResponse.begin(),
143+
[](unsigned char c) { return std::tolower(c); });
144+
if (strResponse.find("token") != std::string::npos)
145+
{
146+
strResponse = "<redacted>";
147+
}
148+
149+
NetworkLog("[%p|%s] Response was %d - %s!", this, strURIRedacted.c_str(), m_responseCode, strResponse.c_str());
130150

131151

132152
// debug write to file

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NGMP_Helpers.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "GameNetwork/GeneralsOnline/NGMP_include.h"
22
#include <chrono>
3-
#include "libsodium/sodium/crypto_aead_aes256gcm.h"
43
#include <mutex>
4+
#include "libsodium/sodium/crypto_aead_xchacha20poly1305.h"
55

66
std::string m_strNetworkLogFileName;
77
std::mutex m_logMutex;
@@ -148,16 +148,17 @@ std::string PrepareChallenge()
148148

149149
#if defined(_DEBUG)
150150
const unsigned char key[32] = { 1, 4, 2, 6, 1, 9, 3, 5, 6, 2, 1, 0, 0, 7, 0, 1, 7, 9, 4, 4, 6, 1, 3, 9, 3, 1, 2, 2, 3, 4, 1, 6 };
151-
const unsigned char iv[12] = { 0, 5, 2, 3, 4, 1, 9, 0, 6, 2, 4, 3 };
151+
const unsigned char iv[24] = { 0, 5, 2, 3, 4, 1, 9, 0, 6, 2, 4, 3, 0, 5, 2, 3, 4, 1, 9, 0, 6, 2, 4, 3 };
152152
#else
153153
const unsigned char key[32] = { {REPLACE_CHALLENGE_KEY} };
154-
const unsigned char iv[12] = { {REPLACE_CHALLENGE_IV} };
154+
const unsigned char iv[24] = { {REPLACE_CHALLENGE_IV} };
155155
#endif
156156

157157
// encrypt
158-
std::vector<unsigned char> ciphertext((strlen(szChallenge) * sizeof(char)) + crypto_aead_aes256gcm_ABYTES);
159-
unsigned long long ciphertext_len;
160-
crypto_aead_aes256gcm_encrypt(&ciphertext.data()[0], &ciphertext_len,
158+
std::vector<unsigned char> ciphertext((strlen(szChallenge) * sizeof(char)) + crypto_aead_xchacha20poly1305_ietf_ABYTES);
159+
unsigned long long ciphertext_len = 0;
160+
161+
crypto_aead_xchacha20poly1305_ietf_encrypt(&ciphertext.data()[0], &ciphertext_len,
161162
(unsigned char*)szChallenge, strlen(szChallenge) * sizeof(char),
162163
nullptr, 0,
163164
NULL, &iv[0], &key[0]);
@@ -178,7 +179,7 @@ std::string DecryptServiceToken(std::string strServiceToken)
178179

179180
std::vector<unsigned char> vecDecryptedBytes;
180181
unsigned long long decrypted_len = 0;
181-
if (crypto_aead_aes256gcm_decrypt(&vecDecryptedBytes.data()[0], &decrypted_len,
182+
if (crypto_aead_xchacha20poly1305_ietf_decrypt(&vecDecryptedBytes.data()[0], &decrypted_len,
182183
NULL,
183184
&vecDecodedToken.data()[0], vecDecodedToken.size(),
184185
nullptr,
Lines changed: 107 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,108 @@
1-
#include "GameNetwork/GeneralsOnline/NetworkBitstream.h"
2-
3-
#define SODIUM_STATIC 1
4-
#include "GameNetwork/GeneralsOnline/vendor/libsodium/sodium.h"
5-
#pragma comment(lib, "libsodium/libsodium.lib")
6-
7-
CBitStream::CBitStream(EPacketID packetID)
8-
{
9-
m_memBuffer = MemoryBuffer(BITSTREAM_DEFAULT_SIZE);
10-
11-
m_Offset = 0;
12-
m_packetID = packetID;
13-
14-
Write(packetID);
15-
}
16-
17-
#define ENABLE_ENCRYPTION
18-
void CBitStream::Decrypt(std::vector<BYTE>& vecKey, std::vector<BYTE>& vecIV)
19-
{
20-
#if defined(ENABLE_ENCRYPTION)
21-
std::vector<unsigned char> vecDecryptedBytes(m_memBuffer.GetAllocatedSize());
22-
unsigned long long decrypted_len = 0;
23-
if (crypto_aead_aes256gcm_decrypt(&vecDecryptedBytes.data()[0], &decrypted_len,
24-
NULL,
25-
&m_memBuffer.GetData()[0], m_memBuffer.GetAllocatedSize(),
26-
nullptr,
27-
0,
28-
&vecIV.data()[0], &vecKey.data()[0]) != 0)
29-
{
30-
/* message forged! */
31-
NetworkLog("[NGMP]: Message forged! Decrypt failed");
32-
}
33-
else
34-
{
35-
// resize buffer
36-
vecDecryptedBytes.resize(decrypted_len);
37-
38-
// reset the read offset
39-
m_Offset = 0;
40-
41-
m_memBuffer.ReAllocate(decrypted_len);
42-
memcpy(&m_memBuffer.GetData()[0], &vecDecryptedBytes[0], decrypted_len);
43-
}
44-
45-
#endif
46-
}
47-
48-
49-
50-
void CBitStream::Encrypt(std::vector<BYTE>& vecKey, std::vector<BYTE>& vecIV)
51-
{
52-
#if defined(ENABLE_ENCRYPTION)
53-
std::vector<unsigned char> ciphertext(GetNumBytesUsed() + crypto_aead_aes256gcm_ABYTES);
54-
55-
unsigned long long ciphertext_len;
56-
57-
//NetworkLog("Encrypting message %s", MESSAGE);
58-
59-
60-
61-
crypto_aead_aes256gcm_encrypt(&ciphertext.data()[0], &ciphertext_len,
62-
GetRawBuffer(), GetNumBytesUsed(),
63-
nullptr, 0,
64-
NULL, &vecIV.data()[0], &vecKey.data()[0]);
65-
66-
// resize buffer and copy back
67-
ciphertext.resize(ciphertext_len);
68-
69-
m_memBuffer.ReAllocate(ciphertext_len);
70-
memcpy(&m_memBuffer.GetData()[0], &ciphertext[0], ciphertext.size());
71-
m_Offset = ciphertext.size();
72-
#endif
73-
}
74-
75-
CBitStream::CBitStream(int64_t len, void* pBuffer, size_t sz)
76-
{
77-
m_memBuffer = MemoryBuffer(len);
78-
79-
memcpy(m_memBuffer.GetData() + m_Offset, pBuffer, sz);
80-
m_Offset += sz;
81-
}
82-
83-
CBitStream::CBitStream(CBitStream* bsIn)
84-
{
85-
m_memBuffer = MemoryBuffer(bsIn->GetNumBytesUsed());
86-
87-
memcpy(m_memBuffer.GetData() + m_Offset, bsIn->GetRawBuffer(), bsIn->GetNumBytesUsed());
88-
89-
m_packetID = bsIn->GetPacketID();
90-
m_Offset = bsIn->GetNumBytesUsed();
91-
}
92-
93-
CBitStream::CBitStream(int64_t len)
94-
{
95-
m_memBuffer = MemoryBuffer(len);
96-
}
97-
98-
CBitStream::CBitStream(std::vector<BYTE> vecBytes)
99-
{
100-
m_memBuffer = MemoryBuffer(vecBytes.size());
101-
memcpy(m_memBuffer.GetData(), (void*)vecBytes.data(), vecBytes.size());
102-
m_Offset = vecBytes.size();
103-
}
104-
105-
CBitStream::~CBitStream()
106-
{
107-
1+
#include "GameNetwork/GeneralsOnline/NetworkBitstream.h"
2+
3+
#define SODIUM_STATIC 1
4+
#include "GameNetwork/GeneralsOnline/vendor/libsodium/sodium.h"
5+
#pragma comment(lib, "libsodium/libsodium.lib")
6+
7+
CBitStream::CBitStream(EPacketID packetID)
8+
{
9+
m_memBuffer = MemoryBuffer(BITSTREAM_DEFAULT_SIZE);
10+
11+
m_Offset = 0;
12+
m_packetID = packetID;
13+
14+
Write(packetID);
15+
}
16+
17+
#define ENABLE_ENCRYPTION
18+
void CBitStream::Decrypt(std::vector<BYTE>& vecKey, std::vector<BYTE>& vecIV)
19+
{
20+
#if defined(ENABLE_ENCRYPTION)
21+
std::vector<unsigned char> vecDecryptedBytes(m_memBuffer.GetAllocatedSize());
22+
unsigned long long decrypted_len = 0;
23+
if (crypto_aead_xchacha20poly1305_ietf_decrypt(&vecDecryptedBytes.data()[0], &decrypted_len,
24+
NULL,
25+
&m_memBuffer.GetData()[0], m_memBuffer.GetAllocatedSize(),
26+
nullptr,
27+
0,
28+
&vecIV.data()[0], &vecKey.data()[0]) != 0)
29+
{
30+
/* message forged! */
31+
NetworkLog("[NGMP]: Message forged! Decrypt failed");
32+
}
33+
else
34+
{
35+
// resize buffer
36+
vecDecryptedBytes.resize(decrypted_len);
37+
38+
// reset the read offset
39+
m_Offset = 0;
40+
41+
m_memBuffer.ReAllocate(decrypted_len);
42+
memcpy(&m_memBuffer.GetData()[0], &vecDecryptedBytes[0], decrypted_len);
43+
}
44+
45+
#endif
46+
}
47+
48+
49+
50+
void CBitStream::Encrypt(std::vector<BYTE>& vecKey, std::vector<BYTE>& vecIV)
51+
{
52+
#if defined(ENABLE_ENCRYPTION)
53+
std::vector<unsigned char> ciphertext(GetNumBytesUsed() + crypto_aead_xchacha20poly1305_ietf_ABYTES);
54+
55+
unsigned long long ciphertext_len;
56+
57+
//NetworkLog("Encrypting message %s", MESSAGE);
58+
59+
60+
61+
crypto_aead_xchacha20poly1305_ietf_encrypt(&ciphertext.data()[0], &ciphertext_len,
62+
GetRawBuffer(), GetNumBytesUsed(),
63+
nullptr, 0,
64+
NULL, &vecIV.data()[0], &vecKey.data()[0]);
65+
66+
// resize buffer and copy back
67+
ciphertext.resize(ciphertext_len);
68+
69+
m_memBuffer.ReAllocate(ciphertext_len);
70+
memcpy(&m_memBuffer.GetData()[0], &ciphertext[0], ciphertext.size());
71+
m_Offset = ciphertext.size();
72+
#endif
73+
}
74+
75+
CBitStream::CBitStream(int64_t len, void* pBuffer, size_t sz)
76+
{
77+
m_memBuffer = MemoryBuffer(len);
78+
79+
memcpy(m_memBuffer.GetData() + m_Offset, pBuffer, sz);
80+
m_Offset += sz;
81+
}
82+
83+
CBitStream::CBitStream(CBitStream* bsIn)
84+
{
85+
m_memBuffer = MemoryBuffer(bsIn->GetNumBytesUsed());
86+
87+
memcpy(m_memBuffer.GetData() + m_Offset, bsIn->GetRawBuffer(), bsIn->GetNumBytesUsed());
88+
89+
m_packetID = bsIn->GetPacketID();
90+
m_Offset = bsIn->GetNumBytesUsed();
91+
}
92+
93+
CBitStream::CBitStream(int64_t len)
94+
{
95+
m_memBuffer = MemoryBuffer(len);
96+
}
97+
98+
CBitStream::CBitStream(std::vector<BYTE> vecBytes)
99+
{
100+
m_memBuffer = MemoryBuffer(vecBytes.size());
101+
memcpy(m_memBuffer.GetData(), (void*)vecBytes.data(), vecBytes.size());
102+
m_Offset = vecBytes.size();
103+
}
104+
105+
CBitStream::~CBitStream()
106+
{
107+
108108
}

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ void NetworkMesh::ProcessGameStart(Lobby_StartGamePacket& startGamePacket)
6464
// increase our timeout, Generals has its own timeout code and allows reconnecting, so just set an extremely long value and let the game handle it.
6565
for (auto& connectionInfo : m_mapConnections)
6666
{
67+
// finalize connection outcomes, it's all or nothing now
68+
UpdateConnectivity(&connectionInfo.second);
69+
6770
if (connectionInfo.second.m_peer != nullptr)
6871
{
6972
enet_peer_timeout(connectionInfo.second.m_peer, 10, 30000, 60000);
@@ -341,6 +344,7 @@ void NetworkMesh::ConnectToUserViaRelay(Int64 user_id)
341344
// assume connected, since the connection was already formed prior
342345
NetworkLog("[STATE CHANGE 1] Relay connection to user %ld changes from state %d to EConnectionState::CONNECTED_RELAY", user_id, m_mapConnections[user_id].m_State);
343346
m_mapConnections[user_id].m_State = EConnectionState::CONNECTED_RELAY;
347+
UpdateConnectivity(&m_mapConnections[user_id]);
344348
enet_peer_timeout(m_mapConnections[user_id].m_pRelayPeer, 10, 30000, 60000);
345349

346350
// callback

0 commit comments

Comments
 (0)