示例#1
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <LocationConstraint> BucketReadLocation(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("BucketReadLocation: " + ctx.Request.Bucket);

            return(new LocationConstraint(_Location));
        }
示例#2
0
        private async Task DeleteCredentials(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length != 3)
            {
                await ctx.Response.Send(S3ServerInterface.S3Objects.ErrorCode.InvalidRequest);

                return;
            }

            Credential cred = _Config.GetCredentialByAccessKey(ctx.Http.Request.Url.Elements[2]);

            if (cred == null)
            {
                ctx.Response.StatusCode  = 404;
                ctx.Response.ContentType = "text/plain";
                await ctx.Response.Send();

                return;
            }

            _Config.DeleteCredential(cred.GUID);

            ctx.Response.StatusCode  = 204;
            ctx.Response.ContentType = "text/plain";
            await ctx.Response.Send();

            return;
        }
示例#3
0
文件: Program.cs 项目: jchristn/Less3
        private static async Task PostRequestHandler(S3Context ctx)
        {
            string header = "[" + ctx.Http.Request.Source.IpAddress + ":" + ctx.Http.Request.Source.Port + " " + ctx.Http.Request.Method.ToString() + " " + ctx.Http.Request.Url.RawWithoutQuery + "] ";

            _Logging.Debug(header + ctx.Http.Response.StatusCode);
            // _Logging.Debug(header + ctx.Http.Response.StatusCode + Environment.NewLine + Common.SerializeJson(ctx.Response, true) + Environment.NewLine + ctx.Response.DataAsString);
        }
示例#4
0
        private async Task GetCredentials(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length >= 3)
            {
                Credential cred = _Config.GetCredentialByAccessKey(ctx.Http.Request.Url.Elements[2]);
                if (cred == null)
                {
                    ctx.Response.StatusCode  = 404;
                    ctx.Response.ContentType = "text/plain";
                    await ctx.Response.Send();

                    return;
                }
                else
                {
                    ctx.Response.StatusCode  = 200;
                    ctx.Response.ContentType = "application/json";
                    await ctx.Response.Send(Common.SerializeJson(cred, true));

                    return;
                }
            }
            else
            {
                List <Credential> creds = _Config.GetCredentials();
                ctx.Response.StatusCode  = 200;
                ctx.Response.ContentType = "application/json";
                await ctx.Response.Send(Common.SerializeJson(creds, true));

                return;
            }
        }
示例#5
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task ObjectWrite(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectWrite      : " + ctx.Request.Bucket + "/" + ctx.Request.Key);
            Console.WriteLine("Chunked transfer : " + ctx.Request.Chunked);

            if (ctx.Request.Chunked)
            {
                while (true)
                {
                    Chunk chunk = ctx.Request.ReadChunk().Result;
                    Console.WriteLine(Common.SerializeJson(chunk, true));

                    Console.Write(chunk.Length + ": ");

                    if (chunk.Length > 0)
                    {
                        Console.WriteLine(chunk.Length + "/" + chunk.IsFinalChunk + ": " + Encoding.UTF8.GetString(chunk.Data));
                    }
                    if (chunk.IsFinalChunk)
                    {
                        Console.WriteLine("Final chunk encountered");
                        break;
                    }
                }
            }
            else
            {
                Console.WriteLine(ctx.Request.ContentLength + ": " + ctx.Request.DataAsString);
            }
        }
示例#6
0
        internal bool Authenticate(
            S3Context ctx,
            out User user,
            out Credential cred)
        {
            user = null;
            cred = null;
            if (ctx == null)
            {
                throw new ArgumentNullException(nameof(ctx));
            }
            if (String.IsNullOrEmpty(ctx.Request.AccessKey))
            {
                return(false);
            }

            user = _Config.GetUserByAccessKey(ctx.Request.AccessKey);
            if (user == null)
            {
                return(false);
            }

            cred = _Config.GetCredentialByAccessKey(ctx.Request.AccessKey);
            if (cred == null)
            {
                return(false);
            }

            return(true);
        }
