AWSUrlPresigner.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/core/client/AWSUrlPresigner.h>
  6. #include <aws/core/client/AWSClient.h>
  7. #include <aws/core/http/HttpClientFactory.h>
  8. namespace Aws
  9. {
  10. namespace Client
  11. {
  12. using HttpRequest = Http::HttpRequest;
  13. using HttpMethod = Http::HttpMethod;
  14. using URI = Http::URI;
  15. AWSUrlPresigner::AWSUrlPresigner(const AWSClient& client)
  16. : m_awsClient(client)
  17. {}
  18. Aws::Client::AWSAuthSigner* AWSUrlPresigner::GetSignerByName(const char* name) const
  19. {
  20. return m_awsClient.GetSignerByName(name);
  21. }
  22. std::shared_ptr<Aws::Http::HttpRequest>
  23. ConvertToRequestForPresigning(const Aws::AmazonWebServiceRequest& request,
  24. const Aws::Http::URI& uri,
  25. Aws::Http::HttpMethod method,
  26. const Aws::Http::QueryStringParameterCollection& extraParams)
  27. {
  28. Aws::Http::URI uriCopy = uri;
  29. request.PutToPresignedUrl(uriCopy);
  30. std::shared_ptr<HttpRequest> httpRequest = CreateHttpRequest(uriCopy, method, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
  31. for (auto& param : extraParams)
  32. {
  33. httpRequest->AddQueryStringParameter(param.first.c_str(), param.second);
  34. }
  35. return httpRequest;
  36. }
  37. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
  38. HttpMethod method,
  39. long long expirationInSeconds) const
  40. {
  41. const char* regionOverride = nullptr;
  42. const char* serviceNameOverride = nullptr;
  43. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  44. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
  45. }
  46. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
  47. HttpMethod method,
  48. const Aws::Http::HeaderValueCollection& customizedHeaders,
  49. long long expirationInSeconds) const
  50. {
  51. const char* regionOverride = nullptr;
  52. const char* serviceNameOverride = nullptr;
  53. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  54. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
  55. }
  56. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
  57. HttpMethod method,
  58. const char* regionOverride,
  59. long long expirationInSeconds) const
  60. {
  61. const char* serviceNameOverride = nullptr;
  62. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  63. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
  64. }
  65. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
  66. HttpMethod method,
  67. const char* regionOverride,
  68. const Aws::Http::HeaderValueCollection& customizedHeaders,
  69. long long expirationInSeconds) const
  70. {
  71. const char* serviceNameOverride = nullptr;
  72. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  73. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
  74. }
  75. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
  76. Aws::Http::HttpMethod method,
  77. const char* regionOverride,
  78. const char* serviceNameOverride,
  79. long long expirationInSeconds) const
  80. {
  81. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  82. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
  83. }
  84. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
  85. Aws::Http::HttpMethod method,
  86. const char* regionOverride,
  87. const char* serviceNameOverride,
  88. const Aws::Http::HeaderValueCollection& customizedHeaders,
  89. long long expirationInSeconds) const
  90. {
  91. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  92. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
  93. }
  94. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
  95. Aws::Http::HttpMethod method,
  96. const char* regionOverride,
  97. const char* serviceNameOverride,
  98. const char* signerName,
  99. long long expirationInSeconds) const
  100. {
  101. const Aws::Http::HeaderValueCollection& customizedHeaders = {};
  102. return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
  103. }
  104. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
  105. Aws::Http::HttpMethod method,
  106. const char* region,
  107. const char* serviceName,
  108. const char* signerName,
  109. const Aws::Http::HeaderValueCollection& customizedHeaders,
  110. long long expirationInSeconds) const
  111. {
  112. /* a real method implementation */
  113. if (!signerName) {
  114. signerName = Aws::Auth::SIGV4_SIGNER;
  115. }
  116. std::shared_ptr<HttpRequest> request = CreateHttpRequest(uri, method, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
  117. for (const auto& it: customizedHeaders)
  118. {
  119. request->SetHeaderValue(it.first.c_str(), it.second);
  120. }
  121. auto signer = GetSignerByName(signerName);
  122. if (signer->PresignRequest(*request, region, serviceName, expirationInSeconds))
  123. {
  124. return request->GetURIString();
  125. }
  126. return {};
  127. }
  128. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Endpoint::AWSEndpoint& endpoint,
  129. Aws::Http::HttpMethod method /* = Http::HttpMethod::HTTP_POST */,
  130. const Aws::Http::HeaderValueCollection& customizedHeaders /* = {} */,
  131. uint64_t expirationInSeconds /* = 0 */,
  132. const char* signerName /* = Aws::Auth::SIGV4_SIGNER */,
  133. const char* signerRegionOverride /* = nullptr */,
  134. const char* signerServiceNameOverride /* = nullptr */) const
  135. {
  136. const Aws::Http::URI& uri = endpoint.GetURI();
  137. if (endpoint.GetAttributes()) {
  138. signerName = endpoint.GetAttributes()->authScheme.GetName().c_str();
  139. if (endpoint.GetAttributes()->authScheme.GetSigningRegion()) {
  140. signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegion()->c_str();
  141. }
  142. if (endpoint.GetAttributes()->authScheme.GetSigningRegionSet()) {
  143. signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegionSet()->c_str();
  144. }
  145. if (endpoint.GetAttributes()->authScheme.GetSigningName()) {
  146. signerServiceNameOverride = endpoint.GetAttributes()->authScheme.GetSigningName()->c_str();
  147. }
  148. }
  149. return GeneratePresignedUrl(uri, method, signerRegionOverride, signerServiceNameOverride, signerName, customizedHeaders, expirationInSeconds);
  150. }
  151. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
  152. const Aws::Http::URI& uri,
  153. Aws::Http::HttpMethod method,
  154. const char* regionOverride,
  155. const Aws::Http::QueryStringParameterCollection& extraParams,
  156. long long expirationInSeconds) const
  157. {
  158. const char* serviceNameOverride = nullptr;
  159. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  160. return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
  161. }
  162. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
  163. const Aws::Http::URI& uri,
  164. Aws::Http::HttpMethod method,
  165. const char* regionOverride,
  166. const char* serviceNameOverride,
  167. const char* signerName,
  168. const Aws::Http::QueryStringParameterCollection& extraParams,
  169. long long expirationInSeconds) const
  170. {
  171. /* a real method implementation */
  172. if (!signerName) {
  173. signerName = Aws::Auth::SIGV4_SIGNER;
  174. }
  175. std::shared_ptr<HttpRequest> httpRequest =
  176. ConvertToRequestForPresigning(request, uri, method, extraParams);
  177. auto signer = GetSignerByName(signerName);
  178. if (signer->PresignRequest(*httpRequest, regionOverride, serviceNameOverride, expirationInSeconds))
  179. {
  180. return httpRequest->GetURIString();
  181. }
  182. return {};
  183. }
  184. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
  185. const Aws::Http::URI& uri,
  186. Aws::Http::HttpMethod method,
  187. const char* regionOverride,
  188. const char* serviceNameOverride,
  189. const Aws::Http::QueryStringParameterCollection& extraParams,
  190. long long expirationInSeconds) const
  191. {
  192. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  193. return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
  194. }
  195. Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
  196. const Aws::Http::URI& uri,
  197. Aws::Http::HttpMethod method,
  198. const Aws::Http::QueryStringParameterCollection& extraParams,
  199. long long expirationInSeconds) const
  200. {
  201. const char* regionOverride = nullptr;
  202. const char* serviceNameOverride = nullptr;
  203. const char* signerName = Aws::Auth::SIGV4_SIGNER;
  204. return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
  205. }
  206. } // namespace Client
  207. } // namespace Aws