Skip to content

Commit

Permalink
Discord-RPC: IO Thread Disablement and minor security fixes (#3244)
Browse files Browse the repository at this point in the history
  • Loading branch information
znvjder authored Nov 23, 2023
1 parent c2f72f9 commit b2d3fac
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 45 deletions.
33 changes: 10 additions & 23 deletions Client/core/CDiscordRichPresence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ CDiscordRichPresence::~CDiscordRichPresence()

void CDiscordRichPresence::InitializeDiscord()
{
std::lock_guard<std::mutex> lock(m_threadSafetyMutex);
DiscordEventHandlers handlers;
memset(&handlers, 0, sizeof(handlers));

Expand All @@ -51,9 +52,6 @@ void CDiscordRichPresence::InitializeDiscord()

void CDiscordRichPresence::ShutdownDiscord()
{
if (!m_bDiscordRPCEnabled)
return;

Discord_ClearPresence();
Discord_Shutdown();

Expand All @@ -62,9 +60,6 @@ void CDiscordRichPresence::ShutdownDiscord()

void CDiscordRichPresence::RestartDiscord()
{
if (!m_bDiscordRPCEnabled)
return;

ShutdownDiscord();
InitializeDiscord();
}
Expand Down Expand Up @@ -99,12 +94,19 @@ void CDiscordRichPresence::SetDefaultData()

void CDiscordRichPresence::UpdatePresence()
{
if (!m_bDiscordRPCEnabled)
return;

// run callbacks
Discord_RunCallbacks();

if (!m_bConnected)
return;

if (!m_bUpdateRichPresence)
return;


std::lock_guard<std::mutex> lock(m_threadSafetyMutex);
DiscordRichPresence discordPresence;
memset(&discordPresence, 0, sizeof(discordPresence));

Expand All @@ -121,7 +123,7 @@ void CDiscordRichPresence::UpdatePresence()
discordPresence.endTimestamp = m_uiDiscordAppEnd;
discordPresence.instance = 0;

DiscordButton buttons[2];
DiscordButton buttons[2]{0};
if (m_aButtons)
{
buttons[0].label = std::get<0>(*m_aButtons).first.c_str();
Expand Down Expand Up @@ -264,16 +266,6 @@ bool CDiscordRichPresence::SetDiscordRPCEnabled(bool bEnabled)
return true;
}

bool CDiscordRichPresence::IsDiscordRPCEnabled() const
{
return m_bDiscordRPCEnabled;
}

bool CDiscordRichPresence::IsDiscordCustomDetailsDisallowed() const
{
return m_bDisallowCustomDetails;
}

void CDiscordRichPresence::SetPresencePartySize(int iSize, int iMax, bool bCustom)
{
if (bCustom)
Expand Down Expand Up @@ -313,8 +305,3 @@ void CDiscordRichPresence::HandleDiscordError(int iErrorCode, const char* szMess
{
WriteDebugEvent(SString("[DISCORD] Error: %s (error #%d)", szMessage, iErrorCode));
}

bool CDiscordRichPresence::IsDiscordClientConnected() const
{
return m_bConnected;
}
24 changes: 13 additions & 11 deletions Client/core/CDiscordRichPresence.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,36 @@ class CDiscordRichPresence : public CDiscordInterface
void ShutdownDiscord();
void RestartDiscord();
void SetDefaultData();

void UpdatePresence();
#ifdef DISCORD_DISABLE_IO_THREAD
void UpdatePresenceConnection();
#endif

void SetPresenceStartTimestamp(const unsigned long ulStart);
void SetPresenceEndTimestamp(const unsigned long ulEnd);
void SetAsset(const char* szAsset, const char* szAssetText, bool bIsLarge);
void SetAssetLargeData(const char* szAsset, const char* szAssetText);
void SetAssetSmallData(const char* szAsset, const char* szAssetText);
void SetDiscordClientConnected(bool bConnected) { m_bConnected = bConnected; };
void SetPresencePartySize(int iSize, int iMax, bool bCustom);

bool ResetDiscordData();
bool SetPresenceState(const char* szState, bool bCustom);
bool SetPresenceDetails(const char* szDetails, bool bCustom);
bool SetPresenceButtons(unsigned short int iIndex, const char* szName, const char* szUrl);
void SetPresencePartySize(int iSize, int iMax, bool bCustom);
bool SetDiscordRPCEnabled(bool bEnabled);
bool IsDiscordCustomDetailsDisallowed() const;
bool IsDiscordRPCEnabled() const;
bool SetApplicationID(const char* resourceName, const char* szAppID);
void SetDiscordClientConnected(bool bConnected) { m_bConnected = bConnected; };
bool IsDiscordClientConnected() const;
bool IsDiscordCustomDetailsDisallowed() const { return m_bDisallowCustomDetails; };
bool IsDiscordRPCEnabled() const { return m_bDiscordRPCEnabled; };
bool IsDiscordClientConnected() const { return m_bConnected; };

std::string GetDiscordResourceName() const { return m_strDiscordCustomResourceName; };

// handlers
// static handlers
static void HandleDiscordReady(const struct DiscordUser* pDiscordUser);
static void HandleDiscordDisconnected(int iErrorCode, const char* szMessage);
static void HandleDiscordError(int iErrorCode, const char* szMessage);

#ifdef DISCORD_DISABLE_IO_THREAD
void UpdatePresenceConnection();
#endif

private:
std::string m_strDiscordAppId;
std::string m_strDiscordAppAsset;
Expand All @@ -69,6 +69,8 @@ class CDiscordRichPresence : public CDiscordInterface

std::optional<std::tuple<std::pair<std::string, std::string>, std::pair<std::string, std::string>>> m_aButtons;

std::mutex m_threadSafetyMutex;

unsigned long m_uiDiscordAppStart;
unsigned long m_uiDiscordAppEnd;

Expand Down
22 changes: 11 additions & 11 deletions Client/sdk/core/CDiscordInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
*****************************************************************************/

#pragma once
//#define DISCORD_DISABLE_IO_THREAD
#define DISCORD_DISABLE_IO_THREAD
// Uncomment to use manuall refresh of discord connection
// (important) Don't forget to write same in discord-rpc.h

Expand All @@ -18,25 +18,25 @@ class CDiscordInterface
public:
virtual ~CDiscordInterface() = default;
virtual void UpdatePresence() = 0;
virtual bool SetPresenceDetails(const char* szDetails, bool bCustom) = 0;
virtual bool SetApplicationID(const char* szResourceName, const char* szAppID) = 0;
virtual bool ResetDiscordData() = 0;
virtual bool SetPresenceState(const char* szState, bool bCustom) = 0;
#ifdef DISCORD_DISABLE_IO_THREAD
virtual void UpdatePresenceConnection() = 0;
#endif
virtual void SetAssetLargeData(const char* szAsset, const char* szAssetText) = 0;
virtual void SetAssetSmallData(const char* szAsset, const char* szAssetText) = 0;
virtual void SetPresenceStartTimestamp(const unsigned long ulStart) = 0;
virtual void SetPresenceEndTimestamp(const unsigned long ulEnd) = 0;
virtual bool SetPresenceButtons(unsigned short int iIndex, const char* szName, const char* szUrl) = 0;
virtual void SetPresencePartySize(int iSize, int iMax, bool bCustom) = 0;
virtual std::string GetDiscordResourceName() const = 0;
virtual void SetDiscordClientConnected(bool bConnected) = 0;

virtual bool SetPresenceDetails(const char* szDetails, bool bCustom) = 0;
virtual bool SetApplicationID(const char* szResourceName, const char* szAppID) = 0;
virtual bool ResetDiscordData() = 0;
virtual bool SetPresenceState(const char* szState, bool bCustom) = 0;
virtual bool SetPresenceButtons(unsigned short int iIndex, const char* szName, const char* szUrl) = 0;
virtual bool SetDiscordRPCEnabled(bool bEnabled) = 0;
virtual void SetDiscordClientConnected(bool bConnected) = 0;
virtual bool IsDiscordRPCEnabled() const = 0;
virtual bool IsDiscordCustomDetailsDisallowed() const = 0;
virtual bool IsDiscordClientConnected() const = 0;

#ifdef DISCORD_DISABLE_IO_THREAD
virtual void UpdatePresenceConnection() = 0;
#endif
virtual std::string GetDiscordResourceName() const = 0;
};
4 changes: 4 additions & 0 deletions vendor/discord-rpc/premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ project "discord-rpc"
"discord/thirdparty/rapidjson/include"
}

defines {
"DISCORD_DISABLE_IO_THREAD"
}

files {
"premake5.lua",
"discord/src/discord_rpc.cpp",
Expand Down

0 comments on commit b2d3fac

Please sign in to comment.