S3Endpoint.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/s3/S3Endpoint.h>
  6. #include <aws/core/utils/memory/stl/AWSStringStream.h>
  7. #include <aws/core/utils/HashingUtils.h>
  8. using namespace Aws;
  9. using namespace Aws::S3;
  10. namespace Aws
  11. {
  12. namespace S3
  13. {
  14. namespace S3Endpoint
  15. {
  16. static const int CN_NORTH_1_HASH = Aws::Utils::HashingUtils::HashString("cn-north-1");
  17. static const int CN_NORTHWEST_1_HASH = Aws::Utils::HashingUtils::HashString("cn-northwest-1");
  18. static const int US_ISO_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-iso-east-1");
  19. static const int US_ISOB_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-isob-east-1");
  20. static const int FIPS_US_GOV_WEST_1_HASH = Aws::Utils::HashingUtils::HashString("fips-us-gov-west-1");
  21. static const int US_GOV_WEST_1_HASH = Aws::Utils::HashingUtils::HashString("us-gov-west-1");
  22. static const int US_GOV_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-gov-east-1");
  23. static const int S3_EXTERNAL_1_HASH = Aws::Utils::HashingUtils::HashString("s3-external-1");
  24. static const int US_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-east-1");
  25. static const int AWS_GLOBAL_HASH = Aws::Utils::HashingUtils::HashString("aws-global");
  26. Aws::String ForAccessPointArn(const S3ARN& arn, const Aws::String& regionNameOverride, bool useDualStack, const Aws::String& endpointOverride)
  27. {
  28. Aws::StringStream ss;
  29. if (!endpointOverride.empty())
  30. {
  31. ss << arn.GetResourceId() << "-" << arn.GetAccountId() << "." << endpointOverride;
  32. return ss.str();
  33. }
  34. const Aws::String& region = regionNameOverride.empty() ? arn.GetRegion() : regionNameOverride;
  35. auto hash = Aws::Utils::HashingUtils::HashString(region.c_str());
  36. ss << arn.GetResourceId() << "-" << arn.GetAccountId() << ".s3-accesspoint.";
  37. if (useDualStack)
  38. {
  39. ss << "dualstack.";
  40. }
  41. ss << region << "." << "amazonaws.com";
  42. if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
  43. {
  44. ss << ".cn";
  45. }
  46. return ss.str();
  47. }
  48. Aws::String ForOutpostsArn(const S3ARN& arn, const Aws::String& regionNameOverride, bool useDualStack, const Aws::String& endpointOverride)
  49. {
  50. AWS_UNREFERENCED_PARAM(useDualStack);
  51. assert(!useDualStack);
  52. Aws::StringStream ss;
  53. if (!endpointOverride.empty())
  54. {
  55. ss << arn.GetSubResourceId() << "-" << arn.GetAccountId() << "." << arn.GetResourceId() << "." << endpointOverride;
  56. return ss.str();
  57. }
  58. const Aws::String& region = regionNameOverride.empty() ? arn.GetRegion() : regionNameOverride;
  59. auto hash = Aws::Utils::HashingUtils::HashString(region.c_str());
  60. ss << arn.GetSubResourceId() << "-" << arn.GetAccountId() << "." << arn.GetResourceId() << "." << ARNService::S3_OUTPOSTS << "." << region << "." << "amazonaws.com";
  61. if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
  62. {
  63. ss << ".cn";
  64. }
  65. return ss.str();
  66. }
  67. Aws::String ForObjectLambdaAccessPointArn(const S3ARN& arn, const Aws::String& regionNameOverride, bool useDualStack, const Aws::String& endpointOverride)
  68. {
  69. AWS_UNREFERENCED_PARAM(useDualStack);
  70. assert(!useDualStack);
  71. Aws::StringStream ss;
  72. if (!endpointOverride.empty())
  73. {
  74. ss << arn.GetResourceId() << "-" << arn.GetAccountId() << "." << endpointOverride;
  75. return ss.str();
  76. }
  77. Aws::String region = regionNameOverride.empty() ? arn.GetRegion() : regionNameOverride;
  78. Aws::String fipsSuffix = "";
  79. if (region.size() >= 5 && region.compare(0, 5, "fips-") == 0)
  80. {
  81. region = region.substr(5);
  82. fipsSuffix = "-fips";
  83. }
  84. else if (region.size() >= 5 && region.compare(region.size() - 5, 5, "-fips") == 0)
  85. {
  86. region = region.substr(0, region.size() - 5);
  87. fipsSuffix = "-fips";
  88. }
  89. ss << arn.GetResourceId() << "-" << arn.GetAccountId() << "." << ARNService::S3_OBJECT_LAMBDA << fipsSuffix << "." << region << "." << "amazonaws.com";
  90. auto hash = Aws::Utils::HashingUtils::HashString(region.c_str());
  91. if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
  92. {
  93. ss << ".cn";
  94. }
  95. return ss.str();
  96. }
  97. Aws::String ForRegion(const Aws::String& regionName, bool useDualStack, bool USEast1UseRegionalEndpoint, const Aws::String& serviceName)
  98. {
  99. auto hash = Aws::Utils::HashingUtils::HashString(regionName.c_str());
  100. if (!serviceName.empty())
  101. {
  102. assert(!useDualStack);
  103. Aws::StringStream ss;
  104. ss << serviceName;
  105. if (regionName.size() >= 5 && regionName.compare(0, 5, "fips-") == 0)
  106. {
  107. ss << "-fips." << regionName.substr(5);
  108. }
  109. else if (regionName.size() >= 5 && regionName.compare(regionName.size() - 5, 5, "-fips") == 0)
  110. {
  111. ss << "-fips." << regionName.substr(0, regionName.size() - 5);
  112. }
  113. else if (hash == AWS_GLOBAL_HASH || hash == S3_EXTERNAL_1_HASH)
  114. {
  115. ss << "." << Aws::Region::US_EAST_1;
  116. }
  117. else
  118. {
  119. ss << "." << regionName;
  120. }
  121. ss << ".amazonaws.com";
  122. if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
  123. {
  124. ss << ".cn";
  125. }
  126. return ss.str();
  127. }
  128. if(!useDualStack)
  129. {
  130. if(hash == FIPS_US_GOV_WEST_1_HASH)
  131. {
  132. return "s3-fips-us-gov-west-1.amazonaws.com";
  133. }
  134. if(hash == US_GOV_WEST_1_HASH)
  135. {
  136. return "s3.us-gov-west-1.amazonaws.com";
  137. }
  138. if(hash == US_GOV_EAST_1_HASH)
  139. {
  140. return "s3.us-gov-east-1.amazonaws.com";
  141. }
  142. if (hash == AWS_GLOBAL_HASH)
  143. {
  144. return "s3.amazonaws.com";
  145. }
  146. if (hash == S3_EXTERNAL_1_HASH)
  147. {
  148. return "s3-external-1.amazonaws.com";
  149. }
  150. if(hash == US_EAST_1_HASH)
  151. {
  152. if (USEast1UseRegionalEndpoint)
  153. {
  154. return "s3.us-east-1.amazonaws.com";
  155. }
  156. else
  157. {
  158. return "s3.amazonaws.com";
  159. }
  160. }
  161. }
  162. Aws::StringStream ss;
  163. ss << "s3" << ".";
  164. if(useDualStack)
  165. {
  166. ss << "dualstack.";
  167. }
  168. ss << regionName;
  169. if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
  170. {
  171. ss << ".amazonaws.com.cn";
  172. }
  173. else if (hash == US_ISO_EAST_1_HASH)
  174. {
  175. ss << ".c2s.ic.gov";
  176. }
  177. else if (hash == US_ISOB_EAST_1_HASH)
  178. {
  179. ss << ".sc2s.sgov.gov";
  180. }
  181. else
  182. {
  183. ss << ".amazonaws.com";
  184. }
  185. return ss.str();
  186. }
  187. } // namespace S3Endpoint
  188. } // namespace S3
  189. } // namespace Aws