Skip to content

Commit 1d57672

Browse files
committed
Updated to use a new context class
1 parent 0bae7f6 commit 1d57672

File tree

6 files changed

+57
-40
lines changed

6 files changed

+57
-40
lines changed

src/aws-cpp-sdk-core/include/aws/core/auth/AWSCredentialsProvider.h

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <aws/core/auth/AWSCredentials.h>
1919
#include <aws/core/config/AWSProfileConfigLoader.h>
2020
#include <aws/core/client/RetryStrategy.h>
21+
#include <aws/core/client/UserAgent.h>
22+
#include <aws/core/utils/memory/stl/AWSSet.h>
2123
#include <memory>
2224

2325
namespace Aws
@@ -30,6 +32,37 @@ namespace Aws
3032
}
3133
namespace Auth
3234
{
35+
/**
36+
* Context class for credential resolution that tracks features used during credential retrieval.
37+
*/
38+
class AWS_CORE_API CredentialsResolutionContext
39+
{
40+
public:
41+
// Default constructor - no features tracked
42+
CredentialsResolutionContext() = default;
43+
44+
explicit CredentialsResolutionContext(Aws::Set<Aws::Client::UserAgentFeature> features)
45+
: m_features(std::move(features)) {}
46+
47+
/**
48+
* Add a user agent feature to track credential usage.
49+
*/
50+
void AddUserAgentFeature(Aws::Client::UserAgentFeature feature)
51+
{
52+
m_features.insert(feature);
53+
}
54+
55+
/**
56+
* Get all tracked credential features.
57+
*/
58+
const Aws::Set<Aws::Client::UserAgentFeature>& GetUserAgentFeatures() const
59+
{
60+
return m_features;
61+
}
62+
63+
private:
64+
Aws::Set<Aws::Client::UserAgentFeature> m_features;
65+
};
3366
constexpr int REFRESH_THRESHOLD = 1000 * 60 * 5;
3467

3568
constexpr int AWS_CREDENTIAL_PROVIDER_EXPIRATION_GRACE_PERIOD = 5 * 1000;
@@ -76,10 +109,10 @@ namespace Aws
76109
virtual AWSCredentials GetAWSCredentials() = 0;
77110

78111
/**
79-
* Interface that allows providers to modify the request during credential retrieval.
112+
* Interface that allows providers to populate context during credential retrieval.
80113
*/
81-
virtual AWSCredentials GetAWSCredentials(Aws::AmazonWebServiceRequest& request) {
82-
AWS_UNREFERENCED_PARAM(request);
114+
virtual AWSCredentials GetAWSCredentials(CredentialsResolutionContext& context) {
115+
AWS_UNREFERENCED_PARAM(context);
83116
return GetAWSCredentials();
84117
}
85118

@@ -156,9 +189,9 @@ namespace Aws
156189
AWSCredentials GetAWSCredentials() override;
157190

158191
/**
159-
* New interface that adds environment credential tracking to the request.
192+
* Context-based interface that adds environment credential tracking.
160193
*/
161-
AWSCredentials GetAWSCredentials(Aws::AmazonWebServiceRequest& request) override;
194+
AWSCredentials GetAWSCredentials(CredentialsResolutionContext& context) override;
162195
};
163196

164197
/**

src/aws-cpp-sdk-core/include/aws/core/auth/AWSCredentialsProviderChain.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ namespace Aws
3232
/**
3333
* When a credentials provider in the chain returns empty credentials,
3434
* We go on to the next provider until we have either exhausted the installed providers in the chain or something returns non-empty credentials.
35-
* This overload passes the request to providers for user agent feature tracking.
35+
* This overload populates the context with credential tracking information.
3636
*/
37-
virtual AWSCredentials GetAWSCredentials(Aws::AmazonWebServiceRequest& request);
37+
virtual AWSCredentials GetAWSCredentials(CredentialsResolutionContext& context);
3838

3939
/**
4040
* Gets all providers stored in this chain.

src/aws-cpp-sdk-core/include/aws/core/auth/signer/AWSAuthV4Signer.h

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ namespace smithy
2727

2828
namespace Aws
2929
{
30-
class AmazonWebServiceRequest;
31-
3230
namespace Http
3331
{
3432
class HttpRequest;
@@ -38,6 +36,7 @@ namespace Aws
3836
{
3937
class AWSCredentials;
4038
class AWSCredentialsProvider;
39+
class CredentialsResolutionContext;
4140

4241
enum class AWSSigningAlgorithm
4342
{
@@ -143,14 +142,6 @@ namespace Aws
143142
* Using m_region by default if parameter region is nullptr.
144143
*/
145144
bool SignRequest(Aws::Http::HttpRequest& request, const char* region, const char* serviceName, bool signBody) const override;
146-
147-
/**
148-
* Uses AWS Auth V4 signing method with SHA256 HMAC algorithm. If signBody is false
149-
* and https is being used then the body of the payload will not be signed.
150-
* This overload passes the AWS request to the credentials provider for user agent feature tracking.
151-
*/
152-
bool SignRequest(Aws::Http::HttpRequest& request, Aws::AmazonWebServiceRequest& awsRequest, const char* region, const char* serviceName, bool signBody) const override;
153-
154145
/**
155146
* Takes a request and signs the URI based on the HttpMethod, URI and other info from the request.
156147
* the region the signer was initialized with will be used for the signature.
@@ -192,7 +183,7 @@ namespace Aws
192183

193184
virtual Aws::Auth::AWSCredentials GetCredentials(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const;
194185

195-
virtual Aws::Auth::AWSCredentials GetCredentials(Aws::AmazonWebServiceRequest& awsRequest, const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const;
186+
virtual Aws::Auth::AWSCredentials GetCredentials(Aws::Auth::CredentialsResolutionContext& context, const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const;
196187

197188
Aws::String GetServiceName() const { return m_serviceName; }
198189
Aws::String GetRegion() const { return m_region; }
@@ -202,7 +193,7 @@ namespace Aws
202193

203194
protected:
204195
virtual bool ServiceRequireUnsignedPayload(const Aws::String& serviceName) const;
205-
void UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpRequest& request, const Aws::AmazonWebServiceRequest& awsRequest) const;
196+
void UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpRequest& request, const Aws::Auth::CredentialsResolutionContext& context) const;
206197
bool m_includeSha256HashHeader;
207198

208199
private:

src/aws-cpp-sdk-core/source/auth/AWSCredentialsProvider.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@ AWSCredentials EnvironmentAWSCredentialsProvider::GetAWSCredentials()
108108
return credentials;
109109
}
110110

111-
AWSCredentials EnvironmentAWSCredentialsProvider::GetAWSCredentials(Aws::AmazonWebServiceRequest& request)
111+
AWSCredentials EnvironmentAWSCredentialsProvider::GetAWSCredentials(CredentialsResolutionContext& context)
112112
{
113113
AWSCredentials credentials = GetAWSCredentials();
114114
if (!credentials.IsEmpty()) {
115-
request.AddUserAgentFeature(Aws::Client::UserAgentFeature::CREDENTIALS_ENV_VARS);
115+
context.AddUserAgentFeature(Aws::Client::UserAgentFeature::CREDENTIALS_ENV_VARS);
116116
}
117117
return credentials;
118118
}

src/aws-cpp-sdk-core/source/auth/AWSCredentialsProviderChain.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ AWSCredentials AWSCredentialsProviderChain::GetAWSCredentials()
4141
return AWSCredentials();
4242
}
4343

44-
AWSCredentials AWSCredentialsProviderChain::GetAWSCredentials(Aws::AmazonWebServiceRequest& request)
44+
AWSCredentials AWSCredentialsProviderChain::GetAWSCredentials(CredentialsResolutionContext& context)
4545
{
4646
ReaderLockGuard lock(m_cachedProviderLock);
4747
if (m_cachedProvider) {
48-
AWSCredentials credentials = m_cachedProvider->GetAWSCredentials(request);
48+
AWSCredentials credentials = m_cachedProvider->GetAWSCredentials(context);
4949
if (!credentials.GetAWSAccessKeyId().empty() && !credentials.GetAWSSecretKey().empty())
5050
{
5151
return credentials;
@@ -54,7 +54,7 @@ AWSCredentials AWSCredentialsProviderChain::GetAWSCredentials(Aws::AmazonWebServ
5454
lock.UpgradeToWriterLock();
5555
for (auto&& credentialsProvider : m_providerChain)
5656
{
57-
AWSCredentials credentials = credentialsProvider->GetAWSCredentials(request);
57+
AWSCredentials credentials = credentialsProvider->GetAWSCredentials(context);
5858
if (!credentials.GetAWSAccessKeyId().empty() && !credentials.GetAWSSecretKey().empty())
5959
{
6060
m_cachedProvider = credentialsProvider;

src/aws-cpp-sdk-core/source/auth/signer/AWSAuthV4Signer.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include <aws/core/auth/signer/AWSAuthSignerCommon.h>
88
#include <aws/core/auth/signer/AWSAuthSignerHelper.h>
99

10-
#include <aws/core/AmazonWebServiceRequest.h>
1110
#include <aws/core/auth/AWSCredentialsProvider.h>
1211
#include <aws/core/client/UserAgent.h>
1312
#include <aws/core/http/HttpRequest.h>
@@ -27,7 +26,6 @@
2726

2827
#include <iomanip>
2928
#include <cstring>
30-
#include <map>
3129

3230
using namespace Aws;
3331
using namespace Aws::Client;
@@ -338,16 +336,11 @@ bool AWSAuthV4Signer::SignRequestWithCreds(Aws::Http::HttpRequest& request, cons
338336

339337
bool AWSAuthV4Signer::SignRequest(Aws::Http::HttpRequest& request, const char* region, const char* serviceName, bool signBody) const
340338
{
341-
AWSCredentials credentials = GetCredentials(request.GetServiceSpecificParameters());
342-
return SignRequestWithCreds(request, credentials, region, serviceName, signBody);
343-
}
344-
345-
bool AWSAuthV4Signer::SignRequest(Aws::Http::HttpRequest& request, Aws::AmazonWebServiceRequest& awsRequest, const char* region, const char* serviceName, bool signBody) const
346-
{
347-
AWSCredentials credentials = GetCredentials(awsRequest, request.GetServiceSpecificParameters());
339+
Aws::Auth::CredentialsResolutionContext context;
340+
AWSCredentials credentials = GetCredentials(context, request.GetServiceSpecificParameters());
348341

349-
// Update User-Agent with credential tracking features added during credential resolution
350-
UpdateUserAgentWithCredentialFeatures(request, awsRequest);
342+
// Update User-Agent with credential tracking features from context
343+
UpdateUserAgentWithCredentialFeatures(request, context);
351344

352345
return SignRequestWithCreds(request, credentials, region, serviceName, signBody);
353346
}
@@ -609,17 +602,17 @@ Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials(const std::shared_ptr<
609602
return m_credentialsProvider->GetAWSCredentials();
610603
}
611604

612-
Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials(Aws::AmazonWebServiceRequest& awsRequest, const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const {
605+
Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials(Aws::Auth::CredentialsResolutionContext& context, const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const {
613606
AWS_UNREFERENCED_PARAM(serviceSpecificParameters);
614-
return m_credentialsProvider->GetAWSCredentials(awsRequest);
607+
return m_credentialsProvider->GetAWSCredentials(context);
615608
}
616609

617-
void AWSAuthV4Signer::UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpRequest& request, const Aws::AmazonWebServiceRequest& awsRequest) const {
610+
void AWSAuthV4Signer::UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpRequest& request, const Aws::Auth::CredentialsResolutionContext& context) const {
618611
if (!request.HasHeader(USER_AGENT)) {
619612
return;
620613
}
621614

622-
const auto& features = awsRequest.GetUserAgentFeatures();
615+
const auto& features = context.GetUserAgentFeatures();
623616
if (features.empty()) {
624617
return;
625618
}
@@ -682,4 +675,4 @@ void AWSAuthV4Signer::UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpReque
682675
}
683676

684677
request.SetUserAgent(updatedUA.str());
685-
}
678+
}

0 commit comments

Comments
 (0)