Skip to content

Commit 40732db

Browse files
committed
Backward compatibility for S3 express endpoint provider
1 parent abd92a8 commit 40732db

File tree

10 files changed

+625
-79
lines changed

10 files changed

+625
-79
lines changed

generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientConfiguration.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ namespace Aws
5858
bool useArnRegion = false;
5959
Client::AWSAuthV4Signer::PayloadSigningPolicy payloadSigningPolicy = Client::AWSAuthV4Signer::PayloadSigningPolicy::RequestDependent;
6060
bool disableS3ExpressAuth = false;
61-
using IdentityProviderSupplier = std::function<std::shared_ptr<S3ExpressIdentityProvider> (const S3Client &)>;
62-
IdentityProviderSupplier identityProviderSupplier = [](const S3Client &client) -> std::shared_ptr<S3ExpressIdentityProvider> {
63-
return Aws::MakeShared<DefaultS3ExpressIdentityProvider>("S3ClientConfiguration", client);
61+
using IdentityProviderSupplier = std::function<std::shared_ptr<SmithyS3ExpressIdentityProvider> (const S3Client &)>;
62+
IdentityProviderSupplier identityProviderSupplier = [](const S3Client &client) -> std::shared_ptr<SmithyS3ExpressIdentityProvider> {
63+
return Aws::MakeShared<SmithyDefaultS3ExpressIdentityProvider>("S3ClientConfiguration", client);
6464
};
6565
private:
6666
void LoadS3SpecificConfig(const Aws::String& profileName);

generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ExpressIdentityProvider.h

Lines changed: 86 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@ namespace Aws {
2121

2222
namespace S3 {
2323
class S3Client;
24-
class S3ExpressIdentityProvider : public smithy::IdentityResolverBase<smithy::AwsCredentialIdentityBase> {
24+
class S3ExpressIdentityProvider : public smithy::IdentityResolverBase<S3ExpressIdentity> {
2525
public:
2626
explicit S3ExpressIdentityProvider(const S3Client& s3Client);
2727
ResolveIdentityFutureOutcome getIdentity(
2828
const IdentityProperties& identityProperties,
2929
const AdditionalParameters& additionalParameters) override;
30-
S3ExpressIdentity
31-
GetS3ExpressIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters);
30+
31+
virtual S3ExpressIdentity
32+
GetS3ExpressIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) = 0;
3233

3334
protected:
3435

35-
virtual smithy::AwsCredentialIdentity GetS3ExpressAwsIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) = 0;
36-
smithy::AwsCredentialIdentity GetCredentialsFromBucket(const Aws::String& bucketName) const;
36+
S3ExpressIdentity GetCredentialsFromBucket(const Aws::String& bucketName) const;
3737

3838
private:
3939
const Aws::S3::S3Client& m_s3Client;
@@ -44,25 +44,24 @@ namespace Aws {
4444
std::shared_ptr<std::mutex> GetMutexForBucketName(const Aws::String& bucketName);
4545
};
4646

47+
4748
class DefaultS3ExpressIdentityProvider : public S3ExpressIdentityProvider {
4849
public:
4950
explicit DefaultS3ExpressIdentityProvider(const S3Client& s3Client);
5051
explicit DefaultS3ExpressIdentityProvider(
5152
const S3Client& s3Client,
52-
std::shared_ptr<Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> credentialsCache);
53+
std::shared_ptr<Utils::ConcurrentCache<Aws::String, S3ExpressIdentity>> credentialsCache);
5354
DefaultS3ExpressIdentityProvider(const DefaultS3ExpressIdentityProvider& other) = delete;
5455
DefaultS3ExpressIdentityProvider(DefaultS3ExpressIdentityProvider&& other) noexcept = delete;
5556
DefaultS3ExpressIdentityProvider& operator=(const DefaultS3ExpressIdentityProvider& other) = delete;
5657
DefaultS3ExpressIdentityProvider& operator=(DefaultS3ExpressIdentityProvider&& other) noexcept = delete;
5758
virtual ~DefaultS3ExpressIdentityProvider() override = default;
58-
59-
protected:
60-
smithy::AwsCredentialIdentity GetS3ExpressAwsIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) override;
59+
S3ExpressIdentity GetS3ExpressIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) override;
6160

