示例#1
0
    /// <summary>Add SimpleS3 services to a service collection.</summary>
    /// <param name="collection">The service collection</param>
    public static IClientBuilder AddAmazonS3(this IServiceCollection collection)
    {
        ICoreBuilder coreBuilder = SimpleS3CoreServices.AddSimpleS3Core(collection);

        coreBuilder.UseAmazonS3();

        IHttpClientBuilder httpBuilder = coreBuilder.UseHttpClientFactory();

        httpBuilder.UseDefaultHttpPolicy();

        coreBuilder.Services.AddSingleton(x =>
        {
            //We have to call a specific constructor for dependency injection
            IObjectClient objectClient           = x.GetRequiredService <IObjectClient>();
            IBucketClient bucketClient           = x.GetRequiredService <IBucketClient>();
            IMultipartClient multipartClient     = x.GetRequiredService <IMultipartClient>();
            IMultipartTransfer multipartTransfer = x.GetRequiredService <IMultipartTransfer>();
            ITransfer transfer = x.GetRequiredService <ITransfer>();
            ISignedObjectClient?signedObjectClient = x.GetRequiredService <ISignedObjectClient>();
            return(new AmazonS3Client(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObjectClient));
        });

        //Add the client as the interface too
        coreBuilder.Services.AddSingleton <ISimpleClient>(x => x.GetRequiredService <AmazonS3Client>());

        return(new ClientBuilder(collection, httpBuilder, coreBuilder));
    }
示例#2
0
        private void Initialize(IOptions <S3Config> options, INetworkDriver networkDriver, ILoggerFactory loggerFactory)
        {
            Assembly assembly = typeof(S3Config).Assembly;

            SimpleServiceProvider provider = new SimpleServiceProvider(new Tuple <Type, object>(typeof(IOptions <S3Config>), options));

            IEnumerable <IValidator>       validators       = CreateInstances <IValidator>(assembly, provider);
            IEnumerable <IRequestMarshal>  requestMarshals  = CreateInstances <IRequestMarshal>(assembly, provider);
            IEnumerable <IResponseMarshal> responseMarshals = CreateInstances <IResponseMarshal>(assembly, provider);

            ValidatorFactory      validatorFactory     = new ValidatorFactory(validators);
            IMarshalFactory       marshalFactory       = new MarshalFactory(requestMarshals, responseMarshals);
            IScopeBuilder         scopeBuilder         = new ScopeBuilder(options);
            ISigningKeyBuilder    signingKeyBuilder    = new SigningKeyBuilder(options, loggerFactory.CreateLogger <SigningKeyBuilder>());
            ISignatureBuilder     signatureBuilder     = new SignatureBuilder(signingKeyBuilder, scopeBuilder, loggerFactory.CreateLogger <SignatureBuilder>(), options);
            IAuthorizationBuilder authorizationBuilder = new AuthorizationHeaderBuilder(options, scopeBuilder, signatureBuilder, loggerFactory.CreateLogger <AuthorizationHeaderBuilder>());
            DefaultRequestHandler requestHandler       = new DefaultRequestHandler(options, validatorFactory, marshalFactory, networkDriver, authorizationBuilder, Enumerable.Empty <IRequestStreamWrapper>(), loggerFactory.CreateLogger <DefaultRequestHandler>());

            ObjectOperations objectOperations = new ObjectOperations(requestHandler, Enumerable.Empty <IRequestWrapper>(), Enumerable.Empty <IResponseWrapper>());

            _objectClient = new S3ObjectClient(objectOperations);

            BucketOperations bucketOperations = new BucketOperations(requestHandler);

            _bucketClient = new S3BucketClient(bucketOperations);

            MultipartOperations multipartOperations = new MultipartOperations(requestHandler, Enumerable.Empty <IRequestWrapper>(), Enumerable.Empty <IResponseWrapper>());

            _multipartClient = new S3MultipartClient(multipartOperations, objectOperations);

            Transfer = new Transfer(objectOperations, multipartOperations);
        }
