aboutsummaryrefslogtreecommitdiff
path: root/src/TcpTasks
diff options
context:
space:
mode:
authorDarkelarious <github@333networks.com>2025-03-08 15:44:19 +0100
committerDarkelarious <github@333networks.com>2025-03-08 15:44:19 +0100
commit10bd168b65766026ae47eb7619f9fe74ced75e16 (patch)
treecae5f525b3705e85f707ae31763a9469eb0d80c7 /src/TcpTasks
parentc4bb33bf7242607d173cd61bf2cb7f6e560c8dc7 (diff)
downloadMasterserver-Qt5-10bd168b65766026ae47eb7619f9fe74ced75e16.tar.gz
Masterserver-Qt5-10bd168b65766026ae47eb7619f9fe74ced75e16.zip
force-update source file
Force-overwrite a source file from previous commits (hf3).
Diffstat (limited to 'src/TcpTasks')
-rw-r--r--src/TcpTasks/ListenClientHandler/onlistenclientread.cpp46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/TcpTasks/ListenClientHandler/onlistenclientread.cpp b/src/TcpTasks/ListenClientHandler/onlistenclientread.cpp
index 83cc822..9b6de24 100644
--- a/src/TcpTasks/ListenClientHandler/onlistenclientread.cpp
+++ b/src/TcpTasks/ListenClientHandler/onlistenclientread.cpp
@@ -37,6 +37,10 @@ void ListenClientHandler::onListenClientRead()
? receiveData.values("gamename").takeLast() // removes duplicate gamename
: receiveData.value("gamename","") );
+ // enctype2 list requested?
+ _requestEnctype2 = ( receiveData.value("enctype","0").compare("2") == 0 );
+ _coreObject->Log.logEvent("debug", QStringLiteral("%1 uses enctype2 = (%2)").arg(_clientLabel, QString::number(_requestEnctype2)));
+
// sanity check
if ( _coreObject->SupportedGames.contains(gamename) )
{
@@ -91,13 +95,49 @@ void ListenClientHandler::onListenClientRead()
return;
}
- // get list from db and send it
+ // get list from db
QByteArray writeBuffer = compileServerlist(
receiveData.value("gamename", ""),
_coreObject->Settings.ListenServerSettings.serverttl_s,
(receiveData.value("list","").compare("cmp", Qt::CaseInsensitive) == 0 ));
- _tcpSocket->write(writeBuffer);
- _coreObject->Log.logEvent("list", QStringLiteral("%1 received the list for %2").arg(_clientLabel, receiveData.value("gamename", "")));
+
+ // encrypt with enctype2 if requested
+ if ( _requestEnctype2 )
+ {
+ // more debug
+ _coreObject->Log.logEvent("debug", QStringLiteral("%1 requests enctype2 (%2)").arg(_clientLabel, QString::number(_requestEnctype2)));
+
+ // combined queries provide two gamenames: one for authentication and one for list request.
+ QString gamename = ( receiveData.values("gamename").size() >= 2
+ ? receiveData.values("gamename").takeLast() // removes duplicate gamename
+ : receiveData.value("gamename","") );
+
+ // datatype conversions
+ int newLen = writeBuffer.length() + 15;
+ unsigned char* encBuf = new unsigned char[ newLen ];
+ unsigned char* secKey = new unsigned char[ 7 ]; // 6 bytes long, no string terminator
+ memcpy(encBuf, writeBuffer.constData(), writeBuffer.length()); // original len, 15 byte uninitialised
+ if ( _coreObject->SupportedGames.contains( gamename ) )
+ {
+ QByteArray baSecKey = _coreObject->SupportedGames.value(gamename).cipher.toLatin1();
+ baSecKey.append('\0');
+ memcpy(secKey, baSecKey, 6); // what if baSecKey < 6? :skull:
+ }
+
+ // encrypt the buffer
+ enctype2_encoder(secKey, encBuf, writeBuffer.length() );
+
+ // convert back to byte array
+ QByteArray writeBuf = QByteArray((const char*)encBuf, newLen);
+
+ _tcpSocket->write(writeBuf);
+ _coreObject->Log.logEvent("list", QStringLiteral("%1 received the enctype2 list for %2").arg(_clientLabel, receiveData.value("gamename", "")));
+ }
+ else
+ {
+ _tcpSocket->write(writeBuffer);
+ _coreObject->Log.logEvent("list", QStringLiteral("%1 received the list for %2").arg(_clientLabel, receiveData.value("gamename", "")));
+ }
// all done
this->disconnect();