Skip to content

Commit de25252

Browse files
authored
Delegate CRT credentials (#2020)
1 parent 48933b0 commit de25252

File tree

4 files changed

+64
-64
lines changed

4 files changed

+64
-64
lines changed

aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtClient.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5178,7 +5178,7 @@ namespace Aws
51785178
Aws::Client::StreamOutcome GenerateStreamOutcome(const std::shared_ptr<Http::HttpResponse>& response) const;
51795179

51805180
private:
5181-
void init(const S3Crt::ClientConfiguration& clientConfiguration, const Aws::Auth::AWSCredentials* credentials = nullptr);
5181+
void init(const S3Crt::ClientConfiguration& clientConfiguration, const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> credentialsProvider);
51825182

51835183
struct CrtClientShutdownCallbackDataWrapper {
51845184
void *data;
@@ -5305,6 +5305,8 @@ namespace Aws
53055305
struct CrtClientShutdownCallbackDataWrapper m_wrappedData;
53065306
std::shared_ptr<Aws::Utils::Threading::Semaphore> m_clientShutdownSem;
53075307
Aws::String m_userAgent;
5308+
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> m_credProvider;
5309+
std::shared_ptr<Aws::Crt::Auth::ICredentialsProvider> m_crtCredProvider;
53085310
bool m_useVirtualAddressing;
53095311
bool m_useDualStack;
53105312
bool m_useArnRegion;

aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -143,22 +143,22 @@ static const char* ALLOCATION_TAG = "S3CrtClient";
143143

144144
S3CrtClient::S3CrtClient(const S3Crt::ClientConfiguration& clientConfiguration, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy signPayloads, bool useVirtualAddressing, Aws::S3Crt::US_EAST_1_REGIONAL_ENDPOINT_OPTION USEast1RegionalEndPointOption) :
145145
BASECLASS(clientConfiguration,
146-
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG),
146+
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, m_credProvider,
147147
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false),
148148
Aws::MakeShared<S3CrtErrorMarshaller>(ALLOCATION_TAG)),
149-
m_executor(clientConfiguration.executor), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
149+
m_executor(clientConfiguration.executor), m_credProvider(Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG)), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
150150
{
151-
init(clientConfiguration);
151+
init(clientConfiguration, m_credProvider);
152152
}
153153

154154
S3CrtClient::S3CrtClient(const AWSCredentials& credentials, const S3Crt::ClientConfiguration& clientConfiguration, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy signPayloads, bool useVirtualAddressing, Aws::S3Crt::US_EAST_1_REGIONAL_ENDPOINT_OPTION USEast1RegionalEndPointOption) :
155155
BASECLASS(clientConfiguration,
156-
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials),
156+
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, m_credProvider,
157157
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false),
158158
Aws::MakeShared<S3CrtErrorMarshaller>(ALLOCATION_TAG)),
159-
m_executor(clientConfiguration.executor), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
159+
m_executor(clientConfiguration.executor), m_credProvider(Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials)), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
160160
{
161-
init(clientConfiguration, &credentials);
161+
init(clientConfiguration, m_credProvider);
162162
}
163163

164164
S3CrtClient::S3CrtClient(const std::shared_ptr<AWSCredentialsProvider>& credentialsProvider,
@@ -167,10 +167,9 @@ S3CrtClient::S3CrtClient(const std::shared_ptr<AWSCredentialsProvider>& credenti
167167
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, credentialsProvider,
168168
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false),
169169
Aws::MakeShared<S3CrtErrorMarshaller>(ALLOCATION_TAG)),
170-
m_executor(clientConfiguration.executor), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
170+
m_executor(clientConfiguration.executor), m_credProvider(credentialsProvider), m_useVirtualAddressing(useVirtualAddressing), m_USEast1RegionalEndpointOption(USEast1RegionalEndPointOption)
171171
{
172-
Aws::Auth::AWSCredentials credentials = credentialsProvider->GetAWSCredentials();
173-
init(clientConfiguration, &credentials);
172+
init(clientConfiguration, m_credProvider);
174173
}
175174