示例#3
0
        public IntegrationTest(ITestOutputHelper output)
        {
            _output = output;
            dynamic config = ConfigurationLoader.LoadConfiguration("secrets.json");

            //AWS
            dynamic aws       = config.aws;
            string  awsId     = aws.id;
            string  awsKey    = aws.key;
            string  awsRegion = aws.region;

            awsClient       = BucketClientFactory.CreateClient(CloudServiceProvider.AWS, new AWSCredential(awsId, awsKey, awsRegion));
            awsTargetBucket = aws.bucket;

            //DO
            dynamic DO       = config.DO;
            string  doId     = DO.id;
            string  doKey    = DO.key;
            string  doRegion = DO.region;

            doClient       = BucketClientFactory.CreateClient(CloudServiceProvider.DigitalOcean, new DigitalOceanCredential(doId, doKey, doRegion));
            doTargetBucket = DO.bucket;

            //Azure
            dynamic azure    = config.azure;
            string  azureId  = azure.id;
            string  azurekey = azure.key;

            azureClient       = BucketClientFactory.CreateClient(CloudServiceProvider.Azure, new AzureCredential(azureId, azurekey));
            azureTargetBucket = azure.bucket;
        }
示例#4
0
 internal AWSBucket(string key, AWSHttpClient client, string region, AWSBucketClient bucketClient)
 {
     _region       = region;
     _client       = client;
     _key          = key;
     _bucketClient = bucketClient;
 }
示例#5
0
 public Factory(ICredential awsCred, ICredential doCred, ICredential azureCred, ICredential gcpCred)
 {
     AWSBucket   = BucketClientFactory.CreateClient(CloudServiceProvider.AWS, awsCred);
     DOBucket    = BucketClientFactory.CreateClient(CloudServiceProvider.DigitalOcean, doCred);
     AzureBucket = BucketClientFactory.CreateClient(CloudServiceProvider.Azure, azureCred);
     GCPBucket   = BucketClientFactory.CreateClient(CloudServiceProvider.GCP, gcpCred);
 }
示例#6
0
    private static async Task Main(string[] args)
    {
        Console.WriteLine("You are about to set up the test environment for the provider tests");

        S3Provider selectedProvider = UtilityHelper.SelectProvider();

        Console.WriteLine();

        string profileName = UtilityHelper.GetProfileName(selectedProvider);

        using ServiceProvider provider = UtilityHelper.CreateSimpleS3(selectedProvider, profileName, true);

        IProfile profile    = UtilityHelper.GetOrSetupProfile(provider, selectedProvider, profileName);
        string   bucketName = UtilityHelper.GetTestBucket(profile);

        IBucketClient bucketClient = provider.GetRequiredService <IBucketClient>();

        Console.WriteLine($"Setting up bucket '{bucketName}'");

        bool success = await TryCreateBucketAsync(bucketClient, bucketName);

        if (success)
        {
            if (selectedProvider == S3Provider.AmazonS3)
            {
                await PostConfigureAmazonS3(bucketClient, bucketName).ConfigureAwait(false);
            }
            else if (selectedProvider == S3Provider.BackBlazeB2)
            {
                await PostConfigureBackBlazeB2(bucketClient, bucketName).ConfigureAwait(false);
            }
        }
    }
示例#7
0
        public S3Client(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient)
        {
            _objectClient    = objectClient;
            _bucketClient    = bucketClient;
            _multipartClient = multipartClient;

            Transfer = new Transfer(_objectClient.ObjectOperations, _multipartClient.MultipartOperations);
        }
示例#8
0
 protected void Initialize(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient, IMultipartTransfer multipartTransfer, ITransfer transfer, ISignedObjectClient signedObjectClient)
 {
     _objectClient       = objectClient;
     _bucketClient       = bucketClient;
     _multipartClient    = multipartClient;
     _multipartTransfer  = multipartTransfer;
     _transfer           = transfer;
     _signedObjectClient = signedObjectClient;
 }
示例#9
0
    private static async IAsyncEnumerable <S3Bucket> ListAllBucketsAsync(IBucketClient client)
    {
        ListBucketsResponse response = await client.ListBucketsAsync().ConfigureAwait(false);

        foreach (S3Bucket bucket in response.Buckets)
        {
            yield return(bucket);
        }
    }
示例#10
0
    private void Build(IServiceCollection services)
    {
        _serviceProvider = services.BuildServiceProvider();

        IObjectClient       objectClient       = _serviceProvider.GetRequiredService <IObjectClient>();
        IBucketClient       bucketClient       = _serviceProvider.GetRequiredService <IBucketClient>();
        IMultipartClient    multipartClient    = _serviceProvider.GetRequiredService <IMultipartClient>();
        IMultipartTransfer  multipartTransfer  = _serviceProvider.GetRequiredService <IMultipartTransfer>();
        ITransfer           transfer           = _serviceProvider.GetRequiredService <ITransfer>();
        ISignedObjectClient signedObjectClient = _serviceProvider.GetRequiredService <ISignedObjectClient>();

        Client = new SimpleClient(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObjectClient);
    }
