31 #ifndef CPL_AWS_INCLUDED_H
32 #define CPL_AWS_INCLUDED_H
43 #include <curl/curl.h>
46 std::string CPLGetLowerCaseHexSHA256(
const void *pabyData,
size_t nBytes);
47 std::string CPLGetLowerCaseHexSHA256(
const std::string &osStr);
49 std::string CPLGetAWS_SIGN4_Timestamp(
GIntBig timestamp);
51 std::string CPLAWSURLEncode(
const std::string &osURL,
bool bEncodeSlash =
true);
53 std::string CPLAWSGetHeaderVal(
const struct curl_slist *psExistingHeaders,
56 std::string CPLGetAWS_SIGN4_Signature(
57 const std::string &osSecretAccessKey,
const std::string &osAccessToken,
58 const std::string &osRegion,
const std::string &osRequestPayer,
59 const std::string &osService,
const std::string &osVerb,
60 const struct curl_slist *psExistingHeaders,
const std::string &osHost,
61 const std::string &osCanonicalURI,
62 const std::string &osCanonicalQueryString,
63 const std::string &osXAMZContentSHA256,
bool bAddHeaderAMZContentSHA256,
64 const std::string &osTimestamp, std::string &osSignedHeaders);
66 std::string CPLGetAWS_SIGN4_Authorization(
67 const std::string &osSecretAccessKey,
const std::string &osAccessKeyId,
68 const std::string &osAccessToken,
const std::string &osRegion,
69 const std::string &osRequestPayer,
const std::string &osService,
70 const std::string &osVerb,
const struct curl_slist *psExistingHeaders,
71 const std::string &osHost,
const std::string &osCanonicalURI,
72 const std::string &osCanonicalQueryString,
73 const std::string &osXAMZContentSHA256,
bool bAddHeaderAMZContentSHA256,
74 const std::string &osTimestamp);
76 class IVSIS3LikeHandleHelper
81 std::map<std::string, std::string> m_oMapQueryParameters{};
83 virtual void RebuildURL() = 0;
84 std::string GetQueryString(
bool bAddEmptyValueAfterEqual)
const;
87 IVSIS3LikeHandleHelper() =
default;
88 virtual ~IVSIS3LikeHandleHelper() =
default;
90 void ResetQueryParameters();
91 void AddQueryParameter(
const std::string &osKey,
92 const std::string &osValue);
94 virtual struct curl_slist *
95 GetCurlHeaders(
const std::string &osVerb,
96 const struct curl_slist *psExistingHeaders,
97 const void *pabyDataContent =
nullptr,
98 size_t nBytesContent = 0)
const = 0;
100 virtual bool AllowAutomaticRedirection()
105 virtual bool CanRestartOnError(
const char *,
const char * ,
111 virtual const std::string &GetURL()
const = 0;
112 std::string GetURLNoKVP()
const;
114 virtual std::string GetCopySourceHeader()
const
116 return std::string();
119 virtual const char *GetMetadataDirectiveREPLACE()
const
124 static bool GetBucketAndObjectKey(
const char *pszURI,
125 const char *pszFSPrefix,
127 std::string &osBucketOut,
128 std::string &osObjectKeyOut);
130 static std::string BuildCanonicalizedHeaders(
131 std::map<std::string, std::string> &oSortedMapHeaders,
132 const struct curl_slist *psExistingHeaders,
133 const char *pszHeaderPrefix);
135 static std::string GetRFC822DateTime();
138 enum class AWSCredentialsSource
152 class VSIS3HandleHelper final :
public IVSIS3LikeHandleHelper
156 std::string m_osURL{};
157 mutable std::string m_osSecretAccessKey{};
158 mutable std::string m_osAccessKeyId{};
159 mutable std::string m_osSessionToken{};
160 std::string m_osEndpoint{};
161 std::string m_osRegion{};
162 std::string m_osRequestPayer{};
163 std::string m_osBucket{};
164 std::string m_osObjectKey{};
165 bool m_bUseHTTPS =
false;
166 bool m_bUseVirtualHosting =
false;
167 AWSCredentialsSource m_eCredentialsSource = AWSCredentialsSource::REGULAR;
169 void RebuildURL()
override;
171 static bool GetOrRefreshTemporaryCredentialsForRole(
172 bool bForceRefresh, std::string &osSecretAccessKey,
173 std::string &osAccessKeyId, std::string &osSessionToken,
174 std::string &osRegion);
176 static bool GetConfigurationFromAssumeRoleWithWebIdentity(
177 bool bForceRefresh,
const std::string &osPathForOption,
178 const std::string &osRoleArnIn,
179 const std::string &osWebIdentityTokenFileIn,
180 std::string &osSecretAccessKey, std::string &osAccessKeyId,
181 std::string &osSessionToken);
183 static bool GetConfigurationFromEC2(
bool bForceRefresh,
184 const std::string &osPathForOption,
185 std::string &osSecretAccessKey,
186 std::string &osAccessKeyId,
187 std::string &osSessionToken);
189 static bool GetConfigurationFromAWSConfigFiles(
190 const std::string &osPathForOption,
const char *pszProfile,
191 std::string &osSecretAccessKey, std::string &osAccessKeyId,
192 std::string &osSessionToken, std::string &osRegion,
193 std::string &osCredentials, std::string &osRoleArn,
194 std::string &osSourceProfile, std::string &osExternalId,
195 std::string &osMFASerial, std::string &osRoleSessionName,
196 std::string &osWebIdentityTokenFile);
198 static bool GetConfiguration(
const std::string &osPathForOption,
200 std::string &osSecretAccessKey,
201 std::string &osAccessKeyId,
202 std::string &osSessionToken,
203 std::string &osRegion,
204 AWSCredentialsSource &eCredentialsSource);
206 void RefreshCredentials(
const std::string &osPathForOption,
207 bool bForceRefresh)
const;
212 const std::string &osSecretAccessKey,
const std::string &osAccessKeyId,
213 const std::string &osSessionToken,
const std::string &osEndpoint,
214 const std::string &osRegion,
const std::string &osRequestPayer,
215 const std::string &osBucket,
const std::string &osObjectKey,
216 bool bUseHTTPS,
bool bUseVirtualHosting,
217 AWSCredentialsSource eCredentialsSource);
218 ~VSIS3HandleHelper();
220 static VSIS3HandleHelper *BuildFromURI(
const char *pszURI,
221 const char *pszFSPrefix,
224 static std::string BuildURL(
const std::string &osEndpoint,
225 const std::string &osBucket,
226 const std::string &osObjectKey,
bool bUseHTTPS,
227 bool bUseVirtualHosting);
230 GetCurlHeaders(
const std::string &osVerb,
231 const struct curl_slist *psExistingHeaders,
232 const void *pabyDataContent =
nullptr,
233 size_t nBytesContent = 0)
const override;
235 bool AllowAutomaticRedirection()
override
240 bool CanRestartOnError(
const char *,
const char *pszHeaders,
241 bool bSetError)
override;
243 const std::string &GetURL()
const override
248 const std::string &GetBucket()
const
253 const std::string &GetObjectKey()
const
255 return m_osObjectKey;
258 const std::string &GetEndpoint()
const
263 const std::string &GetRegion()
const
268 const std::string &GetRequestPayer()
const
270 return m_osRequestPayer;
273 bool GetVirtualHosting()
const
275 return m_bUseVirtualHosting;
278 void SetEndpoint(
const std::string &osStr);
279 void SetRegion(
const std::string &osStr);
280 void SetRequestPayer(
const std::string &osStr);
281 void SetVirtualHosting(
bool b);
283 std::string GetCopySourceHeader()
const override
285 return "x-amz-copy-source";
288 const char *GetMetadataDirectiveREPLACE()
const override
290 return "x-amz-metadata-directive: REPLACE";
295 static void CleanMutex();
296 static void ClearCache();
299 class VSIS3UpdateParams
302 std::string m_osRegion{};
303 std::string m_osEndpoint{};
304 std::string m_osRequestPayer{};
305 bool m_bUseVirtualHosting =
false;
307 explicit VSIS3UpdateParams(
const VSIS3HandleHelper *poHelper)
308 : m_osRegion(poHelper->GetRegion()),
309 m_osEndpoint(poHelper->GetEndpoint()),
310 m_osRequestPayer(poHelper->GetRequestPayer()),
311 m_bUseVirtualHosting(poHelper->GetVirtualHosting())
315 void UpdateHandlerHelper(VSIS3HandleHelper *poHelper)
317 poHelper->SetRegion(m_osRegion);
318 poHelper->SetEndpoint(m_osEndpoint);
319 poHelper->SetRequestPayer(m_osRequestPayer);
320 poHelper->SetVirtualHosting(m_bUseVirtualHosting);
323 static std::mutex gsMutex;
324 static std::map<std::string, VSIS3UpdateParams> goMapBucketsToS3Params;
327 VSIS3UpdateParams() =
default;
329 static void UpdateMapFromHandle(VSIS3HandleHelper *poS3HandleHelper);
330 static void UpdateHandleFromMap(VSIS3HandleHelper *poS3HandleHelper);
331 static void ClearCache();
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:1042
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1183
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:215
Various convenience functions for working with strings and string lists.