Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/aws-cpp-sdk-core/source/auth/CrtCredentialsProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <aws/crt/auth/Credentials.h>

#include <condition_variable>
#include <limits>
#include <mutex>

using namespace Aws::Auth;
Expand Down Expand Up @@ -99,8 +100,11 @@ AWSCredentials CrtCredentialsProvider::ExtractCredentialsFromCrt(const Aws::Crt:
credentials.SetAWSAccessKeyId({reinterpret_cast<char*>(accountIdCursor.ptr), accountIdCursor.len});
const auto secretKeyCursor = crtCredentials.GetSecretAccessKey();
credentials.SetAWSSecretKey({reinterpret_cast<char*>(secretKeyCursor.ptr), secretKeyCursor.len});
const auto expiration = crtCredentials.GetExpirationTimepointInSeconds();
credentials.SetExpiration(DateTime{static_cast<double>(expiration)});
const uint64_t expiration = crtCredentials.GetExpirationTimepointInSeconds();
// CRT uses UINT64_MAX for no expiration; preserve AWSCredentials' non-expiring default.
if (expiration != (std::numeric_limits<uint64_t>::max)()) {
credentials.SetExpiration(DateTime{expiration});
}
const auto sessionTokenCursor = crtCredentials.GetSessionToken();
credentials.SetSessionToken({reinterpret_cast<char*>(sessionTokenCursor.ptr), sessionTokenCursor.len});
return credentials;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <aws/testing/AwsCppSdkGTestSuite.h>

#include <chrono>
#include <limits>
#include <memory>
#include <thread>

Expand Down Expand Up @@ -104,6 +105,39 @@ class AsyncMockedCredsProvider : public Aws::Auth::CrtCredentialsProvider {

class CrtCredentialsProviderTest : public Aws::Testing::AwsCppSdkGTestSuite {};

TEST_F(CrtCredentialsProviderTest, NonExpiringCredentialsMustNotBeExpired) {
auto underlying_mock = Aws::MakeShared<MockCrtCredentialsProvider>(CRT_CREDS_TEST_LOG);

underlying_mock->AddCredentialForReturn(Aws::MakeShared<Aws::Crt::Auth::Credentials>(
CRT_CREDS_TEST_LOG, Aws::Crt::ByteCursorFromCString("access"), Aws::Crt::ByteCursorFromCString("secret"),
Aws::Crt::ByteCursorFromCString(""), std::numeric_limits<uint64_t>::max()));

MockedCredsProvider provider(underlying_mock);
const auto credentials = provider.GetAWSCredentials();

EXPECT_FALSE(credentials.IsEmpty());
EXPECT_FALSE(credentials.IsExpired());
EXPECT_FALSE(credentials.IsExpiredOrEmpty());
EXPECT_EQ(credentials.GetExpiration(), Aws::Auth::AWSCredentials{}.GetExpiration());
EXPECT_FALSE(provider.GetAWSCredentials().IsExpiredOrEmpty());
EXPECT_EQ(underlying_mock->GetNumCalls(), 1);
}

TEST_F(CrtCredentialsProviderTest, ShouldPreserveFiniteExpiration) {
auto underlying_mock = Aws::MakeShared<MockCrtCredentialsProvider>(CRT_CREDS_TEST_LOG);
const auto expiration = (Aws::Utils::DateTime::Now() + std::chrono::minutes(100)).Seconds();

underlying_mock->AddCredentialForReturn(Aws::MakeShared<Aws::Crt::Auth::Credentials>(
CRT_CREDS_TEST_LOG, Aws::Crt::ByteCursorFromCString("access"), Aws::Crt::ByteCursorFromCString("secret"),
Aws::Crt::ByteCursorFromCString("token"), static_cast<uint64_t>(expiration)));

MockedCredsProvider provider(underlying_mock);
const auto credentials = provider.GetAWSCredentials();

EXPECT_EQ(credentials.GetExpiration().Seconds(), expiration);
EXPECT_FALSE(credentials.IsExpiredOrEmpty());
}

TEST_F(CrtCredentialsProviderTest, ShouldNotUseFreedStateWhenRefreshOutlivesTimeout) {
auto crtCreds = Aws::MakeShared<Aws::Crt::Auth::Credentials>(
CRT_CREDS_TEST_LOG, Aws::Crt::ByteCursorFromCString("access"), Aws::Crt::ByteCursorFromCString("secret"),
Expand Down