summaryrefslogtreecommitdiff
path: root/protocols/Steam/src/steam_account.cpp
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2014-04-09 12:06:39 +0000
committerAlexander Lantsev <aunsane@gmail.com>2014-04-09 12:06:39 +0000
commit5d2487dc97a63b0545b2d7d56405e7417fa2dd75 (patch)
tree8dea03916b8f166232dfe2fe28c5c218596e75c5 /protocols/Steam/src/steam_account.cpp
parent33011dcb857b9e762c44bc9a9875365e2f5d0f91 (diff)
Steam:
- add searching by name - added contact info updating - small improvements git-svn-id: http://svn.miranda-ng.org/main/trunk@8901 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Steam/src/steam_account.cpp')
-rw-r--r--protocols/Steam/src/steam_account.cpp182
1 files changed, 30 insertions, 152 deletions
diff --git a/protocols/Steam/src/steam_account.cpp b/protocols/Steam/src/steam_account.cpp
index c0686cf7bd..812b9a75b5 100644
--- a/protocols/Steam/src/steam_account.cpp
+++ b/protocols/Steam/src/steam_account.cpp
@@ -1,51 +1,5 @@
#include "common.h"
-WORD CSteamProto::SteamToMirandaStatus(int state)
-{
- switch (state)
- {
- case 0: //Offline
- return ID_STATUS_OFFLINE;
- case 2: //Busy
- return ID_STATUS_DND;
- case 3: //Away
- return ID_STATUS_AWAY;
- /*case 4: //Snoozing
- prim = PURPLE_STATUS_EXTENDED_AWAY;
- break;
- case 5: //Looking to trade
- return "trade";
- case 6: //Looking to play
- return "play";*/
- //case 1: //Online
- default:
- return ID_STATUS_ONLINE;
- }
-}
-
-int CSteamProto::MirandaToSteamState(int status)
-{
- switch (status)
- {
- case ID_STATUS_OFFLINE:
- return 0; //Offline
- case ID_STATUS_DND:
- return 2; //Busy
- case ID_STATUS_AWAY:
- return 3; //Away
- /*case 4: //Snoozing
- prim = PURPLE_STATUS_EXTENDED_AWAY;
- break;
- case 5: //Looking to trade
- return "trade";
- case 6: //Looking to play
- return "play";*/
- //case 1: //Online
- default:
- return ID_STATUS_ONLINE;
- }
-}
-
bool CSteamProto::IsOnline()
{
return m_iStatus > ID_STATUS_OFFLINE && m_hPollingThread;
@@ -94,8 +48,6 @@ void CSteamProto::Authorize(SteamWebApi::AuthorizationApi::AuthResult *authResul
if (lstrlen(nickname) == 0 && username)
setWString("Nick", username);
- return;
-
// get rsa public key
SteamWebApi::RsaKeyApi::RsaKey rsaKey;
SteamWebApi::RsaKeyApi::GetRsaKey(m_hNetlibUser, username, &rsaKey);
@@ -104,105 +56,21 @@ void CSteamProto::Authorize(SteamWebApi::AuthorizationApi::AuthResult *authResul
ptrA password(getStringA("Password"));
- const char *pszModulus = rsaKey.GetModulus();
- DWORD cchModulus = strlen(pszModulus);
-
- // convert hex string to byte array
- DWORD cbLen = 0, dwSkip = 0, dwFlags = 0;
- if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, NULL, &cbLen, &dwSkip, &dwFlags))
- {
- debugLogA("CSteamProto::Authorize: Cannot get size of rsa modulus in binary (%lu)", GetLastError());
- return;
- }
-
- // Allocate a new buffer.
- BYTE *pbBuffer = (BYTE*)malloc(cbLen);
- if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, pbBuffer, &cbLen, &dwSkip, &dwFlags))
- {
- debugLogA("CSteamProto::Authorize: Cannot convert rsa modulus to binary (%lu)", GetLastError());
- return;
- }
-
- // reverse byte array, because of microsoft
- for (int i = 0; i < cbLen / 2; ++i)
- {
- BYTE temp = pbBuffer[cbLen - i - 1];
- pbBuffer[cbLen - i - 1] = pbBuffer[i];
- pbBuffer[i] = temp;
- }
-
- HCRYPTPROV hCSP = 0;
- if (!CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT) &&
- !CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT | CRYPT_NEWKEYSET))
- {
- debugLogA("CSteamProto::Authorize: Cannot create rsa context (%lu)", GetLastError());
- return;
- }
-
- // Move the key into the key container.
- DWORD cbKeyBlob = sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + cbLen;
- BYTE *pKeyBlob = (BYTE*)malloc(cbKeyBlob);
-
- // Fill in the data.
- PUBLICKEYSTRUC *pPublicKey = (PUBLICKEYSTRUC*)pKeyBlob;
- pPublicKey->bType = PUBLICKEYBLOB;
- pPublicKey->bVersion = CUR_BLOB_VERSION; // Always use this value.
- pPublicKey->reserved = 0; // Must be zero.
- pPublicKey->aiKeyAlg = CALG_RSA_KEYX; // RSA public-key key exchange.
-
- // The next block of data is the RSAPUBKEY structure.
- RSAPUBKEY *pRsaPubKey = (RSAPUBKEY*)(pKeyBlob + sizeof(PUBLICKEYSTRUC));
- pRsaPubKey->magic = 0x31415352; // RSA1 // Use public key
- pRsaPubKey->bitlen = cbLen * 8; // Number of bits in the modulus.
- pRsaPubKey->pubexp = 0x10001; // "010001" // Exponent.
-
- // Copy the modulus into the blob. Put the modulus directly after the
- // RSAPUBKEY structure in the blob.
- BYTE *pKey = (BYTE*)(((BYTE *)pRsaPubKey) + sizeof(RSAPUBKEY));
- //pKeyBlob + sizeof(BLOBHEADER)+ sizeof(RSAPUBKEY);
- memcpy(pKey, pbBuffer, cbLen);
-
- // Now import public key
- HCRYPTKEY phKey = 0;
- if (!CryptImportKey(hCSP, pKeyBlob, cbKeyBlob, 0, 0, &phKey))
- {
- debugLogA("CSteamProto::Authorize: Cannot import rsa key to context (%lu)", GetLastError());
- return;
- }
-
- // encrypt password
+ DWORD error = 0;
DWORD encryptedSize = 0;
- DWORD pwdLength = strlen(password);
- if (!CryptEncrypt(phKey, 0, TRUE, 0, NULL, &encryptedSize, pwdLength))
+ if ((error = RsaEncrypt(rsaKey, password, strlen(password), NULL, encryptedSize)) != 0)
{
- debugLogA("CSteamProto::Authorize: Cannot get rsa encrypt length (%lu)", GetLastError());
+ debugLogA("CSteamProto::Rsa: encryption error (%lu)", error);
return;
}
BYTE *encryptedPassword = (BYTE*)mir_calloc(encryptedSize);
- memcpy(encryptedPassword, password, pwdLength);
- if (!CryptEncrypt(phKey, 0, TRUE, 0, encryptedPassword, &pwdLength, encryptedSize))
+ if ((error = RsaEncrypt(rsaKey, password, strlen(password), encryptedPassword, encryptedSize)) != 0)
{
- debugLogA("CSteamProto::Authorize: Cannot rsa encrypt password (%lu)", GetLastError());
+ debugLogA("CSteamProto::Rsa: encryption error (%lu)", error);
return;
}
- // reverse byte array again
- for (int i = 0; i < encryptedSize / 2; ++i)
- {
- BYTE temp = encryptedPassword[encryptedSize - i - 1];
- encryptedPassword[encryptedSize - i - 1] = encryptedPassword[i];
- encryptedPassword[i] = temp;
- }
-
- // save rsa encrypted password to db
- db_set_blob(NULL, this->m_szModuleName, "EncryptedPassword", encryptedPassword, encryptedSize);
-
- CryptDestroyKey(phKey);
- free(pKeyBlob);
- CryptReleaseContext(hCSP, 0);
- free(pbBuffer);
-
base64RsaEncryptedPassword = mir_base64_encode(encryptedPassword, encryptedSize);
mir_free(encryptedPassword);
@@ -245,8 +113,8 @@ void CSteamProto::LogInThread(void* param)
if (this->IsOnline())
return;
- CMStringA token(getStringA("TokenSecret"));
- if (token.IsEmpty())
+ ptrA token(getStringA("TokenSecret"));
+ if (!token || lstrlenA(token) == 0)
{
SteamWebApi::AuthorizationApi::AuthResult authResult;
Authorize(&authResult);
@@ -262,31 +130,40 @@ void CSteamProto::LogInThread(void* param)
return;
}
- token = authResult.GetToken();
+ token = mir_strdup(authResult.GetToken());
+
setString("TokenSecret", token);
- setString("Cookie", authResult.GetCookie());
+ //setString("Cookie", authResult.GetCookie());
setString("SteamID", authResult.GetSteamid());
}
SteamWebApi::LoginApi::LoginResult loginResult;
SteamWebApi::LoginApi::Logon(m_hNetlibUser, token, &loginResult);
+
// if some error
if (!loginResult.IsSuccess())
{
- debugLogA("CSteamProto::login: Error");
+ debugLogA("CSteamProto::Login: Error (%d)", loginResult.GetStatus());
+
+ // token has expired
+ if (loginResult.GetStatus() == HTTP_STATUS_UNAUTHORIZED)
+ {
+ delSetting("TokenSecret");
+ delSetting("Cookie");
+ }
+
// set status to offline
m_iStatus = m_iDesiredStatus = ID_STATUS_OFFLINE;
ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, ID_STATUS_OFFLINE);
return;
}
- else
- {
- setString("SessionID", loginResult.GetSessionId());
- setDword("MessageID", loginResult.GetMessageId());
- // set selected status
- m_iStatus = m_iDesiredStatus;
- ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iDesiredStatus);
- }
+
+ setString("SessionID", loginResult.GetSessionId());
+ setDword("MessageID", loginResult.GetMessageId());
+
+ // set selected status
+ m_iStatus = m_iDesiredStatus;
+ ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iDesiredStatus);
// get contact list
SteamWebApi::FriendListApi::FriendList friendList;
@@ -298,10 +175,11 @@ void CSteamProto::LogInThread(void* param)
{
if (!FindContact(friendList[i]))
{
- SteamWebApi::FriendApi::Friend rFriend;
+ // todo
+ /*SteamWebApi::FriendApi::Friend rFriend;
SteamWebApi::FriendApi::LoadSummaries(m_hNetlibUser, token, friendList[i], &rFriend);
if (!rFriend.IsSuccess()) continue;
- AddContact(rFriend);
+ AddContact(rFriend);*/
}
}
}