176175
S3CrtClient::~S3CrtClient()
@@ -179,7 +178,7 @@ S3CrtClient::~S3CrtClient()
179178
m_clientShutdownSem->WaitOne(); // Wait aws_s3_client shutdown
180179
}
181180

182-
void S3CrtClient::init(const S3Crt::ClientConfiguration& config, const Aws::Auth::AWSCredentials* credentials)
181+
void S3CrtClient::init(const S3Crt::ClientConfiguration& config, const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> credentialsProvider)
183182
{
184183
SetServiceClientName("S3");
185184
LoadS3CrtSpecificConfig(config.profileName);
@@ -205,23 +204,18 @@ void S3CrtClient::init(const S3Crt::ClientConfiguration& config, const Aws::Auth
205204
Aws::Crt::Io::ClientBootstrap* clientBootstrap = config.clientBootstrap ? config.clientBootstrap.get() : Aws::GetDefaultClientBootstrap();
206205
s3CrtConfig.client_bootstrap = clientBootstrap->GetUnderlyingHandle();
207206

208-
std::shared_ptr<Aws::Crt::Auth::ICredentialsProvider> provider(nullptr);
209-
if (credentials)
210-
{
211-
Aws::Crt::Auth::CredentialsProviderStaticConfig staticCreds;
212-
staticCreds.AccessKeyId = Aws::Crt::ByteCursorFromCString(credentials->GetAWSAccessKeyId().c_str());
213-
staticCreds.SecretAccessKey = Aws::Crt::ByteCursorFromCString(credentials->GetAWSSecretKey().c_str());
214-
staticCreds.SessionToken = Aws::Crt::ByteCursorFromCString(credentials->GetSessionToken().c_str());
215-
provider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderStatic(staticCreds);
216-
}
217-
else
218-
{
219-
Aws::Crt::Auth::CredentialsProviderChainDefaultConfig credsConfig;
220-
credsConfig.Bootstrap = clientBootstrap;
221-
provider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderChainDefault(credsConfig);
222-
}
223-
224-
aws_s3_init_default_signing_config(&m_s3CrtSigningConfig, Aws::Crt::ByteCursorFromCString(config.region.c_str()), provider->GetUnderlyingHandle());
207+
m_crtCredProvider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderDelegate({
208+
std::bind([](const std::shared_ptr<AWSCredentialsProvider>& provider) {
209+
AWSCredentials credentials = provider->GetAWSCredentials();
210+
return Aws::MakeShared<Aws::Crt::Auth::Credentials>(ALLOCATION_TAG,
211+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetAWSAccessKeyId().c_str())),
212+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetAWSSecretKey().c_str())),
213+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetSessionToken().c_str())),
214+
credentials.GetExpiration().Millis());
215+
}, credentialsProvider)
216+
});
217+
218+
aws_s3_init_default_signing_config(&m_s3CrtSigningConfig, Aws::Crt::ByteCursorFromCString(config.region.c_str()), m_crtCredProvider->GetUnderlyingHandle());
225219
m_s3CrtSigningConfig.flags.use_double_uri_encode = false;
226220
s3CrtConfig.signing_config = &m_s3CrtSigningConfig;
227221