示例#11
0
    private static async Task PostConfigureBackBlazeB2(IBucketClient bucketClient, string bucketName)
    {
        Console.WriteLine("Adding lock configuration");

        PutBucketLockConfigurationResponse putLockResp = await bucketClient.PutBucketLockConfigurationAsync(bucketName, true).ConfigureAwait(false);

        if (putLockResp.IsSuccess)
        {
            Console.WriteLine("Successfully applied lock configuration.");
        }
        else
        {
            Console.Error.WriteLine("Failed to apply lock configuration.");
        }
    }
        public static ICoreBuilder UseS3Client(this ICoreBuilder builder)
        {
            builder.Services.TryAddSingleton(x =>
            {
                //We have to call a specific constructor for dependency injection
                IObjectClient objectClient       = x.GetRequiredService <IObjectClient>();
                IBucketClient bucketClient       = x.GetRequiredService <IBucketClient>();
                IMultipartClient multipartClient = x.GetRequiredService <IMultipartClient>();
                return(new S3Client(objectClient, bucketClient, multipartClient));
            });

            //Add the client as the interface too
            builder.Services.TryAddSingleton <IClient>(x => x.GetRequiredService <S3Client>());
            return(builder);
        }
示例#13
0
    private static async Task PostConfigureAmazonS3(IBucketClient bucketClient, string bucketName)
    {
        Console.WriteLine("Adding lock configuration");

        PutBucketLockConfigurationResponse putLockResp = await bucketClient.PutBucketLockConfigurationAsync(bucketName, true).ConfigureAwait(false);

        if (putLockResp.IsSuccess)
        {
            Console.WriteLine("Successfully applied lock configuration.");
        }
        else
        {
            Console.Error.WriteLine("Failed to apply lock configuration.");
        }

        List <S3Rule> rules = new List <S3Rule>
        {
            new S3Rule("ExpireAll", true)
            {
                AbortIncompleteMultipartUploadDays = 1,
                NonCurrentVersionExpirationDays    = 1,
                Expiration = new S3Expiration(1),
                Filter     = new S3Filter {
                    Prefix = ""
                }
            }
        };

        Console.WriteLine("Adding lifecycle configuration");

        PutBucketLifecycleConfigurationResponse putLifecycleResp = await bucketClient.PutBucketLifecycleConfigurationAsync(bucketName, rules).ConfigureAwait(false);

        if (putLifecycleResp.IsSuccess)
        {
            Console.WriteLine("Successfully applied lifecycle configuration.");
        }
        else
        {
            Console.Error.WriteLine("Failed to apply lifecycle configuration.");
        }
    }
示例#14
0
    private static async Task <bool> TryCreateBucketAsync(IBucketClient bucketClient, string bucketName)
    {
        HeadBucketResponse headResp = await bucketClient.HeadBucketAsync(bucketName);

        //Bucket already exist - we return true to apply post-configuration
        if (headResp.StatusCode == 200)
        {
            return(true);
        }

        CreateBucketResponse createResp = await bucketClient.CreateBucketAsync(bucketName, r => r.EnableObjectLocking = true).ConfigureAwait(false);

        if (createResp.IsSuccess)
        {
            Console.WriteLine($"Successfully created '{bucketName}'.");
            return(true);
        }

        Console.Error.WriteLine($"Failed to create '{bucketName}'. Error: " + createResp.Error?.Message);
        return(false);
    }
        /// <summary>List all buckets</summary>
        public static async IAsyncEnumerable <S3Bucket> ListAllBucketsAsync(this IBucketClient client, Action <ListBucketsRequest>?config = null, [EnumeratorCancellation] CancellationToken token = default)
        {
            ListBucketsResponse response = await client.ListBucketsAsync(config, token).ConfigureAwait(false);

            if (!response.IsSuccess)
            {
                throw new S3RequestException(response.StatusCode, "Request failed");
            }

            if (token.IsCancellationRequested)
            {
                yield break;
            }

            foreach (S3Bucket bucket in response.Buckets)
            {
                if (token.IsCancellationRequested)
                {
                    yield break;
                }

                yield return(bucket);
            }
        }