示例#7
0
        private async Task DeleteBuckets(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length != 3)
            {
                await ctx.Response.Send(S3ServerInterface.S3Objects.ErrorCode.InvalidRequest);

                return;
            }

            Bucket bucket = _Config.GetBucketByName(ctx.Http.Request.Url.Elements[2]);

            if (bucket == null)
            {
                ctx.Response.StatusCode  = 404;
                ctx.Response.ContentType = "text/plain";
                await ctx.Response.Send();

                return;
            }

            bool destroy = false;

            if (ctx.Http.Request.Query.Elements.ContainsKey("destroy"))
            {
                destroy = true;
            }
            _Buckets.Remove(bucket, destroy);

            ctx.Response.StatusCode  = 204;
            ctx.Response.ContentType = "text/plain";
            await ctx.Response.Send();

            return;
        }
示例#8
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <S3Object> ObjectRead(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectRead: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            return(_S3Object);
        }
示例#9
0
        private async Task DeleteUsers(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length != 3)
            {
                await ctx.Response.Send(S3ServerInterface.S3Objects.ErrorCode.InvalidRequest);

                return;
            }

            User user = _Config.GetUserByGuid(ctx.Http.Request.Url.Elements[2]);

            if (user == null)
            {
                ctx.Response.StatusCode  = 404;
                ctx.Response.ContentType = "text/plain";
                await ctx.Response.Send();

                return;
            }

            _Config.DeleteUser(user.GUID);

            ctx.Response.StatusCode  = 204;
            ctx.Response.ContentType = "text/plain";
            await ctx.Response.Send();

            return;
        }
示例#10
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <ObjectMetadata> ObjectExists(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectExists: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            return(_ObjectMetadata);
        }
示例#11
0
        private async Task GetBuckets(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length >= 3)
            {
                Bucket bucket = _Buckets.Get(ctx.Http.Request.Url.Elements[2]);
                if (bucket == null)
                {
                    ctx.Response.StatusCode  = 404;
                    ctx.Response.ContentType = "text/plain";
                    await ctx.Response.Send();

                    return;
                }
                else
                {
                    ctx.Response.StatusCode  = 200;
                    ctx.Response.ContentType = "application/json";
                    await ctx.Response.Send(Common.SerializeJson(bucket, true));

                    return;
                }
            }
            else
            {
                List <Bucket> buckets = _Config.GetBuckets();
                ctx.Response.StatusCode  = 200;
                ctx.Response.ContentType = "application/json";
                await ctx.Response.Send(Common.SerializeJson(buckets, true));

                return;
            }
        }
示例#12
0
        private async Task GetUsers(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length >= 3)
            {
                User user = _Config.GetUserByName(ctx.Http.Request.Url.Elements[2]);
                if (user == null)
                {
                    ctx.Response.StatusCode  = 404;
                    ctx.Response.ContentType = "text/plain";
                    await ctx.Response.Send();

                    return;
                }
                else
                {
                    ctx.Response.StatusCode  = 200;
                    ctx.Response.ContentType = "application/json";
                    await ctx.Response.Send(Common.SerializeJson(user, true));

                    return;
                }
            }
            else
            {
                List <User> users = _Config.GetUsers();
                ctx.Response.StatusCode  = 200;
                ctx.Response.ContentType = "application/json";
                await ctx.Response.Send(Common.SerializeJson(users, true));

                return;
            }
        }
示例#13
0
    public void SetUp()
    {
        var credentialsOptions  = new CredentialsOptions();
        var credentialsProvider = new CredentialsProvider(credentialsOptions);
        var options             = new S3Options <S3ContextTests>();

        _context = new S3Context <S3ContextTests>(credentialsProvider, options);
    }
示例#14
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <Retention> ObjectReadRetention(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectReadRetention: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            Retention ret = new Retention("GOVERNANCE", DateTime.Now.AddDays(100));

            return(ret);
        }
示例#15
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <LegalHold> ObjectReadLegalHold(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectReadLegalHold: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            LegalHold legalHold = new LegalHold("OFF");

            return(legalHold);
        }
