Skip to content
Merged
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
6 changes: 6 additions & 0 deletions .changelog/bugfix-pr3922.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "aws-cpp-sdk-core",
"contributor": "",
"description": "Fixed bug where non-expiry would fail to return true on IsExpired"
}
1 change: 1 addition & 0 deletions src/aws-cpp-sdk-core/include/aws/core/utils/DateTime.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ namespace Aws

/**
* Initializes time point to epoch time in seconds
* Values beyond the system clock's range are clamped to its maximum time point.
*/
DateTime(uint64_t secondsSinceEpoch);

Expand Down
4 changes: 2 additions & 2 deletions src/aws-cpp-sdk-core/source/auth/CrtCredentialsProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ 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();
credentials.SetExpiration(DateTime{expiration});
const auto sessionTokenCursor = crtCredentials.GetSessionToken();
credentials.SetSessionToken({reinterpret_cast<char*>(sessionTokenCursor.ptr), sessionTokenCursor.len});
return credentials;
Expand Down
13 changes: 11 additions & 2 deletions src/aws-cpp-sdk-core/source/utils/DateTimeCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1142,8 +1142,17 @@ DateTime::DateTime(double secondsSinceEpoch) : m_valid(true)

DateTime::DateTime(uint64_t secondsSinceEpoch) : m_valid(true)
{
std::chrono::duration<uint64_t, std::chrono::seconds::period> timestamp(secondsSinceEpoch);
m_time = std::chrono::system_clock::time_point(timestamp);
const auto maxTime = (std::chrono::system_clock::time_point::max)();
const auto maxSeconds = std::chrono::duration_cast<std::chrono::seconds>(maxTime.time_since_epoch()).count();

if (secondsSinceEpoch > static_cast<uint64_t>(maxSeconds))
{
m_time = maxTime;
}
else
{
m_time = std::chrono::system_clock::time_point(std::chrono::seconds(static_cast<std::chrono::seconds::rep>(secondsSinceEpoch)));
}
}

DateTime::DateTime(const Aws::String& timestamp, DateFormat format) : m_valid(true)
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
Loading