Esempio n. 1
0
        public override void Sign(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey)
        {
            var signer     = SelectSigner(this, _useSigV4, request, clientConfig);
            var aws4Signer = signer as AWS4Signer;
            var useV4      = aws4Signer != null;

            if (useV4)
            {
                AmazonS3Uri s3Uri;
                if (AmazonS3Uri.TryParseAmazonS3Uri(request.Endpoint, out s3Uri))
                {
                    if (s3Uri.Bucket != null)
                    {
                        RegionEndpoint cachedRegion;
                        if (BucketRegionDetector.BucketRegionCache.TryGetValue(s3Uri.Bucket, out cachedRegion))
                        {
                            request.AlternateEndpoint = cachedRegion;
                        }
                    }
                }

                var signingResult = aws4Signer.SignRequest(request, clientConfig, metrics, awsAccessKeyId, awsSecretAccessKey);
                request.Headers[HeaderKeys.AuthorizationHeader] = signingResult.ForAuthorizationHeader;
                if (request.UseChunkEncoding)
                {
                    request.AWS4SignerResult = signingResult;
                }
            }
            else
            {
                SignRequest(request, metrics, awsAccessKeyId, awsSecretAccessKey);
            }
        }
Esempio n. 2
0
        internal static async Task <bool> SharedRetryForExceptionAsync(Runtime.IExecutionContext executionContext, Exception exception,
                                                                       Func <Runtime.IExecutionContext, Exception, bool?> retryForExceptionSync,
                                                                       Func <Runtime.IExecutionContext, Exception, bool> baseRetryForException)
        {
            var syncResult = retryForExceptionSync(executionContext, exception);

            if (syncResult.HasValue)
            {
                return(syncResult.Value);
            }
            else
            {
                var         serviceException = exception as AmazonServiceException;
                string      correctedRegion  = null;
                AmazonS3Uri s3BucketUri;
                if (AmazonS3Uri.TryParseAmazonS3Uri(executionContext.RequestContext.Request.Endpoint, out s3BucketUri))
                {
                    var credentials = executionContext.RequestContext.ImmutableCredentials;
                    correctedRegion = await BucketRegionDetector.DetectMismatchWithHeadBucketFallbackAsync(s3BucketUri, serviceException, credentials).ConfigureAwait(false);
                }

                if (correctedRegion == null)
                {
                    return(baseRetryForException(executionContext, exception));
                }
                else
                {
                    // change authentication region of request and signal the handler to sign again with the new region
                    executionContext.RequestContext.Request.AuthenticationRegion = correctedRegion;
                    executionContext.RequestContext.IsSigned = false;
                    return(true);
                }
            }
        }
Esempio n. 3
0
        public static AmazonS3Uri GetAmazonS3Uri(Uri uri)
        {
            AmazonS3Uri amazonS3Uri = null;
            var         success     = AmazonS3Uri.TryParseAmazonS3Uri(uri, out amazonS3Uri);

            return(success ? amazonS3Uri : null);
        }
Esempio n. 4
0
        /// <summary>
        /// Return true if the request should be retried. Implements additional checks
        /// specific to S3 on top of the checks in DefaultRetryPolicy.
        /// </summary>
        /// <param name="executionContext">Request context containing the state of the request.</param>
        /// <param name="exception">The exception thrown by the previous request.</param>
        /// <returns>Return true if the request should be retried.</returns>
        public override bool RetryForException(Runtime.IExecutionContext executionContext, Exception exception)
        {
            var syncResult = RetryForExceptionSync(executionContext, exception);

            if (syncResult.HasValue)
            {
                return(syncResult.Value);
            }
            else
            {
                var         serviceException = exception as AmazonServiceException;
                string      correctedRegion  = null;
                AmazonS3Uri s3BucketUri;
                if (AmazonS3Uri.TryParseAmazonS3Uri(executionContext.RequestContext.Request.Endpoint, out s3BucketUri))
                {
                    var credentials = executionContext.RequestContext.ImmutableCredentials;
                    if (credentials != null)
                    {
                        correctedRegion = BucketRegionDetector.DetectMismatchWithHeadBucketFallback(s3BucketUri, serviceException, credentials);
                    }
                }

                if (correctedRegion == null)
                {
                    return(base.RetryForException(executionContext, exception));
                }
                else
                {
                    // change authentication region of request and signal the handler to sign again with the new region
                    executionContext.RequestContext.Request.AuthenticationRegion = correctedRegion;
                    executionContext.RequestContext.IsSigned = false;
                    return(true);
                }
            }
        }
Esempio n. 5
0
#pragma warning disable CA1031 // warning CA1031: Modify '***' to catch a more specific exception type, or rethrow the exception.
#pragma warning disable CA1303 // warning CA1303: Method '***' passes a literal string as parameter 'value'
        internal static Outcome <bool, string> Validate(this CommandLine commandLine)
        {
            Contract.Requires(null != commandLine);
            // we must have staging folder
            if (string.IsNullOrWhiteSpace(commandLine.StagingFolder))
            {
                return(new Outcome <bool, string>(false).AddErrors("Staging folder is not specified, you may want to set TEMP or HOME environment variable"));
            }
            if (!commandLine.StagingFolder.EndsWith(Path.DirectorySeparatorChar))
            {
                commandLine.StagingFolder += Path.DirectorySeparatorChar;
            }
            // validate
            var outcome = new Outcome <bool, string>(true);

            foreach (var a in commandLine.Arguments)
            {
                try
                {
                    // this one throws... thank you, Amazon
                    var uri = new Uri(a);
                    if (!AmazonS3Uri.TryParseAmazonS3Uri(uri, out var s3uri))
                    {
                        outcome.AddErrors($"Invalid AWS S3 Uri: {a}");
                    }
                }
                catch (Exception x)
                {
                    outcome.AddErrors($"{x.GetType().Name} {x.Message}: {a}");
                }
            }
            return(outcome);
        }
