Files
aliyun-openapi-cpp-sdk/core/src/StsAssumeRoleCredentialsProvider.cc
wb-hx510875 a57f6ec422 fix code style
1. add .clang-format code style file.
2. format code of core.

use `clang-format -i -style=file ./core/*/*.cc ./core/*/*.h` command to format
2020-07-01 16:45:38 +08:00

79 lines
2.8 KiB
C++

/*
* Copyright 1999-2019 Alibaba Cloud All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <alibabacloud/core/StsAssumeRoleCredentialsProvider.h>
#include <iomanip>
#include <sstream>
namespace AlibabaCloud {
StsAssumeRoleCredentialsProvider::StsAssumeRoleCredentialsProvider(
const Credentials &credentials, const ClientConfiguration &configuration,
const std::string &roleArn, const std::string &roleSessionName,
const std::string &policy, int durationSeconds)
: CredentialsProvider(), StsClient(credentials, configuration),
roleArn_(roleArn), roleSessionName_(roleSessionName), policy_(policy),
durationSeconds_(durationSeconds), cachedMutex_(),
cachedCredentials_("", ""), expiry_() {}
StsAssumeRoleCredentialsProvider::~StsAssumeRoleCredentialsProvider() {}
Credentials StsAssumeRoleCredentialsProvider::getCredentials() {
loadCredentials();
std::lock_guard<std::mutex> locker(cachedMutex_);
return cachedCredentials_;
}
bool StsAssumeRoleCredentialsProvider::checkExpiry() const {
auto now = std::chrono::system_clock::now();
auto diff =
std::chrono::duration_cast<std::chrono::seconds>(now - expiry_).count();
return (diff > 0 - 60);
}
void StsAssumeRoleCredentialsProvider::loadCredentials() {
if (checkExpiry()) {
std::lock_guard<std::mutex> locker(cachedMutex_);
if (checkExpiry()) {
Sts::Model::AssumeRoleRequest request;
request.setRoleArn(roleArn_);
request.setRoleSessionName(roleSessionName_);
request.setPolicy(policy_);
request.setDurationSeconds(durationSeconds_);
auto assumeRoleOutcome = assumeRole(request);
if (assumeRoleOutcome.isSuccess()) {
const auto stsCredentials = assumeRoleOutcome.result().credentials();
cachedCredentials_ = Credentials(stsCredentials.accessKeyId,
stsCredentials.accessKeySecret,
stsCredentials.securityToken);
std::tm tm = {};
#if defined(__GNUG__) && __GNUC__ < 5
strptime(stsCredentials.expiration.c_str(), "%Y-%m-%dT%H:%M:%SZ", &tm);
#else
std::stringstream ss(stsCredentials.expiration);
ss >> std::get_time(&tm, "%Y-%m-%dT%H:%M:%SZ");
#endif
expiry_ = std::chrono::system_clock::from_time_t(std::mktime(&tm));
}
}
}
}
} // namespace AlibabaCloud