示例#16
0
        private static async Task Main(string[] args)
        {
            IConfigurationRoot root = new ConfigurationBuilder()
                                      .AddJsonFile("Config.json", false)
                                      .Build();

            ServiceCollection services = new ServiceCollection();

            services.Configure <S3Config>(root);

            IS3ClientBuilder clientBuilder = services.AddSimpleS3();

            clientBuilder.CoreBuilder.UseProfileManager()
            .BindConfigToDefaultProfile()
            .UseDataProtection();

            IConfigurationSection proxySection = root.GetSection("Proxy");

            if (proxySection != null && proxySection["UseProxy"].Equals("true", StringComparison.OrdinalIgnoreCase))
            {
                clientBuilder.HttpBuilder.WithProxy(proxySection["ProxyAddress"]);
            }

            using (ServiceProvider provider = services.BuildServiceProvider())
            {
                IProfileManager manager = provider.GetRequiredService <IProfileManager>();
                IProfile?       profile = manager.GetDefaultProfile();

                //If profile is null, then we do not yet have a profile stored on disk. We use ConsoleSetup as an easy and secure way of asking for credentials
                if (profile == null)
                {
                    Console.WriteLine("No profile found. Starting setup.");
                    ConsoleSetup.SetupDefaultProfile(manager);
                }

                IBucketClient bucketClient = provider.GetRequiredService <IBucketClient>();

                string bucketName = root["BucketName"];

                Console.WriteLine($"Setting up bucket '{bucketName}'");

                HeadBucketResponse headResp = await bucketClient.HeadBucketAsync(bucketName).ConfigureAwait(false);

                if (headResp.IsSuccess)
                {
                    Console.WriteLine($"'{bucketName}' already exist.");
                }
                else
                {
                    Console.WriteLine($"'{bucketName}' does not exist - creating.");
                    CreateBucketResponse createResp = await bucketClient.CreateBucketAsync(bucketName, x => x.EnableObjectLocking = true).ConfigureAwait(false);

                    if (createResp.IsSuccess)
                    {
                        Console.WriteLine($"Successfully created '{bucketName}'.");
                    }
                    else
                    {
                        Console.Error.WriteLine($"Failed to create '{bucketName}'. Exiting.");
                        return;
                    }
                }

                Console.WriteLine("Adding lock configuration");

                PutBucketLockConfigurationResponse putLockResp = await bucketClient.PutBucketLockConfigurationAsync(bucketName, true).ConfigureAwait(false);

                if (putLockResp.IsSuccess)
                {
                    Console.WriteLine("Successfully applied lock configuration.");
                }
                else
                {
                    Console.Error.WriteLine("Failed to apply lock configuration.");
                }

                List <S3Rule> rules = new List <S3Rule>
                {
                    new S3Rule("ExpireAll", true)
                    {
                        AbortIncompleteMultipartUploadDays = 1,
                        NonCurrentVersionExpirationDays    = 1,
                        Expiration = new S3Expiration(1),
                        Filter     = new S3Filter {
                            Prefix = ""
                        }
                    }
                };

                Console.WriteLine("Adding lifecycle configuration");

                PutBucketLifecycleConfigurationResponse putLifecycleResp = await bucketClient.PutBucketLifecycleConfigurationAsync(bucketName, rules).ConfigureAwait(false);

                if (putLifecycleResp.IsSuccess)
                {
                    Console.WriteLine("Successfully applied lifecycle configuration.");
                }
                else
                {
                    Console.Error.WriteLine("Failed to apply lifecycle configuration.");
                }
            }
        }
示例#17
0
 public SimpleClient(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient, IMultipartTransfer multipartTransfer, ITransfer transfer, ISignedObjectClient signedObject)
 {
     Initialize(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObject);
 }