6261
private:
63-
mutable std::shared_ptr<Aws::Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> m_credentialsCache;
62+
mutable std::shared_ptr<Aws::Utils::ConcurrentCache<Aws::String, S3ExpressIdentity>> m_credentialsCache;
6463
};
65-
64+
6665
class DefaultAsyncS3ExpressIdentityProvider : public S3ExpressIdentityProvider {
6766
public:
6867
explicit DefaultAsyncS3ExpressIdentityProvider(
@@ -71,7 +70,7 @@ namespace Aws {
7170

7271
explicit DefaultAsyncS3ExpressIdentityProvider(
7372
const S3Client& s3Client,
74-
std::shared_ptr<Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> credentialsCache,
73+
std::shared_ptr<Utils::ConcurrentCache<Aws::String, S3ExpressIdentity>> credentialsCache,
7574
std::chrono::minutes refreshPeriod = std::chrono::minutes(1));
7675

7776
DefaultAsyncS3ExpressIdentityProvider(const DefaultAsyncS3ExpressIdentityProvider& other) = delete;
@@ -80,6 +79,81 @@ namespace Aws {
8079
const DefaultAsyncS3ExpressIdentityProvider& other) = delete;
8180
DefaultAsyncS3ExpressIdentityProvider& operator=(DefaultAsyncS3ExpressIdentityProvider&& other) noexcept = delete;
8281
virtual ~DefaultAsyncS3ExpressIdentityProvider() override;
82+
S3ExpressIdentity GetS3ExpressIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) override;
83+
84+
private:
85+
void refreshIdentities(std::chrono::minutes refreshPeriod);
86+
void threadSafeKeyInsert(const Aws::String& key);
87+
bool threadSafeKeyHas(const Aws::String& key);
88+
void threadSafeKeyEmpty();
89+
90+
mutable std::shared_ptr<Aws::Utils::ConcurrentCache<Aws::String, S3ExpressIdentity>> m_credentialsCache;
91+
Aws::Set<Aws::String> m_keysUsed;
92+
mutable std::mutex m_keysUsedMutex;
93+
mutable bool m_shouldStopBackgroundRefresh;
94+
Aws::UniquePtr<std::thread> m_backgroundRefreshThread;
95+
mutable std::mutex m_shutDownMutex;
96+
mutable std::condition_variable m_shutdownCondition;
97+
};
98+
99+
/*------ Smithy version -----*/
100+
class SmithyS3ExpressIdentityProvider : public smithy::IdentityResolverBase<smithy::AwsCredentialIdentityBase> {
101+
public:
102+
explicit SmithyS3ExpressIdentityProvider(const S3Client& s3Client);
103+
ResolveIdentityFutureOutcome getIdentity(
104+
const IdentityProperties& identityProperties,
105+
const AdditionalParameters& additionalParameters) override;
106+
107+
protected:
108+
109+
virtual smithy::AwsCredentialIdentity GetS3ExpressAwsIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) = 0;
110+
smithy::AwsCredentialIdentity GetCredentialsFromBucket(const Aws::String& bucketName) const;
111+
112+
private:
113+
const Aws::S3::S3Client& m_s3Client;
114+
mutable std::mutex m_bucketNameMapMutex;
115+
Aws::Map<Aws::String, std::shared_ptr<std::mutex>> m_bucketNameMutex;
116+
117+
protected:
118+
std::shared_ptr<std::mutex> GetMutexForBucketName(const Aws::String& bucketName);
119+
};
120+
121+
class SmithyDefaultS3ExpressIdentityProvider : public SmithyS3ExpressIdentityProvider {
122+
public:
123+
explicit SmithyDefaultS3ExpressIdentityProvider(const S3Client& s3Client);
124+
explicit SmithyDefaultS3ExpressIdentityProvider(
125+
const S3Client& s3Client,
126+
std::shared_ptr<Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> credentialsCache);
127+
SmithyDefaultS3ExpressIdentityProvider(const SmithyDefaultS3ExpressIdentityProvider& other) = delete;
128+
SmithyDefaultS3ExpressIdentityProvider(SmithyDefaultS3ExpressIdentityProvider&& other) noexcept = delete;
129+
SmithyDefaultS3ExpressIdentityProvider& operator=(const SmithyDefaultS3ExpressIdentityProvider& other) = delete;
130+
SmithyDefaultS3ExpressIdentityProvider& operator=(SmithyDefaultS3ExpressIdentityProvider&& other) noexcept = delete;
131+
virtual ~SmithyDefaultS3ExpressIdentityProvider() override = default;
132+
133+
protected:
134+
smithy::AwsCredentialIdentity GetS3ExpressAwsIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) override;
135+
136+
private:
137+
mutable std::shared_ptr<Aws::Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> m_credentialsCache;
138+
};
139+
140+
class SmithyDefaultAsyncS3ExpressIdentityProvider : public SmithyS3ExpressIdentityProvider {
141+
public:
142+
explicit SmithyDefaultAsyncS3ExpressIdentityProvider(
143+
const S3Client& s3Client,
144+
std::chrono::minutes refreshPeriod = std::chrono::minutes(1));
145+
146+
explicit SmithyDefaultAsyncS3ExpressIdentityProvider(
147+
const S3Client& s3Client,
148+
std::shared_ptr<Utils::ConcurrentCache<Aws::String, smithy::AwsCredentialIdentity>> credentialsCache,
149+
std::chrono::minutes refreshPeriod = std::chrono::minutes(1));
150+
151+
SmithyDefaultAsyncS3ExpressIdentityProvider(const SmithyDefaultAsyncS3ExpressIdentityProvider& other) = delete;
152+
SmithyDefaultAsyncS3ExpressIdentityProvider(SmithyDefaultAsyncS3ExpressIdentityProvider&& other) noexcept = delete;
153+
SmithyDefaultAsyncS3ExpressIdentityProvider& operator=(
154+
const SmithyDefaultAsyncS3ExpressIdentityProvider& other) = delete;
155+
SmithyDefaultAsyncS3ExpressIdentityProvider& operator=(SmithyDefaultAsyncS3ExpressIdentityProvider&& other) noexcept = delete;
156+
virtual ~SmithyDefaultAsyncS3ExpressIdentityProvider() override;
83157
protected:
84158
smithy::AwsCredentialIdentity GetS3ExpressAwsIdentity(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) override;
85159

generated/src/aws-cpp-sdk-s3/source/S3Client.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ S3Client::S3Client(const Client::ClientConfiguration& clientConfiguration,
240240
auto credsResolver = Aws::MakeShared<smithy::DefaultAwsCredentialIdentityResolver>(ALLOCATION_TAG);
241241
return {
242242
{smithy::SigV4AuthSchemeOption::sigV4AuthSchemeOption.schemeId, smithy::SigV4AuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
243-
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<DefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
243+
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<SmithyDefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
244244
{smithy::SigV4aAuthSchemeOption::sigV4aAuthSchemeOption.schemeId, smithy::SigV4aAuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
245245
};
246246
}()
@@ -266,7 +266,7 @@ S3Client::S3Client(
266266
auto credsResolver = Aws::MakeShared<smithy::SimpleAwsCredentialIdentityResolver>(ALLOCATION_TAG, credentials );
267267
return {
268268
{smithy::SigV4AuthSchemeOption::sigV4AuthSchemeOption.schemeId, smithy::SigV4AuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
269-
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<DefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
269+
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<SmithyDefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
270270
{smithy::SigV4aAuthSchemeOption::sigV4aAuthSchemeOption.schemeId, smithy::SigV4aAuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
271271
};
272272
}()
@@ -292,7 +292,7 @@ S3Client::S3Client(
292292
auto credsResolver = Aws::MakeShared<smithy::AwsCredentialsProviderIdentityResolver>(ALLOCATION_TAG, credentialsProvider );
293293
return {
294294
{smithy::SigV4AuthSchemeOption::sigV4AuthSchemeOption.schemeId, smithy::SigV4AuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
295-
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<DefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
295+
{S3::S3ExpressSigV4AuthSchemeOption::s3ExpressSigV4AuthSchemeOption.schemeId, S3::S3ExpressSigV4AuthScheme{Aws::MakeShared<SmithyDefaultS3ExpressIdentityProvider>(ALLOCATION_TAG, *this), GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
296296
{smithy::SigV4aAuthSchemeOption::sigV4aAuthSchemeOption.schemeId, smithy::SigV4aAuthScheme{credsResolver, GetServiceName(), Aws::Region::ComputeSignerRegion(clientConfiguration.region), signPayloads, false}},
297297
};
298298
}()

0 commit comments

Comments
 (0)