aboutsummaryrefslogtreecommitdiff
path: root/zenserver/upstream/jupiter.cpp
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2022-02-01 13:19:52 +0100
committerPer Larsson <[email protected]>2022-02-01 13:19:52 +0100
commit14b1cd4930f5bf94ddf0a6979097d27892497523 (patch)
treeed596aca1a53173aa723978a8bec31296e72c735 /zenserver/upstream/jupiter.cpp
parentParital completed cloud cache token provider interface. (diff)
downloadzen-14b1cd4930f5bf94ddf0a6979097d27892497523.tar.xz
zen-14b1cd4930f5bf94ddf0a6979097d27892497523.zip
Refactored cloud cache access token provider.
Diffstat (limited to 'zenserver/upstream/jupiter.cpp')
-rw-r--r--zenserver/upstream/jupiter.cpp48
1 files changed, 36 insertions, 12 deletions
diff --git a/zenserver/upstream/jupiter.cpp b/zenserver/upstream/jupiter.cpp
index 86c7e1611..f141856c1 100644
--- a/zenserver/upstream/jupiter.cpp
+++ b/zenserver/upstream/jupiter.cpp
@@ -33,7 +33,15 @@ namespace detail {
{
CloudCacheSessionState(CloudCacheClient& Client) : m_Client(Client) {}
- const CloudCacheAccessToken& GetAccessToken() { return m_AccessToken; }
+ const CloudCacheAccessToken& GetAccessToken(bool RefreshToken)
+ {
+ if (RefreshToken)
+ {
+ m_AccessToken = m_Client.AcquireAccessToken();
+ }
+
+ return m_AccessToken;
+ }
cpr::Session& GetSession() { return m_Session; }
@@ -68,7 +76,9 @@ CloudCacheSession::~CloudCacheSession()
CloudCacheResult
CloudCacheSession::Authenticate()
{
- const CloudCacheAccessToken& AccessToken = GetAccessToken();
+ const bool RefreshToken = true;
+ const CloudCacheAccessToken& AccessToken = GetAccessToken(RefreshToken);
+
return {.Success = AccessToken.IsValid()};
}
@@ -679,9 +689,9 @@ CloudCacheSession::GetSession()
}
CloudCacheAccessToken
-CloudCacheSession::GetAccessToken()
+CloudCacheSession::GetAccessToken(bool RefreshToken)
{
- return m_SessionState->GetAccessToken();
+ return m_SessionState->GetAccessToken(RefreshToken);
}
bool
@@ -778,7 +788,7 @@ public:
virtual ~StaticTokenProvider() = default;
- virtual CloudCacheAccessToken GetAccessToken() final override { return m_Token; }
+ virtual CloudCacheAccessToken AcquireAccessToken() final override { return m_Token; }
private:
CloudCacheAccessToken m_Token;
@@ -802,12 +812,12 @@ public:
virtual ~OAuthClientCredentialsTokenProvider() = default;
- virtual CloudCacheAccessToken GetAccessToken() final override
+ virtual CloudCacheAccessToken AcquireAccessToken() final override
{
using namespace std::chrono;
std::string Body =
- fmt::format("client_id={}&scope=cache_access&grant_type=client_credentials&client_secret={k}", m_ClientId, m_ClientSecret);
+ fmt::format("client_id={}&scope=cache_access&grant_type=client_credentials&client_secret={}", m_ClientId, m_ClientSecret);
cpr::Response Response =
cpr::Post(cpr::Url{m_Url}, cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"}}, cpr::Body{std::move(Body)});
@@ -844,13 +854,14 @@ CloudCacheTokenProvider::MakeFromOAuthClientCredentials(const OAuthClientCredent
return std::make_unique<OAuthClientCredentialsTokenProvider>(Params);
}
-CloudCacheClient::CloudCacheClient(const CloudCacheClientOptions& Options)
+CloudCacheClient::CloudCacheClient(CloudCacheClientOptions&& Options)
: m_Log(zen::logging::Get("jupiter"))
, m_ServiceUrl(Options.ServiceUrl)
, m_DdcNamespace(Options.DdcNamespace)
, m_BlobStoreNamespace(Options.BlobStoreNamespace)
, m_ConnectTimeout(Options.ConnectTimeout)
, m_Timeout(Options.Timeout)
+, m_TokenProvider(std::move(Options.TokenProvider))
{
}
@@ -869,7 +880,7 @@ CloudCacheClient::AcquireAccessToken()
{
ZEN_TRACE_CPU("HordeClient::AcquireAccessToken");
- return m_TokenProvider->GetAccessToken();
+ return m_TokenProvider->AcquireAccessToken();
}
detail::CloudCacheSessionState*
@@ -877,10 +888,18 @@ CloudCacheClient::AllocSessionState()
{
detail::CloudCacheSessionState* State = nullptr;
- if (RwLock::ExclusiveLockScope _(m_SessionStateLock); !m_SessionStateCache.empty())
+ bool IsTokenValid = false;
+
{
- State = m_SessionStateCache.front();
- m_SessionStateCache.pop_front();
+ RwLock::ExclusiveLockScope _(m_SessionStateLock);
+
+ if (m_SessionStateCache.empty() == false)
+ {
+ State = m_SessionStateCache.front();
+ IsTokenValid = State->m_AccessToken.IsValid();
+
+ m_SessionStateCache.pop_front();
+ }
}
if (State == nullptr)
@@ -890,6 +909,11 @@ CloudCacheClient::AllocSessionState()
State->Reset(m_ConnectTimeout, m_Timeout);
+ if (IsTokenValid == false)
+ {
+ State->m_AccessToken = m_TokenProvider->AcquireAccessToken();
+ }
+
return State;
}