summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2024-12-18 12:43:28 +0300
committerGeorge Hazan <george.hazan@gmail.com>2024-12-18 12:43:33 +0300
commit6899d60bbb0068d0d7a7886fe263d50a73216b6c (patch)
tree61158b637688934e9b71e15f244ba977cdc55c01 /protocols
parent59f927ee88735b97514c3224ce5929a99dabfa8b (diff)
all HTTP friend requests rewritten using Steam API
Diffstat (limited to 'protocols')
-rw-r--r--protocols/Steam/Steam.vcxproj2
-rw-r--r--protocols/Steam/Steam.vcxproj.filters6
-rw-r--r--protocols/Steam/src/api/friend_list.h72
-rw-r--r--protocols/Steam/src/stdafx.h1
-rw-r--r--protocols/Steam/src/steam_contacts.cpp44
-rw-r--r--protocols/Steam/src/steam_menus.cpp12
-rw-r--r--protocols/Steam/src/steam_proto.cpp17
-rw-r--r--protocols/Steam/src/steam_proto.h29
-rw-r--r--protocols/Steam/src/steam_server.cpp21
-rw-r--r--protocols/Steam/src/steam_utils.cpp6
-rw-r--r--protocols/Steam/src/steam_utils.h14
-rw-r--r--protocols/Steam/src/steam_ws.cpp10
12 files changed, 68 insertions, 166 deletions
diff --git a/protocols/Steam/Steam.vcxproj b/protocols/Steam/Steam.vcxproj
index 0bfe363050..f782442e54 100644
--- a/protocols/Steam/Steam.vcxproj
+++ b/protocols/Steam/Steam.vcxproj
@@ -90,7 +90,6 @@
<ClInclude Include="src\api\captcha.h" />
<ClInclude Include="src\api\enums.h" />
<ClInclude Include="src\api\friend.h" />
- <ClInclude Include="src\api\friend_list.h" />
<ClInclude Include="src\api\history.h" />
<ClInclude Include="src\api\pending.h" />
<ClInclude Include="src\api\search.h" />
@@ -112,6 +111,7 @@
<ClInclude Include="src\stdafx.h" />
<ClInclude Include="src\steam_dialogs.h" />
<ClInclude Include="src\steam_proto.h" />
+ <ClInclude Include="src\steam_utils.h" />
<ClInclude Include="src\version.h" />
<None Include="res\gaming.ico" />
<None Include="res\steam.ico" />
diff --git a/protocols/Steam/Steam.vcxproj.filters b/protocols/Steam/Steam.vcxproj.filters
index f9ea53d994..4cb242e53f 100644
--- a/protocols/Steam/Steam.vcxproj.filters
+++ b/protocols/Steam/Steam.vcxproj.filters
@@ -134,9 +134,6 @@
<ClInclude Include="src\api\friend.h">
<Filter>Header Files\api</Filter>
</ClInclude>
- <ClInclude Include="src\api\friend_list.h">
- <Filter>Header Files\api</Filter>
- </ClInclude>
<ClInclude Include="src\api\history.h">
<Filter>Header Files\api</Filter>
</ClInclude>
@@ -188,6 +185,9 @@
<ClInclude Include="src\protobuf-c\steammessages_notifications.steamclient.pb-c.h">
<Filter>Source Files\protobuf</Filter>
</ClInclude>
+ <ClInclude Include="src\steam_utils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res\Resource.rc">
diff --git a/protocols/Steam/src/api/friend_list.h b/protocols/Steam/src/api/friend_list.h
deleted file mode 100644
index 407f33cf38..0000000000
--- a/protocols/Steam/src/api/friend_list.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _STEAM_REQUEST_FRIEND_LIST_H_
-#define _STEAM_REQUEST_FRIEND_LIST_H_
-
-struct AddFriendRequest : public HttpRequest
-{
- AddFriendRequest(const char *token, const char *sessionId, int64_t steamId, const char *who) :
- HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/AddFriendAjax")
- {
- char login[MAX_PATH];
- mir_snprintf(login, "%lld||oauth:%s", steamId, token);
-
- char cookie[MAX_PATH];
- mir_snprintf(cookie, "steamLogin=%s;sessionid=%s;mobileClientVersion=1291812;forceMobile=1;mobileClient=ios", login, sessionId);
-
- AddHeader("Cookie", cookie);
-
- this << CHAR_PARAM("sessionID", sessionId) << CHAR_PARAM("steamid", who);
- }
-};
-
-struct BlockFriendRequest : public HttpRequest
-{
- BlockFriendRequest(const char *token, const char *sessionId, int64_t steamId, const char *who) :
- HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/BlockUserAjax")
- {
- char login[MAX_PATH];
- mir_snprintf(login, "%lld||oauth:%s", steamId, token);
-
- char cookie[MAX_PATH];
- mir_snprintf(cookie, "steamLogin=%s;sessionid=%s;mobileClientVersion=1291812;forceMobile=1;mobileClient=ios", login, sessionId);
-
- AddHeader("Cookie", cookie);
-
- this << CHAR_PARAM("sessionID", sessionId) << CHAR_PARAM("steamid", who) << CHAR_PARAM("action", "ignore");
- }
-};
-
-struct UnblockFriendRequest : public HttpRequest
-{
- UnblockFriendRequest(const char *token, const char *sessionId, int64_t steamId, const char *who) :
- HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/BlockUserAjax")
- {
- char login[MAX_PATH];
- mir_snprintf(login, "%lld||oauth:%s", steamId, token);
-
- char cookie[MAX_PATH];
- mir_snprintf(cookie, "steamLogin=%s;sessionid=%s;mobileClientVersion=1291812;forceMobile=1;mobileClient=ios", login, sessionId);
-
- AddHeader("Cookie", cookie);
-
- this << CHAR_PARAM("sessionID", sessionId) << CHAR_PARAM("steamid", who) << CHAR_PARAM("action", "unignore") << INT_PARAM("block", 0);
- }
-};
-
-struct RemoveFriendRequest : public HttpRequest
-{
- RemoveFriendRequest(const char *token, const char *sessionId, int64_t steamId, const char *who) :
- HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/RemoveFriendAjax")
- {
- char login[MAX_PATH];
- mir_snprintf(login, "%lld||oauth:%s", steamId, token);
-
- char cookie[MAX_PATH];
- mir_snprintf(cookie, "steamLogin=%s;sessionid=%s;mobileClientVersion=1291812;forceMobile=1;mobileClient=ios", login, sessionId);
-
- AddHeader("Cookie", cookie);
-
- this << CHAR_PARAM("sessionID", sessionId) << CHAR_PARAM("steamid", who);
- }
-};
-
-#endif //_STEAM_REQUEST_FRIEND_LIST_H_
diff --git a/protocols/Steam/src/stdafx.h b/protocols/Steam/src/stdafx.h
index ff762f0d39..0ba41ec036 100644
--- a/protocols/Steam/src/stdafx.h
+++ b/protocols/Steam/src/stdafx.h
@@ -78,7 +78,6 @@ extern HANDLE hExtraXStatus;
#include "api/avatar.h"
#include "api/captcha.h"
#include "api/friend.h"
-#include "api/friend_list.h"
#include "api/history.h"
#include "api/pending.h"
#include "api/search.h"
diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp
index 9291629968..fbd824187e 100644
--- a/protocols/Steam/src/steam_contacts.cpp
+++ b/protocols/Steam/src/steam_contacts.cpp
@@ -503,6 +503,7 @@ void CSteamProto::OnGotAvatar(const MHttpResponse &response, void *arg)
}
}
+/*
void CSteamProto::OnFriendAdded(const MHttpResponse &response, void *arg)
{
SendAuthParam *param = (SendAuthParam *)arg;
@@ -564,48 +565,7 @@ void CSteamProto::OnFriendAdded(const MHttpResponse &response, void *arg)
ContactIsFriend(param->hContact);
ProtoBroadcastAck(param->hContact, ACKTYPE_AUTHREQ, ACKRESULT_SUCCESS, param->hAuth, 0);
}
-
-void CSteamProto::OnFriendBlocked(const MHttpResponse &response, void *arg)
-{
- ptrA steamId((char *)arg);
-
- if (response.resultCode != 200 || mir_strcmp(response.body, "true")) {
- debugLogA(__FUNCTION__ ": failed to ignore friend %s", (char *)steamId);
- return;
- }
-
- MCONTACT hContact = GetContact(steamId.get());
- if (hContact)
- ContactIsBlocked(hContact);
-}
-
-void CSteamProto::OnFriendUnblocked(const MHttpResponse &response, void *arg)
-{
- ptrA steamId((char *)arg);
-
- if (response.resultCode != 200 || mir_strcmp(response.body, "true")) {
- debugLogA(__FUNCTION__ ": failed to unignore friend %s", (char *)steamId);
- return;
- }
-
- MCONTACT hContact = GetContact(steamId.get());
- if (hContact)
- ContactIsUnblocked(hContact);
-}
-
-void CSteamProto::OnFriendRemoved(const MHttpResponse &response, void *arg)
-{
- ptrA steamId((char *)arg);
-
- if (response.resultCode != 200 || mir_strcmp(response.body, "true")) {
- debugLogA(__FUNCTION__ ": failed to remove friend %s", (char *)steamId);
- return;
- }
-
- MCONTACT hContact = GetContact(steamId.get());
- if (hContact)
- ContactIsRemoved(hContact);
-}
+*/
void CSteamProto::OnPendingApproved(const JSONNode &root, void *arg)
{
diff --git a/protocols/Steam/src/steam_menus.cpp b/protocols/Steam/src/steam_menus.cpp
index ddd35fb8a8..3795b9066e 100644
--- a/protocols/Steam/src/steam_menus.cpp
+++ b/protocols/Steam/src/steam_menus.cpp
@@ -18,25 +18,19 @@ INT_PTR CSteamProto::AuthRequestCommand(WPARAM hContact, LPARAM)
INT_PTR CSteamProto::AuthRevokeCommand(WPARAM hContact, LPARAM)
{
- ptrA sessionId(getStringA("SessionID"));
- char *who = getStringA(hContact, DBKEY_STEAM_ID);
- SendRequest(new RemoveFriendRequest(m_szAccessToken, sessionId, m_iSteamId, who), &CSteamProto::OnFriendRemoved, who);
+ SendUserRemoveRequest(hContact);
return 0;
}
int CSteamProto::BlockCommand(WPARAM hContact, LPARAM)
{
- ptrA sessionId(getStringA("SessionID"));
- char *who = getStringA(hContact, DBKEY_STEAM_ID);
- SendRequest(new BlockFriendRequest(m_szAccessToken, sessionId, m_iSteamId, who), &CSteamProto::OnFriendBlocked, who);
+ SendUserIgnoreRequest(hContact, true);
return 0;
}
int CSteamProto::UnblockCommand(WPARAM hContact, LPARAM)
{
- ptrA sessionId(getStringA("SessionID"));
- char *who = getStringA(hContact, DBKEY_STEAM_ID);
- SendRequest(new UnblockFriendRequest(m_szAccessToken, sessionId, m_iSteamId, who), &CSteamProto::OnFriendUnblocked, who);
+ SendUserIgnoreRequest(hContact, false);
return 0;
}
diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp
index a6bef00d29..655343095d 100644
--- a/protocols/Steam/src/steam_proto.cpp
+++ b/protocols/Steam/src/steam_proto.cpp
@@ -152,14 +152,7 @@ int CSteamProto::AuthRequest(MCONTACT hContact, const wchar_t*)
{
if (IsOnline() && hContact) {
UINT hAuth = InterlockedIncrement(&hAuthProcess);
-
- SendAuthParam *param = (SendAuthParam*)mir_calloc(sizeof(SendAuthParam));
- param->hContact = hContact;
- param->hAuth = (HANDLE)hAuth;
-
- ptrA sessionId(getStringA("SessionID"));
- ptrA who(getStringA(hContact, DBKEY_STEAM_ID));
- SendRequest(new AddFriendRequest(m_szAccessToken, sessionId, m_iSteamId, who), &CSteamProto::OnFriendAdded, param);
+ SendUserAddRequest(GetId(hContact, DBKEY_STEAM_ID));
return hAuth;
}
@@ -319,11 +312,9 @@ HANDLE CSteamProto::GetAwayMsg(MCONTACT hContact)
bool CSteamProto::OnContactDeleted(MCONTACT hContact, uint32_t)
{
// remove only authorized contacts
- if (!getByte(hContact, "Auth", 0)) {
- ptrA sessionId(getStringA("SessionID"));
- char *who = getStringA(hContact, DBKEY_STEAM_ID);
- SendRequest(new RemoveFriendRequest(m_szAccessToken, sessionId, m_iSteamId, who), &CSteamProto::OnFriendRemoved, (void*)who);
- }
+ if (!getByte(hContact, "Auth"))
+ SendUserRemoveRequest(hContact);
+
return true;
}
diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h
index cbf7d6eaba..c358906253 100644
--- a/protocols/Steam/src/steam_proto.h
+++ b/protocols/Steam/src/steam_proto.h
@@ -143,6 +143,7 @@ class CSteamProto : public PROTO<CSteamProto>
void ProcessServiceResponse(const uint8_t *buf, size_t cbLen, const CMsgProtoBufHeader &hdr);
void WSSend(EMsg msgType, const ProtobufCppMessage &msg);
+ void WSSendRaw(EMsg msgType, const MBinBuffer &buf);
void WSSendHeader(EMsg msgType, const CMsgProtoBufHeader &hdr, const ProtobufCppMessage &msg);
int64_t WSSendService(const char *pszServiceName, const ProtobufCppMessage &msg, bool bAnon = false);
@@ -155,8 +156,6 @@ class CSteamProto : public PROTO<CSteamProto>
void SendLogout();
void SendPersonaStatus(int iStatus);
void SendPollRequest();
- void SendUserInfoRequest(uint64_t id, bool bRetrieveState);
- void SendUserInfoRequest(const std::vector<uint64_t> &ids, bool bRetrieveState);
// login
bool IsOnline();
@@ -193,6 +192,13 @@ class CSteamProto : public PROTO<CSteamProto>
void SetAllContactStatuses(int status);
void SetContactStatus(MCONTACT hContact, uint16_t status);
+ void SendUserInfoRequest(uint64_t id, bool bRetrieveState);
+ void SendUserInfoRequest(const std::vector<uint64_t> &ids, bool bRetrieveState);
+
+ void SendUserAddRequest(uint64_t id);
+ void SendUserRemoveRequest(MCONTACT hContact);
+ void SendUserIgnoreRequest(MCONTACT hContact, bool bIgnore);
+
MCONTACT GetContactFromAuthEvent(MEVENT hEvent);
void UpdateContactRelationship(MCONTACT hContact, FriendRelationship);
@@ -216,11 +222,6 @@ class CSteamProto : public PROTO<CSteamProto>
void OnGotBlockList(const JSONNode &root, void *);
void OnGotAvatar(const MHttpResponse &response, void *arg);
- void OnFriendAdded(const MHttpResponse &response, void *arg);
- void OnFriendBlocked(const MHttpResponse &response, void *arg);
- void OnFriendUnblocked(const MHttpResponse &response, void *arg);
- void OnFriendRemoved(const MHttpResponse &response, void *arg);
-
void OnPendingApproved(const JSONNode &root, void *arg);
void OnPendingIgnoreded(const JSONNode &root, void *arg);
@@ -295,20 +296,6 @@ class CSteamProto : public PROTO<CSteamProto>
// return m_idleTS ? time(0) - m_idleTS : 0;
}
- inline const char *AccountIdToSteamId(long long accountId)
- {
- static char steamId[20];
- mir_snprintf(steamId, "%llu", accountId + 76561197960265728ll);
- return steamId;
- }
-
- inline const char *SteamIdToAccountId(long long steamId)
- {
- static char accountId[10];
- mir_snprintf(accountId, "%llu", steamId - 76561197960265728ll);
- return accountId;
- }
-
public:
// constructor
CSteamProto(const char *protoName, const wchar_t *userName);
diff --git a/protocols/Steam/src/steam_server.cpp b/protocols/Steam/src/steam_server.cpp
index 061c2ec6c2..91ad4762f9 100644
--- a/protocols/Steam/src/steam_server.cpp
+++ b/protocols/Steam/src/steam_server.cpp
@@ -67,6 +67,27 @@ void CSteamProto::SendUserInfoRequest(const std::vector<uint64_t> &ids, bool bRe
WSSend(EMsg::ClientRequestFriendData, request);
}
+void CSteamProto::SendUserAddRequest(uint64_t id)
+{
+ CMsgClientAddFriend request;
+ request.has_steamid_to_add = true; request.steamid_to_add = id;
+ WSSend(EMsg::ClientAddFriend, request);
+}
+
+void CSteamProto::SendUserRemoveRequest(MCONTACT hContact)
+{
+ CMsgClientRemoveFriend request;
+ request.has_friendid = true; request.friendid = SteamIdToAccountId(GetId(hContact, DBKEY_STEAM_ID));
+ WSSend(EMsg::ClientRemoveFriend, request);
+}
+
+void CSteamProto::SendUserIgnoreRequest(MCONTACT hContact, bool bIgnore)
+{
+ MBinBuffer payload;
+ payload << m_iSteamId << SteamIdToAccountId(GetId(hContact, DBKEY_STEAM_ID)) << uint8_t(bIgnore);
+ WSSendRaw(EMsg::ClientSetIgnoreFriend, payload);
+}
+
void CSteamProto::SendHeartBeat()
{
CMsgClientHeartBeat packet;
diff --git a/protocols/Steam/src/steam_utils.cpp b/protocols/Steam/src/steam_utils.cpp
index 912f84318f..9666316ceb 100644
--- a/protocols/Steam/src/steam_utils.cpp
+++ b/protocols/Steam/src/steam_utils.cpp
@@ -1,10 +1,10 @@
#include "stdafx.h"
-int64_t getRandomInt()
+uint64_t getRandomInt()
{
- int64_t ret;
+ uint64_t ret;
Utils_GetRandom(&ret, sizeof(ret));
- return (ret >= 0) ? ret : -ret;
+ return ret & INT64_MAX;
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Steam/src/steam_utils.h b/protocols/Steam/src/steam_utils.h
index 40cdd07088..aaae1c1fb5 100644
--- a/protocols/Steam/src/steam_utils.h
+++ b/protocols/Steam/src/steam_utils.h
@@ -12,7 +12,19 @@ MBinBuffer createMachineID(const char *accName);
#define now() time(0)
-int64_t getRandomInt();
+uint64_t getRandomInt();
CMStringA protobuf_c_text_to_string(const ProtobufCMessage &msg);
+inline const char *AccountIdToSteamId(long long accountId)
+{
+ static char steamId[20];
+ mir_snprintf(steamId, "%llu", accountId + 76561197960265728ll);
+ return steamId;
+}
+
+inline uint64_t SteamIdToAccountId(uint64_t steamId)
+{
+ return steamId & 0xFFFFFFFFll;
+}
+
#endif //_STEAM_UTILS_H_
diff --git a/protocols/Steam/src/steam_ws.cpp b/protocols/Steam/src/steam_ws.cpp
index 585d995e24..783ea22e6a 100644
--- a/protocols/Steam/src/steam_ws.cpp
+++ b/protocols/Steam/src/steam_ws.cpp
@@ -257,6 +257,16 @@ void CSteamProto::WSSend(EMsg msgType, const ProtobufCppMessage &msg)
WSSendHeader(msgType, hdr, msg);
}
+void CSteamProto::WSSendRaw(EMsg msgType, const MBinBuffer &body)
+{
+ MBinBuffer payload;
+ payload << (uint32_t)(int)msgType << uint8_t(36) << uint16_t(2) << uint64_t(-1) << getRandomInt()
+ << uint8_t(239) << m_iSteamId << m_iSessionId;
+ payload.append(body);
+
+ m_ws->sendBinary(payload.data(), payload.length());
+}
+
void CSteamProto::WSSendHeader(EMsg msgType, const CMsgProtoBufHeader &hdr, const ProtobufCppMessage &msg)
{
debugLogA("Message sent:\n%s", protobuf_c_text_to_string(msg).c_str());