diff options
| author | Per Larsson <[email protected]> | 2022-02-01 13:19:52 +0100 |
|---|---|---|
| committer | Per Larsson <[email protected]> | 2022-02-01 13:19:52 +0100 |
| commit | 14b1cd4930f5bf94ddf0a6979097d27892497523 (patch) | |
| tree | ed596aca1a53173aa723978a8bec31296e72c735 /zenserver/upstream/jupiter.cpp | |
| parent | Parital completed cloud cache token provider interface. (diff) | |
| download | zen-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.cpp | 48 |
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; } |