From 70436074ae8f66a092d0212fb8b99b94d0fd03a6 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Fri, 2 May 2014 22:22:41 +0000 Subject: Steam: improved contact management git-svn-id: http://svn.miranda-ng.org/main/trunk@9108 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/Steam/authorization.h | 2 -- protocols/Steam/src/Steam/friend_list.h | 8 +++-- protocols/Steam/src/Steam/login.h | 1 - protocols/Steam/src/Steam/message.h | 3 -- protocols/Steam/src/Steam/pending.h | 3 -- protocols/Steam/src/Steam/poll.h | 1 - protocols/Steam/src/http_request.h | 6 ++-- protocols/Steam/src/steam_account.cpp | 10 +++--- protocols/Steam/src/steam_contacts.cpp | 31 +++++++++++++++-- protocols/Steam/src/steam_proto.cpp | 55 ++++++++++++++++++++++--------- protocols/Steam/src/steam_proto.h | 2 +- protocols/Steam/src/steam_thread.cpp | 6 ++-- 12 files changed, 85 insertions(+), 43 deletions(-) (limited to 'protocols') diff --git a/protocols/Steam/src/Steam/authorization.h b/protocols/Steam/src/Steam/authorization.h index baa5d2c93f..a8911034a0 100644 --- a/protocols/Steam/src/Steam/authorization.h +++ b/protocols/Steam/src/Steam/authorization.h @@ -82,7 +82,6 @@ namespace SteamWebApi time(NULL)); SecureHttpPostRequest request(hConnection, STEAM_COM_URL "/mobilelogin/dologin"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.ResetFlags(NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP); request.SetData(data, strlen(data)); @@ -149,7 +148,6 @@ namespace SteamWebApi authResult->cookie.c_str()); SecureHttpPostRequest second_request(hConnection, STEAM_COM_URL "/mobileloginsucceeded"); - second_request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); second_request.ResetFlags(NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP); second_request.SetData(data, strlen(data)); diff --git a/protocols/Steam/src/Steam/friend_list.h b/protocols/Steam/src/Steam/friend_list.h index 78a30333a0..4ce1ae1aec 100644 --- a/protocols/Steam/src/Steam/friend_list.h +++ b/protocols/Steam/src/Steam/friend_list.h @@ -47,6 +47,7 @@ namespace SteamWebApi SecureHttpGetRequest request(hConnection, STEAM_API_URL "/ISteamUserOAuth/GetFriendList/v0001"); request.AddParameter("access_token", token); request.AddParameter("steamid", steamId); + request.AddParameter("relationship=friend,ignoredfriend,requestrecipient"); //relationship = friend, requestrecipient mir_ptr response(request.Send()); @@ -111,7 +112,6 @@ namespace SteamWebApi who); SecureHttpPostRequest request(hConnection, STEAM_COM_URL "/actions/AddFriendAjax"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cookie", cookie); request.SetData(data, strlen(data)); @@ -119,7 +119,10 @@ namespace SteamWebApi if (!response) return; - if ((result->status = (HTTP_STATUS)response->resultCode) != HTTP_STATUS_OK || lstrcmpiA(response->pData, "true")) + JSONNODE *root = json_parse(response->pData), *node; + node = json_get(root, "success"); + + if ((result->status = (HTTP_STATUS)response->resultCode) != HTTP_STATUS_OK || json_as_int(node) == 0) return; result->success = true; @@ -142,7 +145,6 @@ namespace SteamWebApi who); SecureHttpPostRequest request(hConnection, STEAM_COM_URL "/actions/RemoveFriendAjax"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cookie", cookie); request.SetData(data, strlen(data)); diff --git a/protocols/Steam/src/Steam/login.h b/protocols/Steam/src/Steam/login.h index 30593d9c14..84d29ef2f2 100644 --- a/protocols/Steam/src/Steam/login.h +++ b/protocols/Steam/src/Steam/login.h @@ -30,7 +30,6 @@ namespace SteamWebApi mir_snprintf(data, SIZEOF(data), "access_token=%s", token); SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Logon/v0001"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.SetData(data, strlen(data)); mir_ptr response(request.Send()); diff --git a/protocols/Steam/src/Steam/message.h b/protocols/Steam/src/Steam/message.h index c3c95a28bb..bb9fec3bc1 100644 --- a/protocols/Steam/src/Steam/message.h +++ b/protocols/Steam/src/Steam/message.h @@ -31,7 +31,6 @@ namespace SteamWebApi state); SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.SetData(data, strlen(data)); mir_ptr response(request.Send()); @@ -57,7 +56,6 @@ namespace SteamWebApi ptrA(mir_urlEncode(text))); SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.SetData(data, strlen(data)); mir_ptr response(request.Send()); @@ -93,7 +91,6 @@ namespace SteamWebApi steamId); SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.SetData(data, strlen(data)); mir_ptr response(request.Send()); diff --git a/protocols/Steam/src/Steam/pending.h b/protocols/Steam/src/Steam/pending.h index d010e6982b..ea65627b32 100644 --- a/protocols/Steam/src/Steam/pending.h +++ b/protocols/Steam/src/Steam/pending.h @@ -23,7 +23,6 @@ namespace SteamWebApi mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=accept&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); SecureHttpPostRequest request(hConnection, url); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cookie", cookie); request.SetData(data, strlen(data)); @@ -54,7 +53,6 @@ namespace SteamWebApi mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=ignore&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); SecureHttpPostRequest request(hConnection, url); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cookie", cookie); request.SetData(data, strlen(data)); @@ -85,7 +83,6 @@ namespace SteamWebApi mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=block&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); SecureHttpPostRequest request(hConnection, url); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cookie", cookie); request.SetData(data, strlen(data)); diff --git a/protocols/Steam/src/Steam/poll.h b/protocols/Steam/src/Steam/poll.h index be90890725..c6f40cf749 100644 --- a/protocols/Steam/src/Steam/poll.h +++ b/protocols/Steam/src/Steam/poll.h @@ -93,7 +93,6 @@ namespace SteamWebApi mir_snprintf(data, SIZEOF(data), "access_token=%s&umqid=%s&message=%u", token, umqId, messageId); SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Poll/v0001"); - request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.SetData(data, strlen(data)); request.SetTimeout(90000); // may need to encrease timeout diff --git a/protocols/Steam/src/http_request.h b/protocols/Steam/src/http_request.h index c08bd1434a..b4f312111b 100644 --- a/protocols/Steam/src/http_request.h +++ b/protocols/Steam/src/http_request.h @@ -115,7 +115,6 @@ public: NETLIBHTTPREQUEST *response = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)m_hNetlibUser, (LPARAM)this); mir_free(szUrl);szUrl = NULL; return response; - } private: @@ -156,7 +155,10 @@ class SecureHttpPostRequest : public SecureHttpRequest { public: SecureHttpPostRequest(HANDLE hNetlibUser, LPCSTR url) - : SecureHttpRequest(hNetlibUser, REQUEST_POST, url) { } + : SecureHttpRequest(hNetlibUser, REQUEST_POST, url) + { + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } }; #endif //_HTTP_REQUEST_H_ \ No newline at end of file diff --git a/protocols/Steam/src/steam_account.cpp b/protocols/Steam/src/steam_account.cpp index 0335d40b1d..13708c50f7 100644 --- a/protocols/Steam/src/steam_account.cpp +++ b/protocols/Steam/src/steam_account.cpp @@ -146,7 +146,7 @@ void CSteamProto::LogInThread(void* param) token = mir_strdup(authResult.GetToken()); setString("TokenSecret", token); - setString("Cookie", authResult.GetCookie()); + //setString("Cookie", authResult.GetCookie()); setString("SteamID", authResult.GetSteamid()); setString("SessionID", authResult.GetSessionId()); } @@ -180,7 +180,7 @@ void CSteamProto::LogInThread(void* param) m_iStatus = m_iDesiredStatus; ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus); - ptrA sessionId(getStringA("SessionID")); + /*ptrA sessionId(getStringA("SessionID")); if (!sessionId || lstrlenA(sessionId) == 0) { SteamWebApi::SessionApi::SessionId result; @@ -188,7 +188,7 @@ void CSteamProto::LogInThread(void* param) SteamWebApi::SessionApi::GetSessionId(m_hNetlibUser, token, loginResult.GetSteamId(), &result); if (result.IsSuccess()) setString("SessionID", result.GetSessionId()); - } + }*/ // load contact list LoadContactListThread(NULL); @@ -206,8 +206,8 @@ void CSteamProto::LogOutThread(void*) ptrA token(getStringA("TokenSecret")); ptrA umqId(getStringA("UMQID")); - while (m_bTerminated && m_hPollingThread != NULL) - Sleep(500); + while (!Miranda_Terminated() && m_bTerminated && m_hPollingThread != NULL) + Sleep(200); debugLogA("CSteamProto::LogOutThread: call SteamWebApi::LoginApi::Logoff"); SteamWebApi::LoginApi::Logoff(m_hNetlibUser, token, umqId); diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp index 2f3018a873..aaccb3bf75 100644 --- a/protocols/Steam/src/steam_contacts.cpp +++ b/protocols/Steam/src/steam_contacts.cpp @@ -181,7 +181,7 @@ void CSteamProto::UpdateContactsThread(void *arg) } } -MCONTACT CSteamProto::AddContact(const char *steamId) +MCONTACT CSteamProto::AddContact(const char *steamId, bool isTemporary) { MCONTACT hContact = this->FindContact(steamId); if (!hContact) @@ -195,6 +195,13 @@ MCONTACT CSteamProto::AddContact(const char *steamId) // update info //UpdateContact(hContact, contact); + if (isTemporary) + { + setByte(hContact, "Auth", 1); + //setByte(hContact, "Grant", 1); + db_set_b(hContact, "CList", "NotOnList", 1); + } + // move to default group DBVARIANT dbv; if (!getWString("DefaultGroup", &dbv)) @@ -216,6 +223,9 @@ void CSteamProto::RaiseAuthRequestThread(void *arg) ptrA token(getStringA("TokenSecret")); ptrA steamId(getStringA(hContact, "SteamID")); + //setByte(hContact, "Auth", 1); + setByte(hContact, "Grant", 1); + SteamWebApi::FriendApi::Summaries summaries; debugLogA("CSteamProto::RaiseAuthRequestThread: call SteamWebApi::FriendApi::LoadSummaries"); SteamWebApi::FriendApi::LoadSummaries(m_hNetlibUser, token, steamId, &summaries); @@ -275,6 +285,7 @@ void CSteamProto::AuthAllowThread(void *arg) { delSetting(hContact, "Auth"); delSetting(hContact, "Grant"); + db_unset(hContact, "CList", "NotOnList"); /*SteamWebApi::FriendApi::Summaries summaries; debugLogA("CSteamProto::AuthAllowThread: call SteamWebApi::FriendApi::LoadSummaries"); @@ -305,6 +316,22 @@ void CSteamProto::AuthDenyThread(void *arg) void CSteamProto::AddContactThread(void *arg) { + MCONTACT hContact = (MCONTACT)arg; + if (!hContact) + return; + + ptrA token(getStringA("TokenSecret")); + ptrA sessionId(getStringA("SessionID")); + ptrA steamId(getStringA("SteamID")); + ptrA who(getStringA(hContact, "SteamID")); + + //db_unset(hContact, "CList", "NotOnList"); + + SteamWebApi::FriendListApi::Result result; + debugLogA("CSteamProto::AddContactThread: call SteamWebApi::FriendListApi::AddFriend"); + SteamWebApi::FriendListApi::AddFriend(m_hNetlibUser, token, sessionId, steamId, who, &result); + + ProtoBroadcastAck(hContact, ACKTYPE_AUTHREQ, result.IsSuccess() ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, (HANDLE)hContact, NULL); } void CSteamProto::RemoveContactThread(void *arg) @@ -355,7 +382,7 @@ void CSteamProto::LoadContactListThread(void*) { MCONTACT hContact = FindContact(steamId); if (!hContact) - hContact = AddContact(steamId); + hContact = AddContact(steamId, true); RaiseAuthRequestThread((void*)hContact); } diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp index 73dd62791b..c1258042a0 100644 --- a/protocols/Steam/src/steam_proto.cpp +++ b/protocols/Steam/src/steam_proto.cpp @@ -45,12 +45,26 @@ CSteamProto::~CSteamProto() MCONTACT __cdecl CSteamProto::AddToList(int flags, PROTOSEARCHRESULT* psr) { - if (psr->cbSize != sizeof(STEAM_SEARCH_RESULT)) - return 0; + MCONTACT hContact = NULL; + + if (psr->cbSize == sizeof(PROTOSEARCHRESULT)) + { + char *steamId = mir_u2a(psr->id); + if (!FindContact(steamId)) + { + hContact = AddContact(steamId, true); + ForkThread(&CSteamProto::UpdateContactsThread, (void*)steamId); + } + else + mir_free(steamId); + } + else if (psr->cbSize == sizeof(STEAM_SEARCH_RESULT)) + { + STEAM_SEARCH_RESULT *ssr = (STEAM_SEARCH_RESULT*)psr; + hContact = AddContact(ssr->contact->GetSteamId(), true); + UpdateContact(hContact, ssr->contact); + } - STEAM_SEARCH_RESULT *ssr = (STEAM_SEARCH_RESULT*)psr; - MCONTACT hContact = AddContact(ssr->contact->GetSteamId()); - UpdateContact(hContact, ssr->contact); return hContact; } @@ -68,7 +82,7 @@ int __cdecl CSteamProto::Authorize(HANDLE hDbEvent) return 1; ForkThread(&CSteamProto::AuthAllowThread, (void*)hContact); - // todo: how to return real status? + return 0; } @@ -84,9 +98,10 @@ int __cdecl CSteamProto::AuthDeny(HANDLE hDbEvent, const TCHAR* szReason) return 1; ForkThread(&CSteamProto::AuthDenyThread, (void*)hContact); - // todo: how to return real status? + return 0; } + return 1; } @@ -97,25 +112,32 @@ int __cdecl CSteamProto::AuthRecv(MCONTACT hContact, PROTORECVEVENT* pre) int __cdecl CSteamProto::AuthRequest(MCONTACT hContact, const TCHAR* szMessage) { - return 0; + if (IsOnline() && hContact) + { + ForkThread(&CSteamProto::AddContactThread, (void*)hContact); + + return hContact; + } + + return 1; } -HANDLE __cdecl CSteamProto::FileAllow(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szPath ) +HANDLE __cdecl CSteamProto::FileAllow(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szPath) { return 0; } -int __cdecl CSteamProto::FileCancel(MCONTACT hContact, HANDLE hTransfer ) +int __cdecl CSteamProto::FileCancel(MCONTACT hContact, HANDLE hTransfer) { return 0; } -int __cdecl CSteamProto::FileDeny(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szReason ) +int __cdecl CSteamProto::FileDeny(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szReason) { return 0; } -int __cdecl CSteamProto::FileResume( HANDLE hTransfer, int* action, const TCHAR** szFilename ) +int __cdecl CSteamProto::FileResume(HANDLE hTransfer, int* action, const TCHAR** szFilename) { return 0; } @@ -125,11 +147,11 @@ DWORD_PTR __cdecl CSteamProto:: GetCaps(int type, MCONTACT hContact) switch(type) { case PFLAGNUM_1: - return PF1_IM | PF1_BASICSEARCH | PF1_SEARCHBYNAME; + return PF1_IM | PF1_BASICSEARCH | PF1_SEARCHBYNAME | PF1_AUTHREQ | PF1_SERVERCLIST; case PFLAGNUM_2: return PF2_ONLINE | PF2_SHORTAWAY | PF2_HEAVYDND | PF2_OUTTOLUNCH; case PFLAGNUM_4: - return PF4_NOCUSTOMAUTH | PF4_AVATARS | PF4_NOAUTHDENYREASON; + return PF4_NOCUSTOMAUTH | PF4_AVATARS | PF4_NOAUTHDENYREASON;// | PF4_FORCEAUTH | PF4_FORCEADDED; case PFLAGNUM_5: return PF2_SHORTAWAY | PF2_HEAVYDND | PF2_OUTTOLUNCH; case PFLAG_UNIQUEIDTEXT: @@ -190,7 +212,7 @@ int __cdecl CSteamProto::RecvFile(MCONTACT hContact, PROTORECVFILET* pre) int __cdecl CSteamProto::RecvMsg(MCONTACT hContact, PROTORECVEVENT* pre) { - return (INT_PTR)AddDBEvent(hContact, EVENTTYPE_MESSAGE, time(NULL), DBEF_UTF, lstrlenA(pre->szMessage), (BYTE*)pre->szMessage); + return (INT_PTR)AddDBEvent(hContact, EVENTTYPE_MESSAGE, pre->timestamp, DBEF_UTF, lstrlenA(pre->szMessage), (BYTE*)pre->szMessage); } int __cdecl CSteamProto::RecvUrl(MCONTACT hContact, PROTORECVEVENT *) { return 0; } @@ -278,7 +300,8 @@ int __cdecl CSteamProto::OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM return this->OnOptionsInit(wParam, lParam);*/ case EV_PROTO_ONCONTACTDELETED: - ForkThread(&CSteamProto::RemoveContactThread, (void*)getStringA(wParam, "SteamID")); + if (this->IsOnline()) + ForkThread(&CSteamProto::RemoveContactThread, (void*)getStringA(wParam, "SteamID")); return 0; /*case EV_PROTO_ONMENU: diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 402338b2c7..7f188cca14 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -136,7 +136,7 @@ protected: void __cdecl UpdateContactsThread(void*); MCONTACT FindContact(const char *steamId); - MCONTACT AddContact(const char *steamId); + MCONTACT AddContact(const char *steamId, bool isTemporary = false); void __cdecl RaiseAuthRequestThread(void*); void __cdecl AuthAllowThread(void*); diff --git a/protocols/Steam/src/steam_thread.cpp b/protocols/Steam/src/steam_thread.cpp index a9deac4e74..91f202a955 100644 --- a/protocols/Steam/src/steam_thread.cpp +++ b/protocols/Steam/src/steam_thread.cpp @@ -116,10 +116,8 @@ void CSteamProto::PollServer(const char *token, const char *umqId, UINT32 messag MCONTACT hContact = FindContact(steamId); if (!hContact) - hContact = AddContact(steamId); + hContact = AddContact(steamId, true); - setByte(hContact, "Auth", 1); - setByte(hContact, "Grant", 1); RaiseAuthRequestThread((void*)hContact); } break; @@ -158,7 +156,7 @@ void CSteamProto::PollingThread(void*) if (pollResult.GetStatus() == HTTP_STATUS_UNAUTHORIZED) { delSetting("TokenSecret"); - delSetting("Cookie"); + //delSetting("Cookie"); } break; -- cgit v1.2.3