From f0005a004785da2d679841bd99b0956fcdf2c3a3 Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 11 Jun 2024 12:46:46 -0700 Subject: [PATCH 1/2] fix: restore object request handler and scoutfs glacier enable The restore object api request handler was incorrectly trying to unmarshal the request body, but for the stadnard (all?) case the request body is emtpy. We only need the bucket and opbject params for now. This also adds a fix to actually honor the enable glacier mode in scoutfs. --- backend/scoutfs/scoutfs_compat.go | 13 +++++++------ s3api/controllers/base.go | 23 +++++------------------ s3api/controllers/base_test.go | 11 +---------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/backend/scoutfs/scoutfs_compat.go b/backend/scoutfs/scoutfs_compat.go index 48fc9f11..fdd15c29 100644 --- a/backend/scoutfs/scoutfs_compat.go +++ b/backend/scoutfs/scoutfs_compat.go @@ -50,12 +50,13 @@ func New(rootdir string, opts ScoutfsOpts) (*ScoutFS, error) { } return &ScoutFS{ - Posix: p, - rootfd: f, - rootdir: rootdir, - meta: metastore, - chownuid: opts.ChownUID, - chowngid: opts.ChownGID, + Posix: p, + rootfd: f, + rootdir: rootdir, + meta: metastore, + chownuid: opts.ChownUID, + chowngid: opts.ChownGID, + glaciermode: opts.GlacierMode, }, nil } diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index 1887ebac..361b1782 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -2548,23 +2548,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { key = key + "/" } - var restoreRequest s3.RestoreObjectInput if ctx.Request().URI().QueryArgs().Has("restore") { - err := xml.Unmarshal(ctx.Body(), &restoreRequest) - if err != nil { - if c.debug { - log.Printf("error unmarshalling restore object: %v", err) - } - return SendResponse(ctx, err, - &MetaOpts{ - Logger: c.logger, - MetricsMng: c.mm, - Action: metrics.ActionRestoreObject, - BucketOwner: parsedAcl.Owner, - }) - } - - err = auth.VerifyAccess(ctx.Context(), c.be, + err := auth.VerifyAccess(ctx.Context(), c.be, auth.AccessOptions{ Readonly: c.readonly, Acl: parsedAcl, @@ -2585,8 +2570,10 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { }) } - restoreRequest.Bucket = &bucket - restoreRequest.Key = &key + restoreRequest := s3.RestoreObjectInput{ + Bucket: &bucket, + Key: &key, + } err = c.be.RestoreObject(ctx.Context(), &restoreRequest) return SendResponse(ctx, err, diff --git a/s3api/controllers/base_test.go b/s3api/controllers/base_test.go index 5a40ef52..74a994f0 100644 --- a/s3api/controllers/base_test.go +++ b/s3api/controllers/base_test.go @@ -1646,20 +1646,11 @@ func TestS3ApiController_CreateActions(t *testing.T) { { name: "Restore-object-success", app: app, - args: args{ - req: httptest.NewRequest(http.MethodPost, "/my-bucket/my-key?restore", strings.NewReader(`body`)), - }, - wantErr: false, - statusCode: 200, - }, - { - name: "Restore-object-error", - app: app, args: args{ req: httptest.NewRequest(http.MethodPost, "/my-bucket/my-key?restore", nil), }, wantErr: false, - statusCode: 500, + statusCode: 200, }, { name: "Select-object-content-invalid-body", From 8fa2b58f8eb68e8690d983df6094cffc97305f7e Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Tue, 11 Jun 2024 16:37:56 -0400 Subject: [PATCH 2/2] fix: fixed RestoreObject action request body parsing --- s3api/controllers/base.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index 361b1782..e4bea924 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -2549,6 +2549,18 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { } if ctx.Request().URI().QueryArgs().Has("restore") { + var restoreRequest types.RestoreRequest + if err := xml.Unmarshal(ctx.Body(), &restoreRequest); err != nil { + if !errors.Is(io.EOF, err) { + return SendResponse(ctx, s3err.GetAPIError(s3err.ErrMalformedXML), + &MetaOpts{ + Logger: c.logger, + MetricsMng: c.mm, + Action: metrics.ActionRestoreObject, + BucketOwner: parsedAcl.Owner, + }) + } + } err := auth.VerifyAccess(ctx.Context(), c.be, auth.AccessOptions{ Readonly: c.readonly, @@ -2570,12 +2582,11 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { }) } - restoreRequest := s3.RestoreObjectInput{ - Bucket: &bucket, - Key: &key, - } - - err = c.be.RestoreObject(ctx.Context(), &restoreRequest) + err = c.be.RestoreObject(ctx.Context(), &s3.RestoreObjectInput{ + Bucket: &bucket, + Key: &key, + RestoreRequest: &restoreRequest, + }) return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger,