winamp/Src/auth/Loginbox/loginCredentials.cpp

109 lines
2.5 KiB
C++

#include "./loginCredentials.h"
#include "./common.h"
#include "../api_auth.h"
LoginCredentials::LoginCredentials(const GUID *pRealm, LPCWSTR pszName, LPCSTR pszSession, LPCSTR pszToken, __time64_t tExpire)
: ref(1), username(NULL), sessionKey(NULL), token(NULL)
{
realm = (NULL == pRealm) ? GUID_NULL : *pRealm;
username = LoginBox_CopyString(pszName);
sessionKey = LoginBox_CopyAnsiString(pszSession);
token = LoginBox_CopyAnsiString(pszToken);
expire = tExpire;
}
LoginCredentials::~LoginCredentials()
{
LoginBox_FreeStringSecure(username);
LoginBox_FreeAnsiStringSecure(sessionKey);
LoginBox_FreeAnsiStringSecure(token);
}
HRESULT LoginCredentials::CreateInstance(const GUID *pRealm, LPCWSTR pszName, LPCSTR pszSession, LPCSTR pszToken, __time64_t tExpire, LoginCredentials **instance)
{
if (NULL == instance) return E_POINTER;
*instance = new LoginCredentials(pRealm, pszName, pszSession, pszToken, tExpire);
if (NULL == *instance) return E_OUTOFMEMORY;
return S_OK;
}
HRESULT LoginCredentials::CreateFromAuth(api_auth *authApi, const GUID *pRealm, LoginCredentials **instance)
{
if (NULL == instance) return E_POINTER;
*instance = NULL;
if (NULL == authApi) return E_INVALIDARG;
const size_t sessionKeyMax(8192), tokenMax(8192), usernameMax(8192);
LPSTR sessionKey = LoginBox_MallocAnsiString(sessionKeyMax);
LPSTR token = LoginBox_MallocAnsiString(tokenMax);
LPWSTR username = LoginBox_MallocString(usernameMax);
__time64_t expire;
HRESULT hr;
if (NULL == sessionKey || NULL == token || NULL == username)
hr = E_OUTOFMEMORY;
else
{
INT result = authApi->GetCredentials((NULL != pRealm) ? *pRealm : GUID_NULL, sessionKey, sessionKeyMax, token, tokenMax, username, usernameMax, &expire);
if (AUTH_SUCCESS == result)
{
hr = CreateInstance(pRealm, username, sessionKey, token, expire, instance);
}
else
{
hr = E_FAIL;
}
}
LoginBox_FreeAnsiStringSecure(sessionKey);
LoginBox_FreeAnsiStringSecure(token);
LoginBox_FreeStringSecure(username);
return hr;
}
UINT LoginCredentials::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
UINT LoginCredentials::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
GUID LoginCredentials::GetRealm()
{
return realm;
}
__time64_t LoginCredentials::GetExpiration()
{
return expire;
}
LPCWSTR LoginCredentials::GetUsername()
{
return username;
}
LPCSTR LoginCredentials::GetSessionKey()
{
return sessionKey;
}
LPCSTR LoginCredentials::GetToken()
{
return token;
}