示例#16
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <VersioningConfiguration> BucketReadVersioning(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("BucketReadVersioning: " + ctx.Request.Bucket);

            VersioningConfiguration vc = new VersioningConfiguration("Enabled", "Enabled");

            return(vc);
        }
示例#17
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <BucketLoggingStatus> BucketReadLogging(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("BucketReadLogging: " + ctx.Request.Bucket);

            BucketLoggingStatus status = new BucketLoggingStatus(new LoggingEnabled("default", "prefix", new TargetGrants()));

            return(status);
        }
示例#18
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <Tagging> ObjectReadTags(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectReadTags: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            Tagging tagging = new Tagging(new TagSet(new List <Tag> {
                _Tag
            }));

            return(tagging);
        }
 static async Task ObjectWrite(S3Context ctx)
 {
     if (ctx.Request.Chunked)
     {
         await SendChunkResponse(ctx, "Object write chunked");
     }
     else
     {
         await SendResponse(ctx, "Object write");
     }
 }
示例#20
0
 internal static RequestMetadata GetRequestMetadata(S3Context ctx)
 {
     if (ctx == null)
     {
         return(null);
     }
     if (ctx.Metadata == null)
     {
         return(null);
     }
     return((RequestMetadata)(ctx.Metadata));
 }
示例#21
0
        private async Task PostUsers(S3Context ctx)
        {
            if (ctx.Http.Request.Url.Elements.Length != 2)
            {
                await ctx.Response.Send(S3ServerInterface.S3Objects.ErrorCode.InvalidRequest);

                return;
            }

            byte[] data = null;
            User   user = null;

            try
            {
                data = Common.StreamToBytes(ctx.Request.Data);
                user = Common.DeserializeJson <User>(data);
            }
            catch (Exception)
            {
                await ctx.Response.Send(S3ServerInterface.S3Objects.ErrorCode.InvalidRequest);

                return;
            }

            User tempUser = _Config.GetUserByEmail(user.Email);

            if (tempUser != null)
            {
                ctx.Response.StatusCode  = 409;
                ctx.Response.ContentType = "text/plain";
                await ctx.Response.Send();

                return;
            }

            tempUser = _Config.GetUserByGuid(user.GUID);
            if (tempUser != null)
            {
                ctx.Response.StatusCode  = 409;
                ctx.Response.ContentType = "text/plain";
                await ctx.Response.Send();

                return;
            }

            _Config.AddUser(user);

            ctx.Response.StatusCode  = 201;
            ctx.Response.ContentType = "text/plain";
            await ctx.Response.Send();
        }
示例#22
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <S3Object> ObjectReadRange(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectReadRange: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            string data = _S3Object.DataString;

            data = data.Substring((int)ctx.Request.RangeStart, (int)((int)ctx.Request.RangeEnd - (int)ctx.Request.RangeStart));
            int len = data.Length;

            _S3Object.DataString = data;
            _S3Object.Size       = len;
            return(_S3Object);
        }
示例#23
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <ListBucketResult> BucketRead(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("BucketRead: " + ctx.Request.Bucket);

            List <ObjectMetadata> contents = new List <ObjectMetadata>()
            {
                _ObjectMetadata
            };

            ListBucketResult result = new ListBucketResult("default", contents, 1, 1);

            return(result);
        }
        static async Task SendChunkResponse(S3Context ctx, string text)
        {
            Console.WriteLine("[" + ctx.Http.Request.Source.IpAddress + ":" + ctx.Http.Request.Source.Port + "] " + text);

            byte[] data = Encoding.UTF8.GetBytes(text);

            ctx.Response.StatusCode    = 200;
            ctx.Response.ContentType   = "text/plain";
            ctx.Response.ContentLength = data.Length;

            await ctx.Response.SendFinalChunk(data);

            return;
        }