Esempio n. 6
0
        // See https://github.com/aws/aws-sdk-net/issues/1426
        public static bool TryParse(Uri uri, out AmazonS3Uri s3uri)
        {
            Contract.Requires(null != uri);
#pragma warning disable CA1031  // Modify '***' to catch a more specific exception type, or rethrow the exception.
            try { return(AmazonS3Uri.TryParseAmazonS3Uri(uri, out s3uri)); }
            catch (Exception) { s3uri = null; return(false); }
#pragma warning restore CA1031
        }
Esempio n. 7
0
        public void S3UriWithPlusForSpaceDecodeTryParseTest()
        {
            AmazonS3Uri s3Uri;
            bool        result = AmazonS3Uri.TryParseAmazonS3Uri("https://testbucket.s3.us-east-2.amazonaws.com/C8624825821_S3+Log", true, out s3Uri);

            Assert.IsTrue(result);
            Assert.AreEqual(s3Uri.Key, "C8624825821_S3 Log");
        }
Esempio n. 8
0
 internal static void EvaluateIfSigV4Required(IRequest request)
 {
     // Skip this for S3-compatible storage provider endpoints
     if (request.OriginalRequest is S3.Model.GetObjectRequest &&
         AmazonS3Uri.TryParseAmazonS3Uri(request.Endpoint, out var amazonS3Uri) &&
         amazonS3Uri.Region?.SystemName != RegionEndpoint.USEast1.SystemName)
     {
         request.UseSigV4 = true;
     }
 }
Esempio n. 9
0
        private static void RegionDetectionUpdater(IRequest request)
        {
            AmazonS3Uri s3Uri;

            if (AmazonS3Uri.TryParseAmazonS3Uri(request.Endpoint, out s3Uri))
            {
                if (s3Uri.Bucket != null)
                {
                    RegionEndpoint cachedRegion;
                    if (BucketRegionDetector.BucketRegionCache.TryGetValue(s3Uri.Bucket, out cachedRegion))
                    {
                        request.AlternateEndpoint = cachedRegion;
                    }
                }
            }
        }
Esempio n. 10
0
        internal static void EvaluateIfSigV4Required(IRequest request)
        {
            // Skip this if the request has already been "upgraded" to SigV4a
            if (request.SignatureVersion == SignatureVersion.SigV4a)
            {
                return;
            }

            // Skip this for S3-compatible storage provider endpoints
            if (request.OriginalRequest is S3.Model.GetObjectRequest &&
                AmazonS3Uri.TryParseAmazonS3Uri(request.Endpoint, out var amazonS3Uri) &&
                amazonS3Uri.Region?.SystemName != RegionEndpoint.USEast1.SystemName)
            {
                request.SignatureVersion = SignatureVersion.SigV4;
            }
        }
        public static bool TryParseAmazonS3Uri(string uriString, out AmazonS3Uri amazonS3Uri)
        {
            try
            {
                if (AmazonS3Uri.TryParseAmazonS3Uri(uriString, out amazonS3Uri))
                {
                    return(true);
                }

                // "s3://bucket/key.txt"
                var uri = new Uri(uriString);
                amazonS3Uri = CreateAmazonS3Uri(uri.Host, uri.PathAndQuery);
                return(true);
            }
            catch (Exception)
            {
                amazonS3Uri = null;
                return(false);
            }
        }
        public WebRequest Create(Uri uri)
        {
            IAmazonS3   client      = null;
            AmazonS3Uri amazonS3Uri = null;

            // Create client from config
            AmazonS3Uri.TryParseAmazonS3Uri(uri, out amazonS3Uri);
            AWSOptions awsOptions = options;

            if (options == null)
            {
                awsOptions = new AWSOptions();
            }
            client = awsOptions.CreateServiceClient <IAmazonS3>();
            if (amazonS3Uri == null || amazonS3Uri.IsPathStyle || S3UriParser.IsKnownScheme(uri.Scheme))
            {
                (client.Config as AmazonS3Config).ForcePathStyle = true;
            }


            S3WebRequest s3WebRequest = new S3WebRequest(uri, logger, (AmazonS3Client)client, s3BucketsConfiguration);

            return(s3WebRequest);
        }
Esempio n. 13
0
        public override void Sign(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey)
        {
            AWS4Signer val = this.SelectSigner(this, _useSigV4, request, clientConfig) as AWS4Signer;

            if (val != null)
            {
                AmazonS3Uri    amazonS3Uri;
                RegionEndpoint alternateEndpoint = default(RegionEndpoint);
                if (AmazonS3Uri.TryParseAmazonS3Uri(request.get_Endpoint(), out amazonS3Uri) && amazonS3Uri.Bucket != null && BucketRegionDetector.BucketRegionCache.TryGetValue(amazonS3Uri.Bucket, ref alternateEndpoint))
                {
                    request.set_AlternateEndpoint(alternateEndpoint);
                }
                AWS4SigningResult val2 = val.SignRequest(request, clientConfig, metrics, awsAccessKeyId, awsSecretAccessKey);
                request.get_Headers()["Authorization"] = val2.get_ForAuthorizationHeader();
                if (request.get_UseChunkEncoding())
                {
                    request.set_AWS4SignerResult(val2);
                }
            }
            else
            {
                SignRequest(request, metrics, awsAccessKeyId, awsSecretAccessKey);
            }
        }