code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceClientSourceInit.vm

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,22 @@
3434
#end
3535
#if($serviceNamespace == "S3Crt")
3636
#set($clientConfigurationNamespace = $serviceNamespace)
37-
#set($credentialsParam = ", &credentials")
38-
#set($getAWSCredentials = "Aws::Auth::AWSCredentials credentials = credentialsProvider->GetAWSCredentials();
39-
")
40-
#set($credentialsArg = ", const Aws::Auth::AWSCredentials* credentials")
37+
#set($credentialsParam = ", m_credProvider")
38+
#set($credentialsArg = ", const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> credentialsProvider")
39+
#set($defaultCredentialsProviderChainParam = "m_credProvider")
40+
#set($defaultCredentialsProviderChainMember = ", m_credProvider(Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG))")
41+
#set($simpleCredentialsProviderParam = "m_credProvider")
42+
#set($simpleCredentialsProviderMember = ", m_credProvider(Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials))")
43+
#set($credentialsProviderMember = ", m_credProvider(credentialsProvider)")
4144
#else
4245
#set($clientConfigurationNamespace = "Client")
4346
#set($credentialsParam = "")
44-
#set($getAWSCredentials = "")
4547
#set($credentialsArg = "")
48+
#set($defaultCredentialsProviderChainParam = "Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG)")
49+
#set($defaultCredentialsProviderChainMember = "")
50+
#set($simpleCredentialsProviderParam = "Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials)")
51+
#set($simpleCredentialsProviderMember = "")
52+
#set($credentialsProviderMember = "")
4653
#end
4754
#set($hasEventStreamInputOperation = false)
4855
#foreach($operation in $serviceModel.operations)
@@ -54,20 +61,20 @@
5461
#if($hasEventStreamInputOperation || $multiRegionAccessPointSupported)
5562
${className}::${className}(const ${clientConfigurationNamespace}::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
5663
BASECLASS(clientConfiguration,
57-
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG),
64+
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, ${defaultCredentialsProviderChainParam},
5865
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
5966
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
60-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
67+
m_executor(clientConfiguration.executor)${defaultCredentialsProviderChainMember}${virtualAddressingInit}${USEast1RegionalEndpointInitString}
6168
{
62-
init(clientConfiguration);
69+
init(clientConfiguration${credentialsParam});
6370
}
6471

6572
${className}::${className}(const AWSCredentials& credentials, const ${clientConfigurationNamespace}::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
6673
BASECLASS(clientConfiguration,
67-
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials),
74+
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, ${simpleCredentialsProviderParam},
6875
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
6976
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
70-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
77+
m_executor(clientConfiguration.executor)${simpleCredentialsProviderMember}${virtualAddressingInit}${USEast1RegionalEndpointInitString}
7178
{
7279
init(clientConfiguration${credentialsParam});
7380
}
@@ -78,27 +85,27 @@ ${className}::${className}(const std::shared_ptr<AWSCredentialsProvider>& creden
7885
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, credentialsProvider,
7986
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
8087
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
81-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
88+
m_executor(clientConfiguration.executor)${credentialsProviderMember}${virtualAddressingInit}${USEast1RegionalEndpointInitString}
8289
{
83-
${getAWSCredentials}init(clientConfiguration${credentialsParam});
90+
init(clientConfiguration${credentialsParam});
8491
}
8592
#else
8693
${className}::${className}(const ${clientConfigurationNamespace}::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
8794
BASECLASS(clientConfiguration,
88-
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG),
95+
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, ${defaultCredentialsProviderChainParam},
8996
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
9097
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
91-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
98+
m_executor(clientConfiguration.executor)${defaultCredentialsProviderChainMember}${virtualAddressingInit}${USEast1RegionalEndpointInitString}
9299
{
93-
init(clientConfiguration);
100+
init(clientConfiguration${credentialsParam});
94101
}
95102

96103
${className}::${className}(const AWSCredentials& credentials, const ${clientConfigurationNamespace}::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
97104
BASECLASS(clientConfiguration,
98-
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials),
105+
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, ${simpleCredentialsProviderParam},
99106
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
100107
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
101-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
108+
m_executor(clientConfiguration.executor)${simpleCredentialsProviderMember}${virtualAddressingInit}${USEast1RegionalEndpointInitString}
102109
{
103110
init(clientConfiguration${credentialsParam});
104111
}
@@ -109,9 +116,9 @@ ${className}::${className}(const std::shared_ptr<AWSCredentialsProvider>& creden
109116
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, credentialsProvider,
110117
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
111118
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
112-
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
119+
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}${credentialsProviderMember}
113120
{
114-
${getAWSCredentials}init(clientConfiguration${credentialsParam});
121+
init(clientConfiguration${credentialsParam});
115122
}
116123
#end
117124

@@ -191,23 +198,18 @@ void ${className}::init(const ${clientConfigurationNamespace}::ClientConfigurati
191198
Aws::Crt::Io::ClientBootstrap* clientBootstrap = config.clientBootstrap ? config.clientBootstrap.get() : Aws::GetDefaultClientBootstrap();
192199
s3CrtConfig.client_bootstrap = clientBootstrap->GetUnderlyingHandle();
193200

194-
std::shared_ptr<Aws::Crt::Auth::ICredentialsProvider> provider(nullptr);
195-
if (credentials)
196-
{
197-
Aws::Crt::Auth::CredentialsProviderStaticConfig staticCreds;
198-
staticCreds.AccessKeyId = Aws::Crt::ByteCursorFromCString(credentials->GetAWSAccessKeyId().c_str());
199-
staticCreds.SecretAccessKey = Aws::Crt::ByteCursorFromCString(credentials->GetAWSSecretKey().c_str());
200-
staticCreds.SessionToken = Aws::Crt::ByteCursorFromCString(credentials->GetSessionToken().c_str());
201-
provider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderStatic(staticCreds);
202-
}
203-
else
204-
{
205-
Aws::Crt::Auth::CredentialsProviderChainDefaultConfig credsConfig;
206-
credsConfig.Bootstrap = clientBootstrap;
207-
provider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderChainDefault(credsConfig);
208-
}
201+
m_crtCredProvider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderDelegate({
202+
std::bind([](const std::shared_ptr<AWSCredentialsProvider>& provider) {
203+
AWSCredentials credentials = provider->GetAWSCredentials();
204+
return Aws::MakeShared<Aws::Crt::Auth::Credentials>(ALLOCATION_TAG,
205+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetAWSAccessKeyId().c_str())),
206+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetAWSSecretKey().c_str())),
207+
*Aws::MakeShared<Aws::Crt::ByteCursor>(ALLOCATION_TAG, Aws::Crt::ByteCursorFromCString(credentials.GetSessionToken().c_str())),
208+
credentials.GetExpiration().Millis());
209+
}, credentialsProvider)
210+
});
209211

210-
aws_s3_init_default_signing_config(&m_s3CrtSigningConfig, Aws::Crt::ByteCursorFromCString(config.region.c_str()), provider->GetUnderlyingHandle());
212+
aws_s3_init_default_signing_config(&m_s3CrtSigningConfig, Aws::Crt::ByteCursorFromCString(config.region.c_str()), m_crtCredProvider->GetUnderlyingHandle());
211213
m_s3CrtSigningConfig.flags.use_double_uri_encode = false;
212214
s3CrtConfig.signing_config = &m_s3CrtSigningConfig;
213215

code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ namespace Aws
197197
#end
198198
private:
199199
#if($serviceNamespace == "S3Crt")
200-
void init(const S3Crt::ClientConfiguration& clientConfiguration, const Aws::Auth::AWSCredentials* credentials = nullptr);
200+
void init(const S3Crt::ClientConfiguration& clientConfiguration, const std::shared_ptr<Aws::Auth::AWSCredentialsProvider> credentialsProvider);
201201

202202
struct CrtClientShutdownCallbackDataWrapper {
203203
void *data;
@@ -236,6 +236,8 @@ namespace Aws
236236
struct CrtClientShutdownCallbackDataWrapper m_wrappedData;
237237
std::shared_ptr<Aws::Utils::Threading::Semaphore> m_clientShutdownSem;
238238
Aws::String m_userAgent;
239+
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> m_credProvider;
240+
std::shared_ptr<Aws::Crt::Auth::ICredentialsProvider> m_crtCredProvider;
239241
#end
240242
bool m_useVirtualAddressing;
241243
bool m_useDualStack;

0 commit comments

Comments
 (0)