From f44456ba3708baf60c01c4bbea5d27ddd2852e1a Mon Sep 17 00:00:00 2001 From: MikeIsAStar <99037623+MikeIsAStar@users.noreply.github.com> Date: Sun, 21 Jan 2024 18:10:00 -0500 Subject: [PATCH] Allow for non-Base64 encoded data to be reported to the server --- payload/wwfcGPReport.cpp | 43 ++++++++++++++++++++++++++-------------- payload/wwfcGPReport.hpp | 3 ++- payload/wwfcLogin.cpp | 5 +++-- payload/wwfcMii.cpp | 4 +++- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/payload/wwfcGPReport.cpp b/payload/wwfcGPReport.cpp index cc2c945..8408a65 100644 --- a/payload/wwfcGPReport.cpp +++ b/payload/wwfcGPReport.cpp @@ -8,7 +8,7 @@ namespace wwfc::GPReport #if RMC -void ReportUser(mkw::Net::UserHandler::Packet* packet) +void Report(const char* key, const char* string) { auto connection = DWC::stpMatchCnt->connection; if (connection == nullptr) { @@ -17,30 +17,43 @@ void ReportUser(mkw::Net::UserHandler::Packet* packet) auto iconnection = reinterpret_cast(*connection); - char b64UserPacket[0x400]; - s32 b64Len = DWC::DWC_Base64Encode( - packet, sizeof(mkw::Net::UserHandler::Packet), b64UserPacket, - sizeof(b64UserPacket) + GameSpy::gpiAppendStringToBuffer( + connection, &iconnection->outputBuffer, "\\wwfc_report\\" + ); + GameSpy::gpiAppendStringToBuffer( + connection, &iconnection->outputBuffer, "\\" ); - if (b64Len < 0 || b64Len >= 0x400) { - LOG_ERROR("Could not base64 encode the User packet"); - return; - } - - // Add null terminator - b64UserPacket[b64Len] = '\0'; - GameSpy::gpiAppendStringToBuffer( - connection, &iconnection->outputBuffer, "\\wwfc_report\\\\mkw_user\\" + connection, &iconnection->outputBuffer, key ); GameSpy::gpiAppendStringToBuffer( - connection, &iconnection->outputBuffer, b64UserPacket + connection, &iconnection->outputBuffer, "\\" + ); + GameSpy::gpiAppendStringToBuffer( + connection, &iconnection->outputBuffer, string ); GameSpy::gpiAppendStringToBuffer( connection, &iconnection->outputBuffer, "\\final\\" ); } +void ReportB64Encode(const char* key, const void* data, size_t dataSize) +{ + char b64Data[0x400]; + + s32 b64Size = + DWC::DWC_Base64Encode(data, dataSize, b64Data, sizeof(b64Data)); + if (b64Size == -1 || b64Size == sizeof(b64Data)) { + LOG_ERROR( + "Could not fit the base64-encoded data into the provided buffer!" + ); + return; + } + b64Data[b64Size] = '\0'; + + Report(key, b64Data); +} + #endif } // namespace wwfc::GPReport \ No newline at end of file diff --git a/payload/wwfcGPReport.hpp b/payload/wwfcGPReport.hpp index 90c02d0..1d70b0b 100644 --- a/payload/wwfcGPReport.hpp +++ b/payload/wwfcGPReport.hpp @@ -7,7 +7,8 @@ namespace wwfc::GPReport #if RMC -void ReportUser(mkw::Net::UserHandler::Packet* packet); +void Report(const char* key, const char* string); +void ReportB64Encode(const char* key, const void* data, size_t dataSize); #endif diff --git a/payload/wwfcLogin.cpp b/payload/wwfcLogin.cpp index f529044..a1a9d28 100644 --- a/payload/wwfcLogin.cpp +++ b/payload/wwfcLogin.cpp @@ -302,8 +302,9 @@ static void SendAuthTokenSignature( s32 b64Len = DWC::DWC_Base64Encode( &authSig, sizeof(authSig), b64AuthSig, sizeof(b64AuthSig) ); - if (b64Len < 0 || b64Len >= 0x400) { - LOG_ERROR("Could not base64 encode the signature"); + if (b64Len == -1 || b64Len == sizeof(b64AuthSig)) { + LOG_ERROR("Could not fit the base64-encoded signature into the " + "provided buffer!"); return; } diff --git a/payload/wwfcMii.cpp b/payload/wwfcMii.cpp index e029236..ea6ab42 100644 --- a/payload/wwfcMii.cpp +++ b/payload/wwfcMii.cpp @@ -87,7 +87,9 @@ void ClearUserMiiInfo(mkw::Net::UserHandler::Packet* packet) } // Send Mii data to the server - wwfc::GPReport::ReportUser(packet); + wwfc::GPReport::ReportB64Encode( + "mkw_user", packet, sizeof(mkw::Net::UserHandler::Packet) + ); } #endif