From 5ae791b154414b08312ab0bacfa4a2053df3ff15 Mon Sep 17 00:00:00 2001 From: niksis02 Date: Thu, 19 Feb 2026 21:43:02 +0400 Subject: [PATCH] feat: configuration option to disable ACLs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #1847 This PR introduces a global optional gateway CLI flag `--disable-acl` (`VGW_DISABLE_ACL`) to disable ACL handling. When this flag is enabled, the gateway ignores all ACL-related headers, particularly in `CreateBucket`, `PutObject`, `CopyObject`, and `CreateMultipartUpload`. `GetBucketAcl` behavior is unchanged simply returning the bucket ACL config. There's no change in object ACL actions(`PutObjectACL`, `GetObjectACL`). They return a`NotImplemented` error as before. A new custom error is added for PutBucketAcl calls when ACLs are disabled at the gateway level. Its HTTP status code and error code match AWS S3’s behavior, with only a slightly different error message. In the access-control checker, ACL evaluation is fully bypassed. If ACLs are disabled only the bucket owner gets access to the bucket and all grantee checks are ignored. The PR also includes minor refactoring of the S3 API server and router. The growing list of parameters passed to the router’s Init method has been consolidated into fields within the router struct, initialized during router construction. Parameters not needed by the S3 server are no longer stored in the server configuration and are instead forwarded directly to the router. --- auth/access-control.go | 3 +- auth/acl.go | 12 +- cmd/versitygw/main.go | 11 + cmd/versitygw/test.go | 5 + extra/example.conf | 7 + runtests.sh | 83 ++- s3api/controllers/admin_test.go | 2 +- s3api/controllers/base.go | 12 +- s3api/controllers/bucket-delete.go | 5 + s3api/controllers/bucket-get.go | 13 + s3api/controllers/bucket-head.go | 1 + s3api/controllers/bucket-post.go | 1 + s3api/controllers/bucket-put.go | 28 +- s3api/controllers/object-delete.go | 3 + s3api/controllers/object-get.go | 7 + s3api/controllers/object-head.go | 1 + s3api/controllers/object-post.go | 6 +- s3api/controllers/object-put.go | 10 +- s3api/router.go | 978 +++++++++++++++-------------- s3api/router_cors_test.go | 148 ++--- s3api/router_test.go | 12 +- s3api/server.go | 54 +- s3api/utils/utils.go | 6 +- s3err/s3err.go | 6 + tests/integration/group-tests.go | 17 + tests/integration/no_acl.go | 245 ++++++++ 26 files changed, 1045 insertions(+), 631 deletions(-) create mode 100644 tests/integration/no_acl.go diff --git a/auth/access-control.go b/auth/access-control.go index 95fcfb72..53daae36 100644 --- a/auth/access-control.go +++ b/auth/access-control.go @@ -79,6 +79,7 @@ type AccessOptions struct { Action Action Readonly bool IsPublicRequest bool + DisableACL bool } func VerifyAccess(ctx context.Context, be backend.Backend, opts AccessOptions) error { @@ -107,7 +108,7 @@ func VerifyAccess(ctx context.Context, be backend.Backend, opts AccessOptions) e return VerifyBucketPolicy(policy, opts.Acc.Access, opts.Bucket, opts.Object, opts.Action) } - if err := verifyACL(opts.Acl, opts.Acc.Access, opts.AclPermission); err != nil { + if err := verifyACL(opts.Acl, opts.Acc.Access, opts.AclPermission, opts.DisableACL); err != nil { return err } diff --git a/auth/acl.go b/auth/acl.go index a69c4270..9ce0c60e 100644 --- a/auth/acl.go +++ b/auth/acl.go @@ -414,7 +414,17 @@ func splitUnique(s, divider string) []string { return result } -func verifyACL(acl ACL, access string, permission Permission) error { +func verifyACL(acl ACL, access string, permission Permission, disableACL bool) error { + if disableACL { + // only the bucket owner should have access to the bucket + // as bucket ACLs are disabled and no grantee check is necessary + if acl.Owner != access { + return s3err.GetAPIError(s3err.ErrAccessDenied) + } + + return nil + } + grantee := Grantee{ Access: access, Permission: permission, diff --git a/cmd/versitygw/main.go b/cmd/versitygw/main.go index bfcc1b22..d09e743d 100644 --- a/cmd/versitygw/main.go +++ b/cmd/versitygw/main.go @@ -100,6 +100,7 @@ var ( webuiNoTLS bool webuiGateways []string webuiAdminGateways []string + disableACLs bool ) var ( @@ -341,6 +342,13 @@ func initFlags() []cli.Flag { Destination: &virtualDomain, Aliases: []string{"vd"}, }, + &cli.BoolFlag{ + Name: "disable-acl", + Usage: "disables gateway ACLs, by ignoring all ACL headers", + EnvVars: []string{"VGW_DISABLE_ACL"}, + Destination: &disableACLs, + Aliases: []string{"noacl"}, + }, &cli.StringFlag{ Name: "access-log", Usage: "enable server access logging to specified file", @@ -833,6 +841,9 @@ func runGateway(ctx context.Context, be backend.Backend) error { if keepAlive { opts = append(opts, s3api.WithKeepAlive()) } + if disableACLs { + opts = append(opts, s3api.WithDisableACL()) + } if debug { debuglogger.SetDebugEnabled() } diff --git a/cmd/versitygw/test.go b/cmd/versitygw/test.go index e87363e0..b39b1cbd 100644 --- a/cmd/versitygw/test.go +++ b/cmd/versitygw/test.go @@ -152,6 +152,11 @@ func initTestCommands() []*cli.Command { Usage: "Tests gateway access control with bucket ACLs and Policies", Action: getAction(integration.TestAccessControl), }, + { + Name: "noacl", + Usage: "Tests gateway in ACL-disabled mode", + Action: getAction(integration.TestNoAclMode), + }, { Name: "bench", Usage: "Runs download/upload performance test on the gateway", diff --git a/extra/example.conf b/extra/example.conf index d63d52fa..8be8bd75 100644 --- a/extra/example.conf +++ b/extra/example.conf @@ -111,6 +111,13 @@ ROOT_SECRET_ACCESS_KEY= # operations will be allowed. #VGW_READ_ONLY=false +# Disable ACL support at the gateway level. All ACL headers on requests are +# ignored, and no access control is enforced using bucket ACLs. +# Prefer using bucket policies instead of ACLs for access management. +# PutBucketAcl returns an immediate AccessControlListNotSupported error. +# GetBucketAcl returns a successful response containing the default bucket ACL. +#VGW_DISABLE_ACL=false + # The VGW_VIRTUAL_DOMAIN option enables the virtual host style bucket # addressing. The path style addressing is the default, and remains enabled # even when virtual host style is enabled. The VGW_VIRTUAL_DOMAIN option diff --git a/runtests.sh b/runtests.sh index 48b08dc0..02cf0a24 100755 --- a/runtests.sh +++ b/runtests.sh @@ -5,8 +5,15 @@ rm -rf /tmp/gw mkdir /tmp/gw rm -rf /tmp/covdata mkdir /tmp/covdata -rm -rf /tmp/versioing.covdata +rm -rf /tmp/https.covdata +mkdir /tmp/https.covdata +rm -rf /tmp/versioning.covdata mkdir /tmp/versioning.covdata +rm -rf /tmp/versioning.https.covdata +mkdir /tmp/versioning.https.covdata +rm -rf /tmp/noacl.covdata +mkdir /tmp/noacl.covdata + rm -rf /tmp/versioningdir mkdir /tmp/versioningdir @@ -153,10 +160,74 @@ fi # kill off server kill $GW_VS_HTTPS_PID +ECHO "Running No ACL integration tests" +# run server in background versioning-enabled +# port: 7073 +GOCOVERDIR=/tmp/noacl.covdata ./versitygw -p :7074 -a user -s pass -noacl --iam-dir /tmp/gw posix /tmp/gw & +GW_NO_ACL_PID=$! + +# wait a second for server to start up +sleep 1 + +# check if noacl gateway process is still running +if ! kill -0 $GW_NO_ACL_PID; then + echo "noacl server no longer running" + exit 1 +fi + +if ! ./versitygw test --allow-insecure -a user -s pass -e http://127.0.0.1:7074 noacl; then + echo "No ACL integration tests failed" + kill $GW_NO_ACL_PID + exit 1 +fi + +# kill off server +kill $GW_NO_ACL_PID + exit 0 -# if the above binary was built with -cover enabled (make testbin), -# then the following can be used for code coverage reports: -# go tool covdata percent -i=/tmp/covdata -# go tool covdata textfmt -i=/tmp/covdata -o profile.txt -# go tool cover -html=profile.txt +# ----------------------------------------------------------------------------- +# Coverage Reports (Go 1.20+ Runtime Coverage) +# +# The servers above were started with GOCOVERDIR=, which causes Go to write +# raw coverage artifacts into those directories (covmeta + covcounters.* files). +# These raw files must be processed with "go tool covdata" to generate +# human-readable coverage reports. +# +# You may generate *per-environment* coverage or a *merged full-suite* report. +# +# ----------------------------------------------------------------------------- +# 1) INDIVIDUAL COVERAGE REPORTS +# +# Example for a single environment (e.g. /tmp/covdata): +# +# go tool covdata percent -i=/tmp/covdata +# go tool covdata textfmt -i=/tmp/covdata -o /tmp/profile.txt +# go tool cover -html=/tmp/profile.txt +# +# Repeat using: +# /tmp/covdata +# /tmp/https.covdata +# /tmp/versioning.covdata +# /tmp/versioning.https.covdata +# /tmp/noacl.covdata +# +# This gives you coverage metrics isolated per test suite / server mode. +# +# ----------------------------------------------------------------------------- +# 2) MERGED COVERAGE REPORT (RECOMMENDED) +# +# If you want a unified report combining all environments: +# +# go tool covdata merge \ +# -i=/tmp/covdata,/tmp/https.covdata,/tmp/versioning.covdata,/tmp/versioning.https.covdata,/tmp/noacl.covdata \ +# -o /tmp/allcovdata +# +# go tool covdata percent -i=/tmp/allcovdata +# go tool covdata textfmt -i=/tmp/allcovdata -o /tmp/all_profile.txt +# go tool cover -html=/tmp/all_profile.txt +# +# This produces the full aggregate coverage across all HTTP/HTTPS, +# versioning-enabled, non-versioning, and no-ACL test runs. +# +# ----------------------------------------------------------------------------- diff --git a/s3api/controllers/admin_test.go b/s3api/controllers/admin_test.go index a540f193..fc722263 100644 --- a/s3api/controllers/admin_test.go +++ b/s3api/controllers/admin_test.go @@ -681,7 +681,7 @@ func TestAdminController_CreateBucket(t *testing.T) { }, } - s3api := New(be, iam, nil, nil, nil, false, "") + s3api := New(be, iam, nil, nil, nil, false, false, "") ctrl := AdminController{ iam: iam, diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index cc8be7eb..80e95188 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -39,6 +39,7 @@ type S3ApiController struct { evSender s3event.S3EventSender mm metrics.Manager readonly bool + disableACL bool virtualDomain string } @@ -59,7 +60,7 @@ var ( xmlhdr = []byte(`` + "\n") ) -func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly bool, virtualDomain string) S3ApiController { +func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly, disableACL bool, virtualDomain string) S3ApiController { return S3ApiController{ be: be, iam: iam, @@ -67,10 +68,19 @@ func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs evSender: evs, readonly: readonly, mm: mm, + disableACL: disableACL, virtualDomain: virtualDomain, } } +func (c S3ApiController) getAclHeaderValue(ctx *fiber.Ctx, key string, defaultValues ...string) string { + if c.disableACL { + return "" + } + + return ctx.Get(key, defaultValues...) +} + // Returns MethodNotAllowed for unmatched routes func (c S3ApiController) HandleErrorRoute(err error) Controller { return func(ctx *fiber.Ctx) (*Response, error) { diff --git a/s3api/controllers/bucket-delete.go b/s3api/controllers/bucket-delete.go index 7b062b0a..20f89cc1 100644 --- a/s3api/controllers/bucket-delete.go +++ b/s3api/controllers/bucket-delete.go @@ -39,6 +39,7 @@ func (c S3ApiController) DeleteBucketTagging(ctx *fiber.Ctx) (*Response, error) Bucket: bucket, Action: auth.PutBucketTaggingAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -72,6 +73,7 @@ func (c S3ApiController) DeleteBucketOwnershipControls(ctx *fiber.Ctx) (*Respons Acc: acct, Bucket: bucket, Action: auth.PutBucketOwnershipControlsAction, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -105,6 +107,7 @@ func (c S3ApiController) DeleteBucketPolicy(ctx *fiber.Ctx) (*Response, error) { Acc: acct, Bucket: bucket, Action: auth.DeleteBucketPolicyAction, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -140,6 +143,7 @@ func (c S3ApiController) DeleteBucketCors(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.PutBucketCorsAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -175,6 +179,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.DeleteBucketAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/bucket-get.go b/s3api/controllers/bucket-get.go index aa5194a7..d1e1e7e3 100644 --- a/s3api/controllers/bucket-get.go +++ b/s3api/controllers/bucket-get.go @@ -41,6 +41,7 @@ func (c S3ApiController) GetBucketTagging(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.GetBucketTaggingAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -93,6 +94,7 @@ func (c S3ApiController) GetBucketOwnershipControls(ctx *fiber.Ctx) (*Response, Bucket: bucket, Action: auth.GetBucketOwnershipControlsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -133,6 +135,7 @@ func (c S3ApiController) GetBucketVersioning(ctx *fiber.Ctx) (*Response, error) Bucket: bucket, Action: auth.GetBucketVersioningAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -175,6 +178,7 @@ func (c S3ApiController) GetBucketCors(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.GetBucketCorsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -218,6 +222,7 @@ func (c S3ApiController) GetBucketPolicy(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.GetBucketPolicyAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -252,6 +257,7 @@ func (c S3ApiController) GetBucketPolicyStatus(ctx *fiber.Ctx) (*Response, error Bucket: bucket, Action: auth.GetBucketPolicyStatusAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -313,6 +319,7 @@ func (c S3ApiController) ListObjectVersions(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.ListBucketVersionsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -366,6 +373,7 @@ func (c S3ApiController) GetObjectLockConfiguration(ctx *fiber.Ctx) (*Response, Bucket: bucket, Action: auth.GetBucketObjectLockConfigurationAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -411,6 +419,7 @@ func (c S3ApiController) GetBucketAcl(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.GetBucketAclAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -462,6 +471,7 @@ func (c S3ApiController) ListMultipartUploads(ctx *fiber.Ctx) (*Response, error) Bucket: bucket, Action: auth.ListBucketMultipartUploadsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -519,6 +529,7 @@ func (c S3ApiController) ListObjectsV2(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.ListBucketAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -576,6 +587,7 @@ func (c S3ApiController) ListObjects(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.ListBucketAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -627,6 +639,7 @@ func (c S3ApiController) GetBucketLocation(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.GetBucketLocationAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/bucket-head.go b/s3api/controllers/bucket-head.go index ed6696f8..4861d507 100644 --- a/s3api/controllers/bucket-head.go +++ b/s3api/controllers/bucket-head.go @@ -42,6 +42,7 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.ListBucketAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/bucket-post.go b/s3api/controllers/bucket-post.go index be3d3bd3..52819da9 100644 --- a/s3api/controllers/bucket-post.go +++ b/s3api/controllers/bucket-post.go @@ -47,6 +47,7 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.DeleteObjectAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/bucket-put.go b/s3api/controllers/bucket-put.go index d532131f..47521ba1 100644 --- a/s3api/controllers/bucket-put.go +++ b/s3api/controllers/bucket-put.go @@ -47,6 +47,7 @@ func (c S3ApiController) PutBucketTagging(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.PutBucketTaggingAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -88,6 +89,7 @@ func (c S3ApiController) PutBucketOwnershipControls(ctx *fiber.Ctx) (*Response, Acc: acct, Bucket: bucket, Action: auth.PutBucketOwnershipControlsAction, + DisableACL: c.disableACL, }); err != nil { return &Response{ MetaOpts: &MetaOptions{ @@ -143,6 +145,7 @@ func (c S3ApiController) PutBucketVersioning(ctx *fiber.Ctx) (*Response, error) Bucket: bucket, Action: auth.PutBucketVersioningAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -197,6 +200,7 @@ func (c S3ApiController) PutObjectLockConfiguration(ctx *fiber.Ctx) (*Response, Bucket: bucket, Action: auth.PutBucketObjectLockConfigurationAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }); err != nil { return &Response{ MetaOpts: &MetaOptions{ @@ -238,6 +242,7 @@ func (c S3ApiController) PutBucketCors(ctx *fiber.Ctx) (*Response, error) { Bucket: bucket, Action: auth.PutBucketCorsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -292,6 +297,7 @@ func (c S3ApiController) PutBucketPolicy(ctx *fiber.Ctx) (*Response, error) { Acc: acct, Bucket: bucket, Action: auth.PutBucketPolicyAction, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -344,6 +350,7 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) { Acc: acct, Bucket: bucket, Action: auth.PutBucketAclAction, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -353,6 +360,15 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) { }, err } + if c.disableACL { + debuglogger.Logf("PutBucketAcl is not available, as ACLs are disabled at gateway level") + return &Response{ + MetaOpts: &MetaOptions{ + BucketOwner: parsedAcl.Owner, + }, + }, s3err.GetAPIError(s3err.ErrACLsDisabled) + } + err = auth.ValidateCannedACL(acl) if err != nil { return &Response{ @@ -480,12 +496,12 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) { func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) { bucket := ctx.Params("bucket") - acl := types.BucketCannedACL(ctx.Get("X-Amz-Acl")) - grantFullControl := ctx.Get("X-Amz-Grant-Full-Control") - grantRead := ctx.Get("X-Amz-Grant-Read") - grantReadACP := ctx.Get("X-Amz-Grant-Read-Acp") - grantWrite := ctx.Get("X-Amz-Grant-Write") - grantWriteACP := ctx.Get("X-Amz-Grant-Write-Acp") + acl := types.BucketCannedACL(c.getAclHeaderValue(ctx, "X-Amz-Acl")) + grantFullControl := c.getAclHeaderValue(ctx, "X-Amz-Grant-Full-Control") + grantRead := c.getAclHeaderValue(ctx, "X-Amz-Grant-Read") + grantReadACP := c.getAclHeaderValue(ctx, "X-Amz-Grant-Read-Acp") + grantWrite := c.getAclHeaderValue(ctx, "X-Amz-Grant-Write") + grantWriteACP := c.getAclHeaderValue(ctx, "X-Amz-Grant-Write-Acp") lockEnabled := strings.EqualFold(ctx.Get("X-Amz-Bucket-Object-Lock-Enabled"), "true") grants := grantFullControl + grantRead + grantReadACP + grantWrite + grantWriteACP objectOwnership := types.ObjectOwnership(ctx.Get("X-Amz-Object-Ownership")) diff --git a/s3api/controllers/object-delete.go b/s3api/controllers/object-delete.go index 3a3b6ee3..a374e5ab 100644 --- a/s3api/controllers/object-delete.go +++ b/s3api/controllers/object-delete.go @@ -52,6 +52,7 @@ func (c S3ApiController) DeleteObjectTagging(ctx *fiber.Ctx) (*Response, error) Object: key, Action: action, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -104,6 +105,7 @@ func (c S3ApiController) AbortMultipartUpload(ctx *fiber.Ctx) (*Response, error) Object: key, Action: auth.AbortMultipartUploadAction, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -158,6 +160,7 @@ func (c S3ApiController) DeleteObject(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: action, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/object-get.go b/s3api/controllers/object-get.go index 828f085c..4d212110 100644 --- a/s3api/controllers/object-get.go +++ b/s3api/controllers/object-get.go @@ -55,6 +55,7 @@ func (c S3ApiController) GetObjectTagging(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: action, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -121,6 +122,7 @@ func (c S3ApiController) GetObjectRetention(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.GetObjectRetentionAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -177,6 +179,7 @@ func (c S3ApiController) GetObjectLegalHold(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.GetObjectLegalHoldAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -223,6 +226,7 @@ func (c S3ApiController) GetObjectAcl(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.GetObjectAclAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -265,6 +269,7 @@ func (c S3ApiController) ListParts(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.ListMultipartUploadPartsAction, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -336,6 +341,7 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error) Object: key, Action: action, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -469,6 +475,7 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: action, IsPublicRequest: isPublicBucketRequest, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/object-head.go b/s3api/controllers/object-head.go index 87e6e22c..f4fe4b6e 100644 --- a/s3api/controllers/object-head.go +++ b/s3api/controllers/object-head.go @@ -57,6 +57,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: action, IsPublicRequest: isPublicBucket, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/object-post.go b/s3api/controllers/object-post.go index 1e87274c..3d34dbc3 100644 --- a/s3api/controllers/object-post.go +++ b/s3api/controllers/object-post.go @@ -50,6 +50,7 @@ func (c S3ApiController) RestoreObject(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.RestoreObjectAction, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -101,6 +102,7 @@ func (c S3ApiController) SelectObjectContent(ctx *fiber.Ctx) (*Response, error) Object: key, Action: auth.GetObjectAction, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -158,7 +160,7 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error isRoot := utils.ContextKeyIsRoot.Get(ctx).(bool) parsedAcl := utils.ContextKeyParsedAcl.Get(ctx).(auth.ACL) - err := utils.ValidateNoACLHeaders(ctx) + err := utils.ValidateNoACLHeaders(ctx, c.disableACL) if err != nil { return &Response{ MetaOpts: &MetaOptions{ @@ -177,6 +179,7 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error Bucket: bucket, Object: key, Action: auth.PutObjectAction, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -261,6 +264,7 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err Object: key, Action: auth.PutObjectAction, IsPublicRequest: isBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/controllers/object-put.go b/s3api/controllers/object-put.go index caccab47..7dc3d484 100644 --- a/s3api/controllers/object-put.go +++ b/s3api/controllers/object-put.go @@ -57,6 +57,7 @@ func (c S3ApiController) PutObjectTagging(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: action, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -116,6 +117,7 @@ func (c S3ApiController) PutObjectRetention(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.PutObjectRetentionAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -191,6 +193,7 @@ func (c S3ApiController) PutObjectLegalHold(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.PutObjectLegalHoldAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -269,6 +272,7 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.PutObjectAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -383,6 +387,7 @@ func (c S3ApiController) UploadPartCopy(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.PutObjectAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ @@ -510,7 +515,7 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) { isRoot := utils.ContextKeyIsRoot.Get(ctx).(bool) parsedAcl := utils.ContextKeyParsedAcl.Get(ctx).(auth.ACL) - err := utils.ValidateNoACLHeaders(ctx) + err := utils.ValidateNoACLHeaders(ctx, c.disableACL) if err != nil { return &Response{ MetaOpts: &MetaOptions{ @@ -668,7 +673,7 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) { parsedAcl := utils.ContextKeyParsedAcl.Get(ctx).(auth.ACL) IsBucketPublic := utils.ContextKeyPublicBucket.IsSet(ctx) - err := utils.ValidateNoACLHeaders(ctx) + err := utils.ValidateNoACLHeaders(ctx, c.disableACL) if err != nil { return &Response{ MetaOpts: &MetaOptions{ @@ -703,6 +708,7 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) { Object: key, Action: auth.PutObjectAction, IsPublicRequest: IsBucketPublic, + DisableACL: c.disableACL, }) if err != nil { return &Response{ diff --git a/s3api/router.go b/s3api/router.go index 8816f496..04c0fd46 100644 --- a/s3api/router.go +++ b/s3api/router.go @@ -27,141 +27,159 @@ import ( ) type S3ApiRouter struct { - WithAdmSrv bool - Ctrl controllers.S3ApiController + WithAdmSrv bool + app *fiber.App + be backend.Backend + iam auth.IAMService + logger s3log.AuditLogger + aLogger s3log.AuditLogger + evs s3event.S3EventSender + mm metrics.Manager + root middlewares.RootUserConfig + Ctrl controllers.S3ApiController + readonly bool + disableACL bool + region string + virtualDomain string + corsAllowOrigin string } -func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, aLogger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly bool, region, virtualDomain string, root middlewares.RootUserConfig, corsAllowOrigin string) { - ctrl := controllers.New(be, iam, logger, evs, mm, readonly, virtualDomain) +func (sa *S3ApiRouter) Init() { + ctrl := controllers.New(sa.be, sa.iam, sa.logger, sa.evs, sa.mm, sa.readonly, sa.disableACL, sa.virtualDomain) sa.Ctrl = ctrl adminServices := &controllers.Services{ - Logger: aLogger, + Logger: sa.aLogger, + } + + // initialize global host-style parser middleware if virtual domain is specified + if sa.virtualDomain != "" { + sa.app.Use(middlewares.HostStyleParser(sa.virtualDomain)) } if sa.WithAdmSrv { - adminController := controllers.NewAdminController(iam, be, aLogger, ctrl) + adminController := controllers.NewAdminController(sa.iam, sa.be, sa.aLogger, ctrl) // CreateUser admin api - app.Patch("/create-user", + sa.app.Patch("/create-user", controllers.ProcessHandlers(adminController.CreateUser, metrics.ActionAdminCreateUser, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminCreateUser), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/create-user", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/create-user", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // DeleteUsers admin api - app.Patch("/delete-user", + sa.app.Patch("/delete-user", controllers.ProcessHandlers(adminController.DeleteUser, metrics.ActionAdminDeleteUser, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminDeleteUser), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/delete-user", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/delete-user", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // UpdateUser admin api - app.Patch("/update-user", + sa.app.Patch("/update-user", controllers.ProcessHandlers(adminController.UpdateUser, metrics.ActionAdminUpdateUser, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminUpdateUser), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/update-user", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/update-user", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // ListUsers admin api - app.Patch("/list-users", + sa.app.Patch("/list-users", controllers.ProcessHandlers(adminController.ListUsers, metrics.ActionAdminListUsers, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminListUsers), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/list-users", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/list-users", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // ChangeBucketOwner admin api - app.Patch("/change-bucket-owner", + sa.app.Patch("/change-bucket-owner", controllers.ProcessHandlers(adminController.ChangeBucketOwner, metrics.ActionAdminChangeBucketOwner, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminChangeBucketOwner), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/change-bucket-owner", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/change-bucket-owner", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // ListBucketsAndOwners admin api - app.Patch("/list-buckets", + sa.app.Patch("/list-buckets", controllers.ProcessHandlers(adminController.ListBuckets, metrics.ActionAdminListBuckets, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminListBuckets), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/list-buckets", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/list-buckets", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) // CreateBucket admin api - app.Patch("/:bucket/create", + sa.app.Patch("/:bucket/create", controllers.ProcessHandlers(adminController.CreateBucket, metrics.ActionAdminCreateBucket, adminServices, - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.IsAdmin(metrics.ActionAdminCreateBucket), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), )) - app.Options("/:bucket/create", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/:bucket/create", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) } services := &controllers.Services{ - Logger: logger, - EventSender: evs, - MetricsManager: mm, + Logger: sa.logger, + EventSender: sa.evs, + MetricsManager: sa.mm, } // ListBuckets action // copy source is not allowed on '/' - app.Get("/", middlewares.MatchHeader("X-Amz-Copy-Source"), + sa.app.Get("/", middlewares.MatchHeader("X-Amz-Copy-Source"), controllers.ProcessHandlers( ctrl.HandleErrorRoute(s3err.GetAPIError(s3err.ErrCopySourceNotAllowed)), metrics.ActionUndetected, services, - middlewares.ApplyDefaultCORS(corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ), ) - app.Get("/", + sa.app.Get("/", controllers.ProcessHandlers( ctrl.ListBuckets, metrics.ActionListAllMyBuckets, services, - middlewares.ApplyDefaultCORS(corsAllowOrigin), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListAllMyBuckets, "", auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListAllMyBuckets, "", auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), )) - app.Options("/", - middlewares.ApplyDefaultCORSPreflight(corsAllowOrigin), - middlewares.ApplyDefaultCORS(corsAllowOrigin), + sa.app.Options("/", + middlewares.ApplyDefaultCORSPreflight(sa.corsAllowOrigin), + middlewares.ApplyDefaultCORS(sa.corsAllowOrigin), ) - bucketRouter := app.Group("/:bucket") - objectRouter := app.Group("/:bucket/*") + bucketRouter := sa.app.Group("/:bucket") + objectRouter := sa.app.Group("/:bucket/*") // PUT bucket operations bucketRouter.Put("", @@ -171,12 +189,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, true), - middlewares.ParseAcl(be), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("ownershipControls"), @@ -185,12 +203,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketOwnershipControls, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("versioning"), @@ -199,12 +217,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketVersioning, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketVersioning, auth.PutBucketVersioningAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketVersioning, auth.PutBucketVersioningAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("object-lock"), @@ -213,12 +231,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObjectLockConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectLockConfiguration, auth.PutBucketObjectLockConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObjectLockConfiguration, auth.PutBucketObjectLockConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("cors"), @@ -227,12 +245,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketCors, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("policy"), @@ -241,12 +259,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketPolicy, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("acl"), @@ -255,12 +273,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketAcl, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketAcl, auth.PutBucketAclAction, auth.PermissionWriteAcp, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketAcl, auth.PutBucketAclAction, auth.PermissionWriteAcp, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Put("", middlewares.MatchQueryArgs("analytics"), @@ -269,10 +287,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketAnalyticsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketAnalyticsConfiguration, auth.PutAnalyticsConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketAnalyticsConfiguration, auth.PutAnalyticsConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -282,10 +300,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketEncryption, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketEncryption, auth.PutEncryptionConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketEncryption, auth.PutEncryptionConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -295,10 +313,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketIntelligentTieringConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketIntelligentTieringConfiguration, auth.PutIntelligentTieringConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketIntelligentTieringConfiguration, auth.PutIntelligentTieringConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -308,10 +326,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketInventoryConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketInventoryConfiguration, auth.PutInventoryConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketInventoryConfiguration, auth.PutInventoryConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -321,10 +339,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketLifecycleConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketLifecycleConfiguration, auth.PutLifecycleConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketLifecycleConfiguration, auth.PutLifecycleConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -334,10 +352,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketLogging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketLogging, auth.PutBucketLoggingAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketLogging, auth.PutBucketLoggingAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -347,10 +365,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketRequestPayment, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketRequestPayment, auth.PutBucketRequestPaymentAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketRequestPayment, auth.PutBucketRequestPaymentAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -360,10 +378,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketMetricsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketMetricsConfiguration, auth.PutMetricsConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketMetricsConfiguration, auth.PutMetricsConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -373,10 +391,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketReplication, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketReplication, auth.PutReplicationConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketReplication, auth.PutReplicationConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -386,10 +404,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutPublicAccessBlock, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutPublicAccessBlock, auth.PutBucketPublicAccessBlockAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutPublicAccessBlock, auth.PutBucketPublicAccessBlockAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -399,10 +417,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketNotificationConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketNotificationConfiguration, auth.PutBucketNotificationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketNotificationConfiguration, auth.PutBucketNotificationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -412,10 +430,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketAccelerateConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketAccelerateConfiguration, auth.PutAccelerateConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketAccelerateConfiguration, auth.PutAccelerateConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -425,10 +443,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutBucketWebsite, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketWebsite, auth.PutBucketWebsiteAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutBucketWebsite, auth.PutBucketWebsiteAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Put("", @@ -437,11 +455,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionCreateBucket, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCreateBucket, auth.CreateBucketAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionCreateBucket, auth.CreateBucketAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), )) // HeadBucket action @@ -457,11 +475,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionHeadBucket, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionHeadBucket, auth.ListBucketAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionHeadBucket, auth.ListBucketAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, false), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // DELETE bucket operations @@ -478,11 +496,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Delete("", middlewares.MatchQueryArgs("ownershipControls"), @@ -491,11 +509,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketOwnershipControls, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Delete("", middlewares.MatchQueryArgs("policy"), @@ -504,11 +522,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketPolicy, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Delete("", middlewares.MatchQueryArgs("cors"), @@ -517,11 +535,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketCors, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Delete("", middlewares.MatchQueryArgs("analytics"), @@ -530,10 +548,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketAnalyticsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketAnalyticsConfiguration, auth.PutAnalyticsConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketAnalyticsConfiguration, auth.PutAnalyticsConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -543,10 +561,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketEncryption, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketEncryption, auth.PutEncryptionConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketEncryption, auth.PutEncryptionConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -556,10 +574,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketIntelligentTieringConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketIntelligentTieringConfiguration, auth.PutIntelligentTieringConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketIntelligentTieringConfiguration, auth.PutIntelligentTieringConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -569,10 +587,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketInventoryConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketInventoryConfiguration, auth.PutInventoryConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketInventoryConfiguration, auth.PutInventoryConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -582,10 +600,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketLifecycle, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketLifecycle, auth.PutLifecycleConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketLifecycle, auth.PutLifecycleConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -595,10 +613,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketMetricsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketMetricsConfiguration, auth.PutMetricsConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketMetricsConfiguration, auth.PutMetricsConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -608,10 +626,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketReplication, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketReplication, auth.PutReplicationConfigurationAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketReplication, auth.PutReplicationConfigurationAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -621,10 +639,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeletePublicAccessBlock, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeletePublicAccessBlock, auth.PutBucketPublicAccessBlockAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeletePublicAccessBlock, auth.PutBucketPublicAccessBlockAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -634,10 +652,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucketWebsite, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketWebsite, auth.PutBucketWebsiteAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucketWebsite, auth.PutBucketWebsiteAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Delete("", @@ -646,11 +664,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteBucket, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucket, auth.DeleteBucketAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteBucket, auth.DeleteBucketAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // GET bucket operations @@ -667,11 +685,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketLocation, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketLocation, auth.GetBucketLocationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketLocation, auth.GetBucketLocationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -681,11 +699,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketTagging, auth.GetBucketTaggingAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketTagging, auth.GetBucketTaggingAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("ownershipControls"), @@ -694,11 +712,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketOwnershipControls, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketOwnershipControls, auth.GetBucketOwnershipControlsAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketOwnershipControls, auth.GetBucketOwnershipControlsAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("versioning"), @@ -707,11 +725,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketVersioning, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketVersioning, auth.GetBucketVersioningAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketVersioning, auth.GetBucketVersioningAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("policy"), @@ -720,11 +738,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketPolicy, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketPolicy, auth.GetBucketPolicyAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketPolicy, auth.GetBucketPolicyAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("cors"), @@ -733,11 +751,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketCors, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketCors, auth.GetBucketCorsAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketCors, auth.GetBucketCorsAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("object-lock"), @@ -746,11 +764,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectLockConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectLockConfiguration, auth.GetBucketObjectLockConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectLockConfiguration, auth.GetBucketObjectLockConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("acl"), @@ -759,11 +777,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketAcl, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketAcl, auth.GetBucketAclAction, auth.PermissionReadAcp, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketAcl, auth.GetBucketAclAction, auth.PermissionReadAcp, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, false), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("uploads"), @@ -772,11 +790,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListMultipartUploads, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListMultipartUploads, auth.ListBucketMultipartUploadsAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListMultipartUploads, auth.ListBucketMultipartUploadsAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("versions"), @@ -785,11 +803,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListObjectVersions, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjectVersions, auth.ListBucketVersionsAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListObjectVersions, auth.ListBucketVersionsAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("policyStatus"), @@ -798,11 +816,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketPolicyStatus, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketPolicyStatus, auth.GetBucketPolicyStatusAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketPolicyStatus, auth.GetBucketPolicyStatusAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", middlewares.MatchQueryArgs("analytics", "id"), @@ -811,10 +829,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketAnalyticsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketAnalyticsConfiguration, auth.GetAnalyticsConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketAnalyticsConfiguration, auth.GetAnalyticsConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -824,10 +842,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListBucketAnalyticsConfigurations, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListBucketAnalyticsConfigurations, auth.GetAnalyticsConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListBucketAnalyticsConfigurations, auth.GetAnalyticsConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -837,10 +855,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketEncryption, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketEncryption, auth.GetEncryptionConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketEncryption, auth.GetEncryptionConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -850,10 +868,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketIntelligentTieringConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketIntelligentTieringConfiguration, auth.GetIntelligentTieringConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketIntelligentTieringConfiguration, auth.GetIntelligentTieringConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -863,10 +881,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListBucketIntelligentTieringConfigurations, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListBucketIntelligentTieringConfigurations, auth.GetIntelligentTieringConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListBucketIntelligentTieringConfigurations, auth.GetIntelligentTieringConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -876,10 +894,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketInventoryConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketInventoryConfiguration, auth.GetInventoryConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketInventoryConfiguration, auth.GetInventoryConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -889,10 +907,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListBucketInventoryConfigurations, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListBucketInventoryConfigurations, auth.GetInventoryConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListBucketInventoryConfigurations, auth.GetInventoryConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -902,10 +920,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketLifecycleConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketLifecycleConfiguration, auth.GetLifecycleConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketLifecycleConfiguration, auth.GetLifecycleConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -915,10 +933,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketLogging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketLogging, auth.GetBucketLoggingAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketLogging, auth.GetBucketLoggingAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -928,10 +946,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketRequestPayment, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketRequestPayment, auth.GetBucketRequestPaymentAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketRequestPayment, auth.GetBucketRequestPaymentAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -941,10 +959,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketMetricsConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketMetricsConfiguration, auth.GetMetricsConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketMetricsConfiguration, auth.GetMetricsConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -954,10 +972,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListBucketMetricsConfigurations, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListBucketMetricsConfigurations, auth.GetMetricsConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListBucketMetricsConfigurations, auth.GetMetricsConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -967,10 +985,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketReplication, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketReplication, auth.GetReplicationConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketReplication, auth.GetReplicationConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -980,10 +998,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetPublicAccessBlock, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetPublicAccessBlock, auth.GetBucketPublicAccessBlockAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetPublicAccessBlock, auth.GetBucketPublicAccessBlockAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -993,10 +1011,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketNotificationConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketNotificationConfiguration, auth.GetBucketNotificationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketNotificationConfiguration, auth.GetBucketNotificationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -1006,10 +1024,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketAccelerateConfiguration, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketAccelerateConfiguration, auth.GetAccelerateConfigurationAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketAccelerateConfiguration, auth.GetAccelerateConfigurationAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -1019,10 +1037,10 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetBucketWebsite, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketWebsite, auth.GetBucketWebsiteAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetBucketWebsite, auth.GetBucketWebsiteAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), ), ) bucketRouter.Get("", @@ -1032,11 +1050,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListObjectsV2, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjectsV2, auth.ListBucketAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListObjectsV2, auth.ListBucketAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) bucketRouter.Get("", controllers.ProcessHandlers( @@ -1044,11 +1062,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListObjects, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjects, auth.ListBucketAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListObjects, auth.ListBucketAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // bucket POST operation is not allowed with uploadId and copy source @@ -1066,12 +1084,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteObjects, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObjects, auth.DeleteObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteObjects, auth.DeleteObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // object HEAD operation is not allowed with copy source @@ -1087,11 +1105,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionHeadObject, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionHeadObject, auth.GetObjectAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionHeadObject, auth.GetObjectAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, false), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // GET object operations @@ -1121,11 +1139,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectTagging, auth.GetObjectTaggingAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectTagging, auth.GetObjectTaggingAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", middlewares.MatchQueryArgs("retention"), @@ -1134,11 +1152,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectRetention, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectRetention, auth.GetObjectRetentionAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectRetention, auth.GetObjectRetentionAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", middlewares.MatchQueryArgs("legal-hold"), @@ -1147,11 +1165,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectLegalHold, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectLegalHold, auth.GetObjectLegalHoldAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectLegalHold, auth.GetObjectLegalHoldAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", middlewares.MatchQueryArgs("acl"), @@ -1160,11 +1178,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectAcl, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectAcl, auth.GetObjectAclAction, auth.PermissionReadAcp, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectAcl, auth.GetObjectAclAction, auth.PermissionReadAcp, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", middlewares.MatchQueryArgs("attributes"), @@ -1173,11 +1191,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObjectAttributes, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectAttributes, auth.GetObjectAttributesAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObjectAttributes, auth.GetObjectAttributesAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", middlewares.MatchQueryArgs("uploadId"), @@ -1186,11 +1204,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionListParts, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListParts, auth.ListMultipartUploadPartsAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionListParts, auth.ListMultipartUploadPartsAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Get("", controllers.ProcessHandlers( @@ -1198,11 +1216,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionGetObject, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObject, auth.GetObjectAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionGetObject, auth.GetObjectAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // DELETE object operations @@ -1220,11 +1238,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteObjectTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObjectTagging, auth.DeleteObjectTaggingAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteObjectTagging, auth.DeleteObjectTaggingAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Delete("", middlewares.MatchQueryArgs("uploadId"), @@ -1233,11 +1251,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionAbortMultipartUpload, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionAbortMultipartUpload, auth.AbortMultipartUploadAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionAbortMultipartUpload, auth.AbortMultipartUploadAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Delete("", controllers.ProcessHandlers( @@ -1245,11 +1263,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionDeleteObject, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObject, auth.DeleteObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionDeleteObject, auth.DeleteObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // object POST operations @@ -1268,12 +1286,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionRestoreObject, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionRestoreObject, auth.RestoreObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionRestoreObject, auth.RestoreObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Post("", middlewares.MatchQueryArgs("select"), @@ -1283,12 +1301,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionSelectObjectContent, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionSelectObjectContent, auth.GetObjectAction, auth.PermissionRead, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionSelectObjectContent, auth.GetObjectAction, auth.PermissionRead, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Post("", middlewares.MatchQueryArgs("uploadId"), @@ -1297,11 +1315,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionCompleteMultipartUpload, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCompleteMultipartUpload, auth.PutObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionCompleteMultipartUpload, auth.PutObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Post("", middlewares.MatchQueryArgs("uploads"), @@ -1310,11 +1328,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionCreateMultipartUpload, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCreateMultipartUpload, auth.PutObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionCreateMultipartUpload, auth.PutObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // PUT object operations @@ -1325,12 +1343,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObjectTagging, services, middlewares.BucketObjectNameValidator(), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectTagging, auth.PutObjectTaggingAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObjectTagging, auth.PutObjectTaggingAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, true, false), - middlewares.ParseAcl(be), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", middlewares.MatchQueryArgs("retention"), @@ -1339,12 +1357,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObjectRetention, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectRetention, auth.PutObjectRetentionAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObjectRetention, auth.PutObjectRetentionAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", middlewares.MatchQueryArgs("legal-hold"), @@ -1353,12 +1371,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObjectLegalHold, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectLegalHold, auth.PutObjectLegalHoldAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObjectLegalHold, auth.PutObjectLegalHoldAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", middlewares.MatchQueryArgs("acl"), @@ -1367,12 +1385,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObjectAcl, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectAcl, auth.PutObjectAclAction, auth.PermissionWriteAcp, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObjectAcl, auth.PutObjectAclAction, auth.PermissionWriteAcp, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), middlewares.VerifyChecksums(false, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", middlewares.MatchQueryArgs("uploadId", "partNumber"), @@ -1382,11 +1400,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionUploadPartCopy, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionUploadPartCopy, auth.PutObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionUploadPartCopy, auth.PutObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", middlewares.MatchQueryArgs("uploadId", "partNumber"), @@ -1395,12 +1413,12 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionUploadPart, services, middlewares.BucketObjectNameValidator(), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionUploadPart, auth.PutObjectAction, auth.PermissionWrite, region, true), - middlewares.VerifyPresignedV4Signature(root, iam, region, true), - middlewares.VerifyV4Signature(root, iam, region, true, true), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionUploadPart, auth.PutObjectAction, auth.PermissionWrite, sa.region, true), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, true, true), middlewares.VerifyChecksums(true, false, false), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.ParseAcl(sa.be), )) // return error if partNumber is used without uploadId @@ -1421,11 +1439,11 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionCopyObject, services, middlewares.BucketObjectNameValidator(), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCopyObject, auth.PutObjectAction, auth.PermissionWrite, region, false), - middlewares.VerifyPresignedV4Signature(root, iam, region, false), - middlewares.VerifyV4Signature(root, iam, region, false, true), - middlewares.ParseAcl(be), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionCopyObject, auth.PutObjectAction, auth.PermissionWrite, sa.region, false), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, false), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, false, true), + middlewares.ParseAcl(sa.be), )) objectRouter.Put("", controllers.ProcessHandlers( @@ -1433,30 +1451,30 @@ func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMServ metrics.ActionPutObject, services, middlewares.BucketObjectNameValidator(), - middlewares.ApplyBucketCORS(be, corsAllowOrigin), - middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObject, auth.PutObjectAction, auth.PermissionWrite, region, true), - middlewares.VerifyPresignedV4Signature(root, iam, region, true), - middlewares.VerifyV4Signature(root, iam, region, true, true), + middlewares.ApplyBucketCORS(sa.be, sa.corsAllowOrigin), + middlewares.AuthorizePublicBucketAccess(sa.be, metrics.ActionPutObject, auth.PutObjectAction, auth.PermissionWrite, sa.region, true), + middlewares.VerifyPresignedV4Signature(sa.root, sa.iam, sa.region, true), + middlewares.VerifyV4Signature(sa.root, sa.iam, sa.region, true, true), middlewares.VerifyChecksums(true, false, false), - middlewares.ParseAcl(be), + middlewares.ParseAcl(sa.be), )) - app.Options("/:bucket", - middlewares.ApplyBucketCORSPreflightFallback(be, corsAllowOrigin), + sa.app.Options("/:bucket", + middlewares.ApplyBucketCORSPreflightFallback(sa.be, sa.corsAllowOrigin), controllers.ProcessHandlers(ctrl.CORSOptions, metrics.ActionOptions, services, middlewares.BucketObjectNameValidator(), - middlewares.ParseAcl(be), + middlewares.ParseAcl(sa.be), ), ) - app.Options("/:bucket/*", - middlewares.ApplyBucketCORSPreflightFallback(be, corsAllowOrigin), + sa.app.Options("/:bucket/*", + middlewares.ApplyBucketCORSPreflightFallback(sa.be, sa.corsAllowOrigin), controllers.ProcessHandlers(ctrl.CORSOptions, metrics.ActionOptions, services, middlewares.BucketObjectNameValidator(), - middlewares.ParseAcl(be), + middlewares.ParseAcl(sa.be), ), ) // Return MethodNotAllowed for all the unmatched routes - app.All("*", controllers.ProcessHandlers(ctrl.HandleErrorRoute(s3err.GetAPIError(s3err.ErrMethodNotAllowed)), metrics.ActionUndetected, services)) + sa.app.All("*", controllers.ProcessHandlers(ctrl.HandleErrorRoute(s3err.GetAPIError(s3err.ErrMethodNotAllowed)), metrics.ActionUndetected, services)) } diff --git a/s3api/router_cors_test.go b/s3api/router_cors_test.go index e83ca366..b7da5765 100644 --- a/s3api/router_cors_test.go +++ b/s3api/router_cors_test.go @@ -24,7 +24,6 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" - "github.com/versity/versitygw/s3api/middlewares" "github.com/versity/versitygw/s3err" ) @@ -60,20 +59,13 @@ func TestS3ApiRouter_ListBuckets_DefaultCORSAllowOrigin(t *testing.T) { origin := "https://example.com" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backend.BackendUnsupported{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backend.BackendUnsupported{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodGet, "/", nil) if err != nil { @@ -97,20 +89,13 @@ func TestS3ApiRouter_ListBuckets_OptionsPreflight_DefaultCORS(t *testing.T) { origin := "https://example.com" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backend.BackendUnsupported{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backend.BackendUnsupported{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodOptions, "/", nil) if err != nil { @@ -137,20 +122,13 @@ func TestS3ApiRouter_PutBucketTagging_ErrorStillIncludesFallbackCORS(t *testing. origin := "http://127.0.0.1:9090" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backendWithCorsOnly{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backendWithCorsOnly{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodPut, "/testing?tagging", nil) if err != nil { @@ -172,20 +150,13 @@ func TestS3ApiRouter_PutObjectTagging_ErrorStillIncludesFallbackCORS(t *testing. origin := "http://127.0.0.1:9090" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backendWithCorsOnly{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backendWithCorsOnly{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodPut, "/testing/myobj?tagging", nil) if err != nil { @@ -207,20 +178,13 @@ func TestS3ApiRouter_CopyObject_ErrorStillIncludesFallbackCORS(t *testing.T) { origin := "http://127.0.0.1:9090" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backendWithCorsOnly{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backendWithCorsOnly{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodPut, "/testing/myobj", nil) if err != nil { @@ -243,20 +207,13 @@ func TestS3ApiRouter_PutObject_ErrorStillIncludesFallbackCORS(t *testing.T) { origin := "http://127.0.0.1:9090" app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backendWithCorsOnly{}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - origin, - ) + (&S3ApiRouter{ + app: app, + be: backendWithCorsOnly{}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: origin, + }).Init() req, err := http.NewRequest(http.MethodPut, "/testing/myobj", nil) if err != nil { @@ -294,20 +251,13 @@ func TestS3ApiRouter_OptionsWithBucketCORS_NoDuplicateHeaders(t *testing.T) { `) app := fiber.New() - (&S3ApiRouter{}).Init( - app, - backendWithBucketCors{corsConfig: corsConfig}, - &auth.IAMServiceInternal{}, - nil, - nil, - nil, - nil, - false, - "us-east-1", - "", - middlewares.RootUserConfig{}, - fallbackOrigin, - ) + (&S3ApiRouter{ + app: app, + be: backendWithBucketCors{corsConfig: corsConfig}, + iam: &auth.IAMServiceInternal{}, + region: "us-east-1", + corsAllowOrigin: fallbackOrigin, + }).Init() req, err := http.NewRequest(http.MethodOptions, "/xyz/upload/test.txt", nil) if err != nil { diff --git a/s3api/router_test.go b/s3api/router_test.go index c54451bb..8c870075 100644 --- a/s3api/router_test.go +++ b/s3api/router_test.go @@ -20,24 +20,16 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" - "github.com/versity/versitygw/s3api/middlewares" ) func TestS3ApiRouter_Init(t *testing.T) { - type args struct { - app *fiber.App - be backend.Backend - iam auth.IAMService - } tests := []struct { name string sa *S3ApiRouter - args args }{ { name: "Initialize S3 api router", - sa: &S3ApiRouter{}, - args: args{ + sa: &S3ApiRouter{ app: fiber.New(), be: backend.BackendUnsupported{}, iam: &auth.IAMServiceInternal{}, @@ -46,7 +38,7 @@ func TestS3ApiRouter_Init(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tt.sa.Init(tt.args.app, tt.args.be, tt.args.iam, nil, nil, nil, nil, false, "us-east-1", "", middlewares.RootUserConfig{}, "") + tt.sa.Init() }) } } diff --git a/s3api/server.go b/s3api/server.go index dca839df..0e7728b0 100644 --- a/s3api/server.go +++ b/s3api/server.go @@ -42,18 +42,15 @@ const ( ) type S3ApiServer struct { - Router *S3ApiRouter - app *fiber.App - backend backend.Backend - CertStorage *utils.CertStorage - quiet bool - readonly bool - keepAlive bool - health string - virtualDomain string - corsAllowOrigin string - maxConnections int - maxRequests int + Router *S3ApiRouter + app *fiber.App + backend backend.Backend + CertStorage *utils.CertStorage + quiet bool + keepAlive bool + health string + maxConnections int + maxRequests int } func New( @@ -69,7 +66,16 @@ func New( ) (*S3ApiServer, error) { server := &S3ApiServer{ backend: be, - Router: new(S3ApiRouter), + Router: &S3ApiRouter{ + be: be, + iam: iam, + logger: l, + aLogger: adminLogger, + evs: evs, + mm: mm, + root: root, + region: region, + }, } for _, opt := range opts { @@ -88,6 +94,7 @@ func New( }) server.app = app + server.Router.app = app // initialize the panic recovery middleware app.Use(recover.New( @@ -119,17 +126,12 @@ func New( // path unescapes the url app.Use(controllers.WrapMiddleware(middlewares.DecodeURL, l, mm)) - // initialize host-style parser in virtual domain is specified - if server.virtualDomain != "" { - app.Use(middlewares.HostStyleParser(server.virtualDomain)) - } - // initialize the debug logger in debug mode if debuglogger.IsDebugEnabled() { app.Use(middlewares.DebugLogger()) } - server.Router.Init(app, be, iam, l, adminLogger, evs, mm, server.readonly, region, server.virtualDomain, root, server.corsAllowOrigin) + server.Router.Init() return server, nil } @@ -158,12 +160,14 @@ func WithHealth(health string) Option { } func WithReadOnly() Option { - return func(s *S3ApiServer) { s.readonly = true } + return func(s *S3ApiServer) { s.Router.readonly = true } } // WithHostStyle enabled host-style bucket addressing on the server func WithHostStyle(virtualDomain string) Option { - return func(s *S3ApiServer) { s.virtualDomain = virtualDomain } + return func(s *S3ApiServer) { + s.Router.virtualDomain = virtualDomain + } } // WithKeepAlive enables the server keep alive @@ -174,7 +178,7 @@ func WithKeepAlive() Option { // WithCORSAllowOrigin sets the default CORS Access-Control-Allow-Origin value. // This is applied when no bucket CORS configuration exists, and for admin APIs. func WithCORSAllowOrigin(origin string) Option { - return func(s *S3ApiServer) { s.corsAllowOrigin = origin } + return func(s *S3ApiServer) { s.Router.corsAllowOrigin = origin } } // WithConcurrencyLimiter sets the server's maximum connection limit @@ -186,6 +190,12 @@ func WithConcurrencyLimiter(maxConnections, maxRequests int) Option { } } +// WithDisableACL disables the s3 api server ACLs, by ignoring all +// bucket/object ACL headers +func WithDisableACL() Option { + return func(s *S3ApiServer) { s.Router.disableACL = true } +} + // ServeMultiPort creates listeners for multiple port specifications and serves // on all of them simultaneously. This supports listening on multiple ports and/or // addresses (e.g., [":7070", "localhost:8080", "0.0.0.0:9090"]). diff --git a/s3api/utils/utils.go b/s3api/utils/utils.go index fdefdaca..da6dd201 100644 --- a/s3api/utils/utils.go +++ b/s3api/utils/utils.go @@ -1011,7 +1011,11 @@ func NewTLSListener(network string, address string, getCertificateFunc func(*tls // since ACL operations are not supported on objects, the presence of any ACL headers // results in a NotImplemented error. It returns nil only when all ACL headers // are absent. -func ValidateNoACLHeaders(ctx *fiber.Ctx) error { +func ValidateNoACLHeaders(ctx *fiber.Ctx, disableACL bool) error { + if disableACL { + return nil + } + for _, header := range []string{ "x-amz-acl", "x-amz-grant-full-control", diff --git a/s3err/s3err.go b/s3err/s3err.go index 7e439efc..9e6e7e3f 100644 --- a/s3err/s3err.go +++ b/s3err/s3err.go @@ -193,6 +193,7 @@ const ( ErrDirectoryNotEmpty ErrQuotaExceeded ErrVersioningNotConfigured + ErrACLsDisabled // Admin api errors ErrAdminAccessDenied @@ -867,6 +868,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "Versioning has not been configured for the gateway.", HTTPStatusCode: http.StatusNotImplemented, }, + ErrACLsDisabled: { + Code: "AccessControlListNotSupported", + Description: "Access control lists are disabled at the gateway level", + HTTPStatusCode: http.StatusBadRequest, + }, // Admin api errors ErrAdminAccessDenied: { diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index f9863afc..25093bde 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -1171,6 +1171,16 @@ func TestSignedStreaminPayloadTrailer(ts *TestState) { } } +func TestNoAclMode(ts *TestState) { + ts.Run(NoAclMode_CreateBucket_with_acl) + ts.Run(NoAclMode_PutObject_with_acl) + ts.Run(NoAclMode_CopyObject_with_acl) + ts.Run(NoAclMode_multipart_upload_with_acl) + ts.Run(NoAclMode_PutBucketAcl) + ts.Run(NoAclMode_PutObjectAcl_not_implemented) + ts.Run(NoAclMode_GetObjectAcl_not_implemented) +} + type IntTest func(s3 *S3Conf) error type IntTests map[string]IntTest @@ -1867,5 +1877,12 @@ func GetIntTests() IntTests { "SignedStreamingPayloadTrailer_invalid_checksum": SignedStreamingPayloadTrailer_invalid_checksum, "SignedStreamingPayloadTrailer_bad_digest": SignedStreamingPayloadTrailer_bad_digest, "SignedStreamingPayloadTrailer_success": SignedStreamingPayloadTrailer_success, + "NoAclMode_CreateBucket_with_acl": NoAclMode_CreateBucket_with_acl, + "NoAclMode_PutObject_with_acl": NoAclMode_PutObject_with_acl, + "NoAclMode_CopyObject_with_acl": NoAclMode_CopyObject_with_acl, + "NoAclMode_multipart_upload_with_acl": NoAclMode_multipart_upload_with_acl, + "NoAclMode_PutBucketAcl": NoAclMode_PutBucketAcl, + "NoAclMode_PutObjectAcl_not_implemented": NoAclMode_PutObjectAcl_not_implemented, + "NoAclMode_GetObjectAcl_not_implemented": NoAclMode_GetObjectAcl_not_implemented, } } diff --git a/tests/integration/no_acl.go b/tests/integration/no_acl.go new file mode 100644 index 00000000..4039e6ab --- /dev/null +++ b/tests/integration/no_acl.go @@ -0,0 +1,245 @@ +// Copyright 2026 Versity Software +// This file is licensed under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package integration + +import ( + "context" + "fmt" + "strings" + + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/versity/versitygw/s3err" +) + +func NoAclMode_CreateBucket_with_acl(s *S3Conf) error { + testName := "NoAclMode_CreateBucket_with_acl" + return actionHandlerNoSetup(s, testName, func(s3client *s3.Client, bucket string) error { + u := getUser("user") + err := createUsers(s, []user{u}) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.CreateBucket(ctx, &s3.CreateBucketInput{ + Bucket: &bucket, + ACL: types.BucketCannedACLPublicReadWrite, + GrantFullControl: &u.access, + GrantRead: &u.access, + GrantReadACP: &u.access, + GrantWrite: &u.access, + GrantWriteACP: &u.access, + }) + cancel() + if err != nil { + return err + } + + ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) + out, err := s3client.GetBucketAcl(ctx, &s3.GetBucketAclInput{ + Bucket: &bucket, + }) + cancel() + if err != nil { + return err + } + + if getString(out.Owner.ID) != s.awsID { + return fmt.Errorf("expected bucket owner to be %v, instead got %v", + s.awsID, getString(out.Owner.ID)) + } + if len(out.Grants) != 1 { + return fmt.Errorf("expected grants length to be 1, instead got %v", + len(out.Grants)) + } + grt := out.Grants[0] + if grt.Permission != types.PermissionFullControl { + return fmt.Errorf("expected the grantee to have full-control permission, instead got %v", + grt.Permission) + } + if getString(grt.Grantee.ID) != s.awsID { + return fmt.Errorf("expected the grantee id to be %v, instead got %v", + s.awsID, getString(grt.Grantee.ID)) + } + + return teardown(s, bucket) + }) +} + +func NoAclMode_PutObject_with_acl(s *S3Conf) error { + testName := "NoAclMode_PutObject_with_acl" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj := "my-object" + u := getUser("user") + err := createUsers(s, []user{u}) + if err != nil { + return err + } + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &obj, + ACL: types.ObjectCannedACLBucketOwnerFullControl, + GrantFullControl: &u.access, + GrantRead: &u.access, + GrantReadACP: &u.access, + GrantWriteACP: &u.access, + Body: strings.NewReader("dummy data"), + }) + cancel() + + return err + }) +} + +func NoAclMode_CopyObject_with_acl(s *S3Conf) error { + testName := "NoAclMode_CopyObject_with_acl" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + u := getUser("user") + err := createUsers(s, []user{u}) + if err != nil { + return err + } + + srcObj, dstObj := "source-object", "destination-object" + _, err = putObjectWithData(10, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &srcObj, + ACL: types.ObjectCannedACLAuthenticatedRead, + }, s3client) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.CopyObject(ctx, &s3.CopyObjectInput{ + Bucket: &bucket, + Key: &dstObj, + CopySource: getPtr(fmt.Sprintf("%s/%s", bucket, srcObj)), + }) + cancel() + + return err + }) +} + +func NoAclMode_multipart_upload_with_acl(s *S3Conf) error { + testName := "NoAclMode_CreateMultipartUpload_with_acl" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj := "my-object" + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + mp, err := s3client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{ + Bucket: &bucket, + Key: &obj, + ACL: types.ObjectCannedACLAuthenticatedRead, + GrantFullControl: getPtr("non_existing_user_1"), + GrantRead: getPtr("non_existing_user_2"), + GrantReadACP: getPtr("non_existing_user_3"), + GrantWriteACP: getPtr("non_existing_user_4"), + }) + cancel() + if err != nil { + return err + } + + parts, _, err := uploadParts(s3client, 100, 1, bucket, obj, *mp.UploadId) + if err != nil { + return err + } + + compParts := []types.CompletedPart{} + for _, el := range parts { + compParts = append(compParts, types.CompletedPart{ + ETag: el.ETag, + PartNumber: el.PartNumber, + }) + } + + ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{ + Bucket: &bucket, + Key: &obj, + UploadId: mp.UploadId, + MultipartUpload: &types.CompletedMultipartUpload{ + Parts: compParts, + }, + }) + cancel() + + return err + }) +} + +func NoAclMode_PutBucketAcl(s *S3Conf) error { + testName := "NoAclMode_PutBucketAcl" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err := s3client.PutBucketAcl(ctx, &s3.PutBucketAclInput{ + Bucket: &bucket, + ACL: types.BucketCannedACLPrivate, + }) + cancel() + + return checkApiErr(err, s3err.GetAPIError(s3err.ErrACLsDisabled)) + }) +} + +func NoAclMode_PutObjectAcl_not_implemented(s *S3Conf) error { + testName := "NoAclMode_PutObjectAcl_not_implemented" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj := "my-object" + _, err := putObjectWithData(10, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &obj, + }, s3client) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.PutObjectAcl(ctx, &s3.PutObjectAclInput{ + Bucket: &bucket, + Key: &obj, + ACL: types.ObjectCannedACLAuthenticatedRead, + }) + cancel() + + return checkApiErr(err, s3err.GetAPIError(s3err.ErrNotImplemented)) + }) +} + +func NoAclMode_GetObjectAcl_not_implemented(s *S3Conf) error { + testName := "NoAclMode_GetObjectAcl_not_implemented" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj := "my-object" + _, err := putObjectWithData(10, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &obj, + }, s3client) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.GetObjectAcl(ctx, &s3.GetObjectAclInput{ + Bucket: &bucket, + Key: &obj, + }) + cancel() + + return checkApiErr(err, s3err.GetAPIError(s3err.ErrNotImplemented)) + }) +}