diff options
| author | George Hazan <george.hazan@gmail.com> | 2024-12-18 12:43:28 +0300 |
|---|---|---|
| committer | George Hazan <george.hazan@gmail.com> | 2024-12-18 12:43:33 +0300 |
| commit | 6899d60bbb0068d0d7a7886fe263d50a73216b6c (patch) | |
| tree | 61158b637688934e9b71e15f244ba977cdc55c01 /protocols | |
| parent | 59f927ee88735b97514c3224ce5929a99dabfa8b (diff) | |
all HTTP friend requests rewritten using Steam API
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/Steam/Steam.vcxproj | 2 | ||||
| -rw-r--r-- | protocols/Steam/Steam.vcxproj.filters | 6 | ||||
| -rw-r--r-- | protocols/Steam/src/api/friend_list.h | 72 | ||||
| -rw-r--r-- | protocols/Steam/src/stdafx.h | 1 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_contacts.cpp | 44 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_menus.cpp | 12 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_proto.cpp | 17 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_proto.h | 29 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_server.cpp | 21 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_utils.cpp | 6 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_utils.h | 14 | ||||
| -rw-r--r-- | protocols/Steam/src/steam_ws.cpp | 10 |
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()); |