示例#25
0
        internal async Task ListBuckets(S3Context ctx)
        {
            string header = "[" + ctx.Http.Request.Source.IpAddress + ":" + ctx.Http.Request.Source.Port + " " + ctx.Request.RequestType.ToString() + "] ";

            RequestMetadata md = ApiHelper.GetRequestMetadata(ctx);

            if (md == null)
            {
                _Logging.Warn(header + "unable to retrieve metadata");
                await ctx.Response.Send(ErrorCode.InternalError);

                return;
            }

            if (md.Authentication != AuthenticationResult.Authenticated)
            {
                _Logging.Warn(header + "requestor not authenticated");
                await ctx.Response.Send(ErrorCode.AccessDenied);

                return;
            }
            else
            {
                md.Authorization = AuthorizationResult.PermitService;
            }

            List <Classes.Bucket> buckets = _Buckets.GetUserBuckets(md.User.GUID);

            ListAllMyBucketsResult listBucketsResult = new ListAllMyBucketsResult();

            listBucketsResult.Owner             = new S3ServerInterface.S3Objects.Owner();
            listBucketsResult.Owner.DisplayName = md.User.Name;
            listBucketsResult.Owner.ID          = md.User.Name;

            listBucketsResult.Buckets        = new Buckets();
            listBucketsResult.Buckets.Bucket = new List <S3ServerInterface.S3Objects.Bucket>();

            foreach (Classes.Bucket curr in buckets)
            {
                S3ServerInterface.S3Objects.Bucket b = new S3ServerInterface.S3Objects.Bucket();
                b.Name         = curr.Name;
                b.CreationDate = curr.CreatedUtc;
                listBucketsResult.Buckets.Bucket.Add(b);
            }

            await ApiHelper.SendSerializedResponse <ListAllMyBucketsResult>(ctx, listBucketsResult);

            return;
        }
示例#26
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <DeleteResult> ObjectDeleteMultiple(S3Context ctx, DeleteMultiple del)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectDelete: " + ctx.Request.Bucket);
            Console.WriteLine(ctx.Request.DataAsString + Environment.NewLine);

            DeleteResult result = new DeleteResult(
                new List <Deleted>()
            {
                new Deleted("hello.txt", "1", false)
            },
                null);

            return(result);
        }
示例#27
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <ListAllMyBucketsResult> ListBuckets(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ListBuckets");

            ListAllMyBucketsResult result = new ListAllMyBucketsResult();

            result.Owner = new Owner("admin", "Administrator");

            List <Bucket> buckets = new List <Bucket>()
            {
                new Bucket("default", DateTime.Now)
            };

            result.Buckets = new Buckets(buckets);
            return(result);
        }
示例#28
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <AccessControlPolicy> ObjectReadAcl(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("ObjectReadAcl: " + ctx.Request.Bucket + "/" + ctx.Request.Key);

            AccessControlList acl = new AccessControlList(
                new List <Grant>()
            {
                new Grant(_Grantee, "FULL_CONTROL")
            });

            AccessControlPolicy policy = new AccessControlPolicy(
                _Owner,
                acl);

            return(policy);
        }
        static async Task SendResponse(S3Context ctx, string text)
        {
            Console.WriteLine("[" + ctx.Http.Request.Source.IpAddress + ":" + ctx.Http.Request.Source.Port + "] " + text);

            byte[] data = Encoding.UTF8.GetBytes(text);

            ctx.Response.StatusCode    = 200;
            ctx.Response.ContentType   = "text/plain";
            ctx.Response.ContentLength = data.Length;
            ctx.Response.Data          = new MemoryStream();
            ctx.Response.Data.Write(data, 0, data.Length);
            ctx.Response.Data.Seek(0, SeekOrigin.Begin);

            await ctx.Response.Send();

            return;
        }
示例#30
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        static async Task <WebsiteConfiguration> BucketReadWebsite(S3Context ctx)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            Console.WriteLine("BucketReadWebsite: " + ctx.Request.Bucket);

            WebsiteConfiguration website = new WebsiteConfiguration();

            website.ErrorDocument         = new ErrorDocument("error.html");
            website.IndexDocument         = new IndexDocument("index.html");
            website.RedirectAllRequestsTo = new RedirectAllRequestsTo("localhost", "http");
            website.RoutingRules          = new RoutingRules(
                new List <RoutingRule> {
                new RoutingRule(new Condition("400", "prefix"),
                                new Redirect("localhost", "302", "http", null, null))
            }
                );
            return(website);
        }