| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
							- <?php
 
- namespace Aws\Signature;
 
- use Aws\Credentials\CredentialsInterface;
 
- use AWS\CRT\Auth\SignatureType;
 
- use AWS\CRT\Auth\SigningAlgorithm;
 
- use AWS\CRT\Auth\SigningConfigAWS;
 
- use Psr\Http\Message\RequestInterface;
 
- /**
 
-  * Amazon S3 signature version 4 support.
 
-  */
 
- class S3SignatureV4 extends SignatureV4
 
- {
 
-     /**
 
-      * S3-specific signing logic
 
-      *
 
-      * {@inheritdoc}
 
-      */
 
-     use SignatureTrait;
 
-     public function signRequest(
 
-         RequestInterface $request,
 
-         CredentialsInterface $credentials,
 
-         $signingService = null
 
-     ) {
 
-         // Always add a x-amz-content-sha-256 for data integrity
 
-         if (!$request->hasHeader('x-amz-content-sha256')) {
 
-             $request = $request->withHeader(
 
-                 'x-amz-content-sha256',
 
-                 $this->getPayload($request)
 
-             );
 
-         }
 
-         $useCrt =
 
-             strpos($request->getUri()->getHost(), "accesspoint.s3-global")
 
-             !== false;
 
-         if (!$useCrt) {
 
-             if (strpos($request->getUri()->getHost(), "s3-object-lambda")) {
 
-                 return parent::signRequest($request, $credentials, "s3-object-lambda");
 
-             }
 
-             return parent::signRequest($request, $credentials);
 
-         }
 
-         $signingService = $signingService ?: 's3';
 
-         return $this->signWithV4a($credentials, $request, $signingService);
 
-     }
 
-     /**
 
-      * @param CredentialsInterface $credentials
 
-      * @param RequestInterface $request
 
-      * @param $signingService
 
-      * @param SigningConfigAWS|null $signingConfig
 
-      * @return RequestInterface
 
-      *
 
-      * Instantiates a separate sigv4a signing config.  All services except S3
 
-      * use double encoding.  All services except S3 require path normalization.
 
-      */
 
-     protected function signWithV4a(
 
-         CredentialsInterface $credentials,
 
-         RequestInterface $request,
 
-         $signingService,
 
-         SigningConfigAWS $signingConfig = null
 
-     ){
 
-         $this->verifyCRTLoaded();
 
-         $credentials_provider = $this->createCRTStaticCredentialsProvider($credentials);
 
-         $signingConfig = new SigningConfigAWS([
 
-             'algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC,
 
-             'signature_type' => SignatureType::HTTP_REQUEST_HEADERS,
 
-             'credentials_provider' => $credentials_provider,
 
-             'signed_body_value' => $this->getPayload($request),
 
-             'region' => "*",
 
-             'should_normalize_uri_path' => false,
 
-             'use_double_uri_encode' => false,
 
-             'service' => $signingService,
 
-             'date' => time(),
 
-         ]);
 
-         return parent::signWithV4a($credentials, $request, $signingService, $signingConfig);
 
-     }
 
-     /**
 
-      * Always add a x-amz-content-sha-256 for data integrity.
 
-      *
 
-      * {@inheritdoc}
 
-      */
 
-     public function presign(
 
-         RequestInterface $request,
 
-         CredentialsInterface $credentials,
 
-         $expires,
 
-         array $options = []
 
-     ) {
 
-         if (!$request->hasHeader('x-amz-content-sha256')) {
 
-             $request = $request->withHeader(
 
-                 'X-Amz-Content-Sha256',
 
-                 $this->getPresignedPayload($request)
 
-             );
 
-         }
 
-         if (strpos($request->getUri()->getHost(), "accesspoint.s3-global")) {
 
-             $request = $request->withHeader("x-amz-region-set", "*");
 
-         }
 
-         return parent::presign($request, $credentials, $expires, $options);
 
-     }
 
-     /**
 
-      * Override used to allow pre-signed URLs to be created for an
 
-      * in-determinate request payload.
 
-      */
 
-     protected function getPresignedPayload(RequestInterface $request)
 
-     {
 
-         return SignatureV4::UNSIGNED_PAYLOAD;
 
-     }
 
-     /**
 
-      * Amazon S3 does not double-encode the path component in the canonical request
 
-      */
 
-     protected function createCanonicalizedPath($path)
 
-     {
 
-         // Only remove one slash in case of keys that have a preceding slash
 
-         if (substr($path, 0, 1) === '/') {
 
-             $path = substr($path, 1);
 
-         }
 
-         return '/' . $path;
 
-     }
 
- }
 
 
  |