示例#18
0
        private static async Task AsyncMain(string[] arg, Factory fac)
        {
            var argument   = Console.ReadLine();
            var argo       = argument.Split(' ').Where(x => x.Trim() != "").ToArray();
            var clientType = argo[0];
            var args       = argo.Skip(1).ToArray();

            try
            {
                IBucketClient client = fac.GetBucket(clientType.ToEnum());
                switch (args[0].ToLower())
                {
                case "bucket":
                    switch (args[1].ToLower())
                    {
                    case "exist":
                        var exist = await client.ExistBucket(args[2]);

                        Console.WriteLine(args[2] + " " + (exist ? "exists!" : "does not exist"));
                        break;

                    case "create":
                        var createResp = await client.CreateBucket(args[2]);

                        Console.WriteLine(JsonConvert.SerializeObject(createResp));
                        break;

                    case "del": goto case "delete";

                    case "delete":
                        var delResp = await client.DeleteBucket(args[2]);

                        Console.WriteLine(JsonConvert.SerializeObject(delResp));
                        break;

                    case "policy":
                        var policyResp = await client.SetReadPolicy(args[2], args[3] == "public"?ReadAccess.Public : ReadAccess.Private);

                        Console.WriteLine(JsonConvert.SerializeObject(policyResp));
                        break;

                    case "cors":
                        var corsResp = await client.SetGETCors(args[2], args.Length > 3?args.Skip(3).ToArray() : new string[] { });

                        Console.Write(JsonConvert.SerializeObject(corsResp));
                        break;

                    default:
                        Console.WriteLine("Unknown command!");
                        break;
                    }
                    break;

                case "blob":
                    var bucketKey = args[2];
                    var bucket    = await client.GetBucket(bucketKey);

                    var argv = args[3];
                    switch (args[1].ToLower())
                    {
                    case "exist":
                        var exist = await bucket.ExistBlob(argv);

                        Console.WriteLine(argv + " " + (exist ? "exists!" : "does not exist"));
                        break;

                    case "create":
                        byte[] file       = File.ReadAllBytes($@"{Directory.GetCurrentDirectory()}/{args[4]}");
                        var    createResp = await bucket.CreateBlob(file, argv);

                        Console.WriteLine(JsonConvert.SerializeObject(createResp));
                        break;

                    case "del": goto case "delete";

                    case "delete":
                        var delResp = await bucket.DeleteBlob(argv);

                        Console.WriteLine(JsonConvert.SerializeObject(delResp));
                        break;

                    case "update":
                        byte[] updateFile = File.ReadAllBytes($@"{Directory.GetCurrentDirectory()}/{args[4]}");
                        var    updateResp = await bucket.UpdateBlob(updateFile, argv);

                        Console.WriteLine(JsonConvert.SerializeObject(updateResp));
                        break;

                    case "put":
                        byte[] putFile = File.ReadAllBytes($@"{Directory.GetCurrentDirectory()}/{args[4]}");
                        var    putResp = await bucket.PutBlob(putFile, argv);

                        Console.WriteLine(JsonConvert.SerializeObject(putResp));
                        break;

                    default:
                        Console.WriteLine("Unknown command!");
                        break;
                    }
                    break;

                case "test":
                    byte[] putFileTest = File.ReadAllBytes($@"{Directory.GetCurrentDirectory()}/{args[3]}");
                    var    putRespTest = await client.PutBlob(putFileTest, new Uri($"https://{LoadConfiguration("secrets.json").DO.region.ToString()}.digitaloceanspaces.com/{args[1]}/{args[2]}"));

                    Console.WriteLine(JsonConvert.SerializeObject(putRespTest));
                    break;

                default:
                    Console.WriteLine("Unknown command");
                    break;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine("Invalid number of arguments");
            }
            await AsyncMain(arg, fac);
        }
示例#19
0
 internal AmazonS3Client(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient, IMultipartTransfer multipartTransfer, ITransfer transfer, ISignedObjectClient signedObjectClient) : base(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObjectClient)
 {
 }
示例#20
0
 protected internal ClientBase(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient, IMultipartTransfer multipartTransfer, ITransfer transfer, ISignedObjectClient signedObjectClient)
 {
     Client = new SimpleClient(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObjectClient);
 }
示例#21
0
 public GCPBucket(StorageClient client, Bucket bucket, IBucketClient bucketClient)
 {
     _client       = client ?? throw new ArgumentNullException(nameof(client));
     _bucket       = bucket ?? throw new ArgumentNullException(nameof(bucket));
     _bucketClient = bucketClient ?? throw new ArgumentNullException(nameof(bucketClient));
 }
示例#22
0
 internal GoogleCloudStorageClient(IObjectClient objectClient, IBucketClient bucketClient, IMultipartClient multipartClient, IMultipartTransfer multipartTransfer, ITransfer transfer, ISignedObjectClient signedObjectClient)
     : base(objectClient, bucketClient, multipartClient, multipartTransfer, transfer, signedObjectClient)
 {
 }