From 6899d60bbb0068d0d7a7886fe263d50a73216b6c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 18 Dec 2024 12:43:28 +0300 Subject: all HTTP friend requests rewritten using Steam API --- protocols/Steam/src/api/friend_list.h | 72 ---------------------------------- protocols/Steam/src/stdafx.h | 1 - protocols/Steam/src/steam_contacts.cpp | 44 +-------------------- protocols/Steam/src/steam_menus.cpp | 12 ++---- protocols/Steam/src/steam_proto.cpp | 17 ++------ protocols/Steam/src/steam_proto.h | 29 ++++---------- protocols/Steam/src/steam_server.cpp | 21 ++++++++++ protocols/Steam/src/steam_utils.cpp | 6 +-- protocols/Steam/src/steam_utils.h | 14 ++++++- protocols/Steam/src/steam_ws.cpp | 10 +++++ 10 files changed, 64 insertions(+), 162 deletions(-) delete mode 100644 protocols/Steam/src/api/friend_list.h (limited to 'protocols/Steam/src') 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 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 void SendLogout(); void SendPersonaStatus(int iStatus); void SendPollRequest(); - void SendUserInfoRequest(uint64_t id, bool bRetrieveState); - void SendUserInfoRequest(const std::vector &ids, bool bRetrieveState); // login bool IsOnline(); @@ -193,6 +192,13 @@ class CSteamProto : public PROTO void SetAllContactStatuses(int status); void SetContactStatus(MCONTACT hContact, uint16_t status); + void SendUserInfoRequest(uint64_t id, bool bRetrieveState); + void SendUserInfoRequest(const std::vector &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 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 // 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 &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()); -- cgit v1.2.3