feat: a total refactoring of the gateway middlewares by lowering them from server to router level.

This commit is contained in:
niksis02
2025-07-22 20:55:22 +04:00
parent abdf342ef7
commit 5be9e3bd1e
30 changed files with 1034 additions and 804 deletions
-12
View File
@@ -155,18 +155,6 @@ func VerifyPublicAccess(ctx context.Context, be backend.Backend, action Action,
return nil
}
func MayCreateBucket(acct Account, isRoot bool) error {
if isRoot {
return nil
}
if acct.Role == RoleUser {
return s3err.GetAPIError(s3err.ErrAccessDenied)
}
return nil
}
func IsAdminOrOwner(acct Account, isRoot bool, acl ACL) error {
// Owner check
if acct.Access == acl.Owner {
+36 -7
View File
@@ -18,30 +18,59 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/middlewares"
"github.com/versity/versitygw/s3log"
)
type S3AdminRouter struct{}
func (ar *S3AdminRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger) {
func (ar *S3AdminRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, root middlewares.RootUserConfig, region string, debug bool) {
ctrl := controllers.NewAdminController(iam, be, logger)
services := &controllers.Services{
Logger: logger,
}
// CreateUser admin api
app.Patch("/create-user", controllers.ProcessResponse(ctrl.CreateUser, logger, nil, nil))
app.Patch("/create-user",
controllers.ProcessHandlers(ctrl.CreateUser, metrics.ActionAdminCreateUser, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminCreateUser),
))
// DeleteUsers admin api
app.Patch("/delete-user", controllers.ProcessResponse(ctrl.DeleteUser, logger, nil, nil))
app.Patch("/delete-user",
controllers.ProcessHandlers(ctrl.DeleteUser, metrics.ActionAdminDeleteUser, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminDeleteUser),
))
// UpdateUser admin api
app.Patch("/update-user", controllers.ProcessResponse(ctrl.UpdateUser, logger, nil, nil))
app.Patch("/update-user",
controllers.ProcessHandlers(ctrl.UpdateUser, metrics.ActionAdminUpdateUser, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminUpdateUser),
))
// ListUsers admin api
app.Patch("/list-users", controllers.ProcessResponse(ctrl.ListUsers, logger, nil, nil))
app.Patch("/list-users",
controllers.ProcessHandlers(ctrl.ListUsers, metrics.ActionAdminListUsers, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminListUsers),
))
// ChangeBucketOwner admin api
app.Patch("/change-bucket-owner", controllers.ProcessResponse(ctrl.ChangeBucketOwner, logger, nil, nil))
app.Patch("/change-bucket-owner",
controllers.ProcessHandlers(ctrl.ChangeBucketOwner, metrics.ActionAdminChangeBucketOwner, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminChangeBucketOwner),
))
// ListBucketsAndOwners admin api
app.Patch("/list-buckets", controllers.ProcessResponse(ctrl.ListBuckets, logger, nil, nil))
app.Patch("/list-buckets",
controllers.ProcessHandlers(ctrl.ListBuckets, metrics.ActionAdminListBuckets, services,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminListBuckets),
))
}
+3 -9
View File
@@ -21,6 +21,7 @@ import (
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/middlewares"
"github.com/versity/versitygw/s3log"
)
@@ -53,17 +54,10 @@ func NewAdminServer(app *fiber.App, be backend.Backend, root middlewares.RootUse
Format: "${time} | ${status} | ${latency} | ${ip} | ${method} | ${path} | ${error} | ${queryParams}\n",
}))
}
app.Use(middlewares.DecodeURL(l, nil))
app.Use(controllers.WrapMiddleware(middlewares.DecodeURL, l, nil))
app.Use(middlewares.DebugLogger())
// Authentication middlewares
app.Use(middlewares.VerifyV4Signature(root, iam, l, nil, region, false))
app.Use(middlewares.VerifyMD5Body(l))
// Admin role checker
app.Use(middlewares.IsAdmin(l))
server.router.Init(app, be, iam, l)
server.router.Init(app, be, iam, l, root, region, server.debug)
return server
}
+16 -48
View File
@@ -25,7 +25,6 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
"github.com/versity/versitygw/s3response"
@@ -46,17 +45,13 @@ func (c AdminController) CreateUser(ctx *fiber.Ctx) (*Response, error) {
err := xml.Unmarshal(ctx.Body(), &usr)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminCreateUser,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
}
if !usr.Role.IsValid() {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminCreateUser,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrAdminInvalidUserRole)
}
@@ -67,15 +62,12 @@ func (c AdminController) CreateUser(ctx *fiber.Ctx) (*Response, error) {
}
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminCreateUser,
},
MetaOpts: &MetaOptions{},
}, err
}
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminCreateUser,
Status: http.StatusCreated,
},
}, nil
@@ -85,27 +77,21 @@ func (c AdminController) UpdateUser(ctx *fiber.Ctx) (*Response, error) {
access := ctx.Query("access")
if access == "" {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminUpdateUser,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrAdminMissingUserAcess)
}
var props auth.MutableProps
if err := xml.Unmarshal(ctx.Body(), &props); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminUpdateUser,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
}
err := props.Validate()
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminUpdateUser,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrAdminInvalidUserRole)
}
@@ -116,16 +102,12 @@ func (c AdminController) UpdateUser(ctx *fiber.Ctx) (*Response, error) {
}
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminUpdateUser,
},
MetaOpts: &MetaOptions{},
}, err
}
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminUpdateUser,
},
MetaOpts: &MetaOptions{},
}, nil
}
@@ -134,19 +116,15 @@ func (c AdminController) DeleteUser(ctx *fiber.Ctx) (*Response, error) {
err := c.iam.DeleteUserAccount(access)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminDeleteUser,
},
MetaOpts: &MetaOptions{},
}, err
}
func (c AdminController) ListUsers(ctx *fiber.Ctx) (*Response, error) {
accs, err := c.iam.ListUserAccounts()
return &Response{
Data: auth.ListUserAccountsResult{Accounts: accs},
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminListUsers,
},
Data: auth.ListUserAccountsResult{Accounts: accs},
MetaOpts: &MetaOptions{},
}, err
}
@@ -157,16 +135,12 @@ func (c AdminController) ChangeBucketOwner(ctx *fiber.Ctx) (*Response, error) {
accs, err := auth.CheckIfAccountsExist([]string{owner}, c.iam)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminChangeBucketOwner,
},
MetaOpts: &MetaOptions{},
}, err
}
if len(accs) > 0 {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminChangeBucketOwner,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrAdminUserNotFound)
}
@@ -184,17 +158,13 @@ func (c AdminController) ChangeBucketOwner(ctx *fiber.Ctx) (*Response, error) {
aclParsed, err := json.Marshal(acl)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminChangeBucketOwner,
},
MetaOpts: &MetaOptions{},
}, fmt.Errorf("failed to marshal the bucket acl: %w", err)
}
err = c.be.ChangeBucketOwner(ctx.Context(), bucket, aclParsed)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminChangeBucketOwner,
},
MetaOpts: &MetaOptions{},
}, err
}
@@ -204,8 +174,6 @@ func (c AdminController) ListBuckets(ctx *fiber.Ctx) (*Response, error) {
Data: s3response.ListBucketsResult{
Buckets: buckets,
},
MetaOpts: &MetaOptions{
Action: metrics.ActionAdminListBuckets,
},
MetaOpts: &MetaOptions{},
}, err
}
+193 -30
View File
@@ -53,7 +53,12 @@ type S3ApiController struct {
const (
iso8601Format = "20060102T150405Z"
iso8601TimeFormatExtended = "Mon Jan _2 15:04:05 2006"
defaultContentType = "binary/octet-stream"
timefmt = "Mon, 02 Jan 2006 15:04:05 GMT"
maxXMLBodyLen = 4 * 1024 * 1024
)
var (
xmlhdr = []byte(`<?xml version="1.0" encoding="UTF-8"?>` + "\n")
)
func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm *metrics.Manager, debug bool, readonly bool) S3ApiController {
@@ -72,6 +77,11 @@ func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs
}
}
// Returns MethodNotAllowed for unmatched routes
func (c S3ApiController) HandleUnmatch(ctx *fiber.Ctx) (*Response, error) {
return &Response{}, s3err.GetAPIError(s3err.ErrMethodNotAllowed)
}
func getint64(i *int64) int64 {
if i == nil {
return 0
@@ -1936,7 +1946,6 @@ type MetaOpts struct {
EvSender s3event.S3EventSender
MetricsMng *metrics.Manager
ContentLength int64
Action string
BucketOwner string
ObjectSize int64
ObjectCount int64
@@ -1946,48 +1955,202 @@ type MetaOpts struct {
Status int
}
func SendResponse(ctx *fiber.Ctx, err error, l *MetaOpts) error {
if l.Logger != nil {
l.Logger.Log(ctx, err, nil, s3log.LogMeta{
Action: l.Action,
BucketOwner: l.BucketOwner,
ObjectSize: l.ObjectSize,
})
// Response is the type definition for a controller response
// Data - Response body
// Headers - Resposne headers
// MetaOpts - Meta options for metrics, audit logs and s3 events
type Response struct {
Data any
Headers map[string]*string
MetaOpts *MetaOptions
}
// Services groups the metrics manager, s3 event sender and audit logger
type Services struct {
Logger s3log.AuditLogger
EventSender s3event.S3EventSender
MetricsManager *metrics.Manager
}
// Controller is the type definition for an s3api controller
type Controller func(ctx *fiber.Ctx) (*Response, error)
// ProcessHandlers groups a controller and multiple middlewares into a single fiber handler
func ProcessHandlers(controller Controller, s3action string, svc *Services, handlers ...fiber.Handler) fiber.Handler {
return func(ctx *fiber.Ctx) error {
// if skip locals is set, skip to the next rout handler
if utils.ContextKeySkip.IsSet(ctx) {
utils.ContextKeySkip.Delete(ctx)
return ctx.Next()
}
for _, handler := range handlers {
err := handler(ctx)
if err != nil {
return ProcessController(ctx, func(ctx *fiber.Ctx) (*Response, error) {
return &Response{
MetaOpts: &MetaOptions{},
}, err
}, s3action, svc)
}
}
return ProcessController(ctx, controller, s3action, svc)
}
if l.MetricsMng != nil {
if l.ObjectCount > 0 {
l.MetricsMng.Send(ctx, err, l.Action, l.ObjectCount, l.Status)
}
// WrapMiddleware executes the given middleware and handles sending the audit logs
// and metrics. It also handles the error parsing
func WrapMiddleware(handler fiber.Handler, logger s3log.AuditLogger, mm *metrics.Manager) fiber.Handler {
return func(ctx *fiber.Ctx) error {
err := handler(ctx)
if mm != nil {
mm.Send(ctx, err, metrics.ActionUndetected, 0, 0)
}
if logger != nil {
logger.Log(ctx, err, ctx.Body(), s3log.LogMeta{
Action: metrics.ActionUndetected,
})
}
if err != nil {
serr, ok := err.(s3err.APIError)
if ok {
ctx.Status(serr.HTTPStatusCode)
return ctx.Send(s3err.GetAPIErrorResponse(serr, "", "", ""))
}
debuglogger.Logf("Internal Error, %v", err)
ctx.Status(http.StatusInternalServerError)
// If the error is not 's3err.APIError' return 'InternalError'
return ctx.Send(s3err.GetAPIErrorResponse(
s3err.GetAPIError(s3err.ErrInternalError), "", "", ""))
}
return ctx.Next()
}
}
// ProcessController executes the given s3api controller and handles the metrics
// access logs and s3 events
func ProcessController(ctx *fiber.Ctx, controller Controller, s3action string, svc *Services) error {
response, err := controller(ctx)
// Set the response headers
SetResponseHeaders(ctx, response.Headers)
opts := response.MetaOpts
// Send the metrics
if svc.MetricsManager != nil {
if opts.ObjectCount > 0 {
svc.MetricsManager.Send(ctx, err, s3action, opts.ObjectCount, opts.Status)
} else {
l.MetricsMng.Send(ctx, err, l.Action, l.ContentLength, l.Status)
svc.MetricsManager.Send(ctx, err, s3action, opts.ContentLength, opts.Status)
}
}
// Handle the error case
if err != nil {
var apierr s3err.APIError
if errors.As(err, &apierr) {
ctx.Status(apierr.HTTPStatusCode)
return ctx.Send(s3err.GetAPIErrorResponse(apierr, "", "", ""))
// Audit the error log
if svc.Logger != nil {
svc.Logger.Log(ctx, err, nil, s3log.LogMeta{
Action: s3action,
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
})
}
serr, ok := err.(s3err.APIError)
if ok {
ctx.Status(serr.HTTPStatusCode)
return ctx.Send(s3err.GetAPIErrorResponse(serr, "", "", ""))
}
fmt.Fprintf(os.Stderr, "Internal Error, %v\n", err)
ctx.Status(http.StatusInternalServerError)
// If the error is not 's3err.APIError' return 'InternalError'
return ctx.Send(s3err.GetAPIErrorResponse(
s3err.GetAPIError(s3err.ErrInternalError), "", "", ""))
}
if l.EvSender != nil {
l.EvSender.SendEvent(ctx, s3event.EventMeta{
ObjectSize: l.ObjectSize,
ObjectETag: l.ObjectETag,
EventName: l.EventName,
BucketOwner: l.BucketOwner,
VersionId: l.VersionId,
if opts.Status == 0 {
opts.Status = http.StatusOK
}
// if no data payload is provided, send the response status
if response.Data == nil {
ctx.Status(opts.Status)
return nil
}
var responseBytes []byte
// Handle already encoded responses(text, json...)
encodedResp, ok := response.Data.([]byte)
if ok {
responseBytes = encodedResp
} else {
if responseBytes, err = xml.Marshal(response.Data); err != nil {
return err
}
if len(responseBytes) > 0 {
ctx.Response().Header.Set("Content-Length", fmt.Sprint(len(responseBytes)))
ctx.Response().Header.SetContentType(fiber.MIMEApplicationXML)
}
}
if svc.Logger != nil {
svc.Logger.Log(ctx, nil, responseBytes, s3log.LogMeta{
Action: s3action,
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
})
}
if l.Status == 0 {
l.Status = http.StatusOK
if svc.EventSender != nil {
svc.EventSender.SendEvent(ctx, s3event.EventMeta{
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
ObjectETag: opts.ObjectETag,
VersionId: opts.VersionId,
EventName: opts.EventName,
})
}
if ok {
if len(responseBytes) > 0 {
ctx.Response().Header.Set("Content-Length", fmt.Sprint(len(responseBytes)))
}
return ctx.Send(responseBytes)
}
msglen := len(xmlhdr) + len(responseBytes)
if msglen > maxXMLBodyLen {
debuglogger.Logf("XML encoded body len %v exceeds max len %v",
msglen, maxXMLBodyLen)
ctx.Status(http.StatusInternalServerError)
return ctx.Send(s3err.GetAPIErrorResponse(
s3err.GetAPIError(s3err.ErrInternalError), "", "", ""))
}
res := make([]byte, 0, msglen)
res = append(res, xmlhdr...)
res = append(res, responseBytes...)
return ctx.Send(res)
}
// Sets the response headers
func SetResponseHeaders(ctx *fiber.Ctx, headers map[string]*string) {
if headers == nil {
return
}
for key, val := range headers {
if val == nil || *val == "" {
continue
}
ctx.Response().Header.Add(key, *val)
}
// https://github.com/gofiber/fiber/issues/2080
// ctx.SendStatus() sets incorrect content length on HEAD request
ctx.Status(l.Status)
return nil
}
-11
View File
@@ -19,7 +19,6 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/utils"
)
@@ -44,7 +43,6 @@ func (c S3ApiController) DeleteBucketTagging(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -53,7 +51,6 @@ func (c S3ApiController) DeleteBucketTagging(ctx *fiber.Ctx) (*Response, error)
err = c.be.DeleteBucketTagging(ctx.Context(), bucket)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketTagging,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
@@ -79,7 +76,6 @@ func (c S3ApiController) DeleteBucketOwnershipControls(ctx *fiber.Ctx) (*Respons
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -88,7 +84,6 @@ func (c S3ApiController) DeleteBucketOwnershipControls(ctx *fiber.Ctx) (*Respons
err = c.be.DeleteBucketOwnershipControls(ctx.Context(), bucket)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
@@ -114,7 +109,6 @@ func (c S3ApiController) DeleteBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -123,7 +117,6 @@ func (c S3ApiController) DeleteBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
err = c.be.DeleteBucketPolicy(ctx.Context(), bucket)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketPolicy,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
@@ -151,7 +144,6 @@ func (c S3ApiController) DeleteBucketCors(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -160,7 +152,6 @@ func (c S3ApiController) DeleteBucketCors(ctx *fiber.Ctx) (*Response, error) {
err = c.be.DeleteBucketCors(ctx.Context(), bucket)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -187,7 +178,6 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucket,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -196,7 +186,6 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) (*Response, error) {
err = c.be.DeleteBucket(ctx.Context(), bucket)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteBucket,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
-31
View File
@@ -21,7 +21,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -48,7 +47,6 @@ func (c S3ApiController) GetBucketTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -58,7 +56,6 @@ func (c S3ApiController) GetBucketTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -75,7 +72,6 @@ func (c S3ApiController) GetBucketTagging(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: resp,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -101,7 +97,6 @@ func (c S3ApiController) GetBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -117,7 +112,6 @@ func (c S3ApiController) GetBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
},
},
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -143,7 +137,6 @@ func (c S3ApiController) GetBucketVersioning(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -152,7 +145,6 @@ func (c S3ApiController) GetBucketVersioning(ctx *fiber.Ctx) (*Response, error)
if err := auth.IsAdminOrOwner(acct, isRoot, parsedAcl); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -162,7 +154,6 @@ func (c S3ApiController) GetBucketVersioning(ctx *fiber.Ctx) (*Response, error)
return &Response{
Data: data,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -188,7 +179,6 @@ func (c S3ApiController) GetBucketCors(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -198,7 +188,6 @@ func (c S3ApiController) GetBucketCors(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: data,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -224,7 +213,6 @@ func (c S3ApiController) GetBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -234,7 +222,6 @@ func (c S3ApiController) GetBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: data,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -267,7 +254,6 @@ func (c S3ApiController) ListObjectVersions(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectVersions,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -279,7 +265,6 @@ func (c S3ApiController) ListObjectVersions(ctx *fiber.Ctx) (*Response, error) {
maxkeysStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectVersions,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxKeys)
@@ -297,7 +282,6 @@ func (c S3ApiController) ListObjectVersions(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: data,
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectVersions,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -325,7 +309,6 @@ func (c S3ApiController) GetObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -335,7 +318,6 @@ func (c S3ApiController) GetObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -345,7 +327,6 @@ func (c S3ApiController) GetObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
return &Response{
Data: resp,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -373,7 +354,6 @@ func (c S3ApiController) GetBucketAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -384,7 +364,6 @@ func (c S3ApiController) GetBucketAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -394,7 +373,6 @@ func (c S3ApiController) GetBucketAcl(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -427,7 +405,6 @@ func (c S3ApiController) ListMultipartUploads(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListMultipartUploads,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -438,7 +415,6 @@ func (c S3ApiController) ListMultipartUploads(ctx *fiber.Ctx) (*Response, error)
maxUploadsStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListMultipartUploads,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxUploads)
@@ -455,7 +431,6 @@ func (c S3ApiController) ListMultipartUploads(ctx *fiber.Ctx) (*Response, error)
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionListMultipartUploads,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -489,7 +464,6 @@ func (c S3ApiController) ListObjectsV2(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectsV2,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -500,7 +474,6 @@ func (c S3ApiController) ListObjectsV2(ctx *fiber.Ctx) (*Response, error) {
maxkeysStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectsV2,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxKeys)
@@ -519,7 +492,6 @@ func (c S3ApiController) ListObjectsV2(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjectsV2,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -551,7 +523,6 @@ func (c S3ApiController) ListObjects(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjects,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -563,7 +534,6 @@ func (c S3ApiController) ListObjects(ctx *fiber.Ctx) (*Response, error) {
maxkeysStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjects,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxKeys)
@@ -580,7 +550,6 @@ func (c S3ApiController) ListObjects(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionListObjects,
BucketOwner: parsedAcl.Owner,
},
}, err
-4
View File
@@ -18,7 +18,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/utils"
)
@@ -44,7 +43,6 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadBucket,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -58,7 +56,6 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadBucket,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -70,7 +67,6 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) (*Response, error) {
"X-Amz-Bucket-Region": utils.GetStringPtr(region),
},
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadBucket,
BucketOwner: parsedAcl.Owner,
},
}, nil
+3 -8
View File
@@ -19,7 +19,6 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -39,9 +38,7 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) (*Response, error) {
if err != nil || maxBucketsParsed < 0 || maxBucketsParsed > 10000 {
debuglogger.Logf("error parsing max-buckets %q: %v", maxBucketsStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListAllMyBuckets,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrInvalidMaxBuckets)
}
maxBuckets = int32(maxBucketsParsed)
@@ -56,9 +53,7 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) (*Response, error) {
Prefix: prefix,
})
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionListAllMyBuckets,
},
Data: res,
MetaOpts: &MetaOptions{},
}, err
}
-5
View File
@@ -22,7 +22,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -45,7 +44,6 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error unmarshalling delete objects: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObjects,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -65,7 +63,6 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObjects,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -75,7 +72,6 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObjects,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -91,7 +87,6 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObjects,
ObjectCount: int64(len(dObj.Objects)),
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectRemovedDeleteObjects,
+8 -42
View File
@@ -25,7 +25,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -52,7 +51,6 @@ func (c S3ApiController) PutBucketTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -62,7 +60,6 @@ func (c S3ApiController) PutBucketTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -71,7 +68,6 @@ func (c S3ApiController) PutBucketTagging(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutBucketTagging(ctx.Context(), bucket, tagging)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketTagging,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
@@ -95,7 +91,6 @@ func (c S3ApiController) PutBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
}); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -106,7 +101,6 @@ func (c S3ApiController) PutBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
debuglogger.Logf("failed to unmarshal request body: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -120,7 +114,6 @@ func (c S3ApiController) PutBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
}
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -129,7 +122,6 @@ func (c S3ApiController) PutBucketOwnershipControls(ctx *fiber.Ctx) (*Response,
err := c.be.PutBucketOwnershipControls(ctx.Context(), bucket, ownershipControls.Rules[0].ObjectOwnership)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketOwnershipControls,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -155,7 +147,6 @@ func (c S3ApiController) PutBucketVersioning(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -167,7 +158,6 @@ func (c S3ApiController) PutBucketVersioning(ctx *fiber.Ctx) (*Response, error)
debuglogger.Logf("error unmarshalling versioning configuration: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -178,7 +168,6 @@ func (c S3ApiController) PutBucketVersioning(ctx *fiber.Ctx) (*Response, error)
debuglogger.Logf("invalid versioning configuration status: %v", versioningConf.Status)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -187,7 +176,6 @@ func (c S3ApiController) PutBucketVersioning(ctx *fiber.Ctx) (*Response, error)
err = c.be.PutBucketVersioning(ctx.Context(), bucket, versioningConf.Status)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketVersioning,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -212,7 +200,6 @@ func (c S3ApiController) PutObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
}); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -222,7 +209,6 @@ func (c S3ApiController) PutObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -231,7 +217,6 @@ func (c S3ApiController) PutObjectLockConfiguration(ctx *fiber.Ctx) (*Response,
err = c.be.PutObjectLockConfiguration(ctx.Context(), bucket, config)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLockConfiguration,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -257,7 +242,6 @@ func (c S3ApiController) PutBucketCors(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -266,7 +250,6 @@ func (c S3ApiController) PutBucketCors(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutBucketCors(ctx.Context(), []byte{})
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketCors,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -290,7 +273,6 @@ func (c S3ApiController) PutBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -300,7 +282,6 @@ func (c S3ApiController) PutBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -309,7 +290,6 @@ func (c S3ApiController) PutBucketPolicy(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutBucketPolicy(ctx.Context(), bucket, ctx.Body())
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketPolicy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -335,7 +315,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil && !errors.Is(err, s3err.GetAPIError(s3err.ErrOwnershipControlsNotFound)) {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -344,7 +323,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("bucket acls are disabled")
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrAclNotSupported)
@@ -363,7 +341,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -376,7 +353,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error unmarshalling access control policy: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedACL)
@@ -387,7 +363,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid access control policy: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -397,7 +372,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid access control policy owner id: %v, expected %v", *accessControlPolicy.Owner.ID, parsedAcl.Owner)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.APIError{
@@ -412,7 +386,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
grants, acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrUnexpectedContent)
@@ -427,7 +400,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid acl: %q", acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -437,7 +409,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
grants, acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrBothCannedAndHeaderGrants)
@@ -460,7 +431,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("none of the bucket acl options has been specified: canned, req headers, req body")
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMissingSecurityHeader)
@@ -470,7 +440,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -479,7 +448,6 @@ func (c S3ApiController) PutBucketAcl(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutBucketAcl(ctx.Context(), bucket, updAcl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutBucketAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -500,21 +468,23 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
ctx.Get("X-Amz-Object-Ownership", string(types.ObjectOwnershipBucketOwnerEnforced)),
)
if acct.Role != auth.RoleAdmin && acct.Role != auth.RoleUserPlus {
return &Response{
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrAccessDenied)
}
// validate the bucket name
if ok := utils.IsValidBucketName(bucket); !ok {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
},
MetaOpts: &MetaOptions{},
}, s3err.GetAPIError(s3err.ErrInvalidBucketName)
}
// validate the object ownership value
if ok := utils.IsValidOwnership(objectOwnership); !ok {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
},
MetaOpts: &MetaOptions{},
}, s3err.APIError{
Code: "InvalidArgument",
Description: fmt.Sprintf("Invalid x-amz-object-ownership header: %v", objectOwnership),
@@ -526,7 +496,6 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("bucket acls are disabled for %v object ownership", objectOwnership)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
BucketOwner: acct.Access,
},
}, s3err.GetAPIError(s3err.ErrInvalidBucketAclWithObjectOwnership)
@@ -536,7 +505,6 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid request: %q (grants) %q (acl)", grants, acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
BucketOwner: acct.Access,
},
}, s3err.GetAPIError(s3err.ErrBothCannedAndHeaderGrants)
@@ -562,7 +530,6 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("failed to update bucket acl: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
BucketOwner: acct.Access,
},
}, err
@@ -575,7 +542,6 @@ func (c S3ApiController) CreateBucket(ctx *fiber.Ctx) (*Response, error) {
}, updAcl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateBucket,
BucketOwner: acct.Access,
},
}, err
+1 -10
View File
@@ -23,7 +23,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3event"
)
@@ -51,7 +50,6 @@ func (c S3ApiController) DeleteObjectTagging(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -61,14 +59,13 @@ func (c S3ApiController) DeleteObjectTagging(ctx *fiber.Ctx) (*Response, error)
return &Response{
MetaOpts: &MetaOptions{
Status: http.StatusNoContent,
Action: metrics.ActionDeleteObjectTagging,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectTaggingDelete,
},
}, err
}
func (c S3ApiController) AbortMultipartUplaod(ctx *fiber.Ctx) (*Response, error) {
func (c S3ApiController) AbortMultipartUpload(ctx *fiber.Ctx) (*Response, error) {
bucket := ctx.Params("bucket")
key := strings.TrimPrefix(ctx.Path(), fmt.Sprintf("/%s/", bucket))
uploadId := ctx.Query("uploadId")
@@ -92,7 +89,6 @@ func (c S3ApiController) AbortMultipartUplaod(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAbortMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -106,7 +102,6 @@ func (c S3ApiController) AbortMultipartUplaod(ctx *fiber.Ctx) (*Response, error)
})
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionAbortMultipartUpload,
BucketOwner: parsedAcl.Owner,
Status: http.StatusNoContent,
},
@@ -141,7 +136,6 @@ func (c S3ApiController) DeleteObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -164,7 +158,6 @@ func (c S3ApiController) DeleteObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -179,7 +172,6 @@ func (c S3ApiController) DeleteObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObject,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectRemovedDelete,
Status: http.StatusNoContent,
@@ -198,7 +190,6 @@ func (c S3ApiController) DeleteObject(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Headers: headers,
MetaOpts: &MetaOptions{
Action: metrics.ActionDeleteObject,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectRemovedDelete,
Status: http.StatusNoContent,
-25
View File
@@ -26,7 +26,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -55,7 +54,6 @@ func (c S3ApiController) GetObjectTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -65,7 +63,6 @@ func (c S3ApiController) GetObjectTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -82,7 +79,6 @@ func (c S3ApiController) GetObjectTagging(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: tags,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -112,7 +108,6 @@ func (c S3ApiController) GetObjectRetention(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -122,7 +117,6 @@ func (c S3ApiController) GetObjectRetention(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -132,7 +126,6 @@ func (c S3ApiController) GetObjectRetention(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: retention,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -162,7 +155,6 @@ func (c S3ApiController) GetObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -172,7 +164,6 @@ func (c S3ApiController) GetObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: auth.ParseObjectLegalHoldOutput(data),
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -201,7 +192,6 @@ func (c S3ApiController) GetObjectAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -213,7 +203,6 @@ func (c S3ApiController) GetObjectAcl(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -240,7 +229,6 @@ func (c S3ApiController) ListParts(ctx *fiber.Ctx) (*Response, error) {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListParts,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidPartNumberMarker)
@@ -254,7 +242,6 @@ func (c S3ApiController) ListParts(ctx *fiber.Ctx) (*Response, error) {
maxPartsStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListParts,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxParts)
@@ -274,7 +261,6 @@ func (c S3ApiController) ListParts(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionListParts,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -290,7 +276,6 @@ func (c S3ApiController) ListParts(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionListParts,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -322,7 +307,6 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -335,7 +319,6 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error)
maxPartsStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMaxParts)
@@ -346,7 +329,6 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -370,7 +352,6 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error)
return &Response{
Headers: headers,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -388,7 +369,6 @@ func (c S3ApiController) GetObjectAttributes(ctx *fiber.Ctx) (*Response, error)
Headers: headers,
Data: utils.FilterObjectAttributes(attrs, res),
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -426,7 +406,6 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -437,7 +416,6 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid x-amz-checksum-mode header value: %v", checksumMode)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetInvalidChecksumHeaderErr("x-amz-checksum-mode")
@@ -461,7 +439,6 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Headers: headers,
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObjectAttributes,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -484,7 +461,6 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) {
*res.ContentLength)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObject,
ContentLength: getint64(res.ContentLength),
BucketOwner: parsedAcl.Owner,
Status: status,
@@ -525,7 +501,6 @@ func (c S3ApiController) GetObject(ctx *fiber.Ctx) (*Response, error) {
"Last-Modified": utils.FormatDatePtrToString(res.LastModified, timefmt),
},
MetaOpts: &MetaOptions{
Action: metrics.ActionGetObject,
ContentLength: getint64(res.ContentLength),
BucketOwner: parsedAcl.Owner,
Status: status,
-6
View File
@@ -23,7 +23,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -48,7 +47,6 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid part number: %d", partNumberQuery)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidPartNumber)
@@ -72,7 +70,6 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -83,7 +80,6 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid x-amz-checksum-mode header value: %v", checksumMode)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetInvalidChecksumHeaderErr("x-amz-checksum-mode")
@@ -109,7 +105,6 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) {
return &Response{
Headers: headers,
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -146,7 +141,6 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) (*Response, error) {
"Last-Modified": utils.FormatDatePtrToString(res.LastModified, timefmt),
},
MetaOpts: &MetaOptions{
Action: metrics.ActionHeadObject,
BucketOwner: parsedAcl.Owner,
},
}, nil
-19
View File
@@ -24,7 +24,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -45,7 +44,6 @@ func (c S3ApiController) RestoreObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("failed to parse the request body: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionRestoreObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -65,7 +63,6 @@ func (c S3ApiController) RestoreObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionRestoreObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -78,7 +75,6 @@ func (c S3ApiController) RestoreObject(ctx *fiber.Ctx) (*Response, error) {
})
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionRestoreObject,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectRestoreCompleted,
},
@@ -100,7 +96,6 @@ func (c S3ApiController) SelectObjectContent(ctx *fiber.Ctx) (*Response, error)
debuglogger.Logf("error unmarshalling select object content: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionSelectObjectContent,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -121,7 +116,6 @@ func (c S3ApiController) SelectObjectContent(ctx *fiber.Ctx) (*Response, error)
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionSelectObjectContent,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -143,7 +137,6 @@ func (c S3ApiController) SelectObjectContent(ctx *fiber.Ctx) (*Response, error)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionSelectObjectContent,
BucketOwner: parsedAcl.Owner,
},
}, nil
@@ -179,7 +172,6 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -189,7 +181,6 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -199,7 +190,6 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -233,7 +223,6 @@ func (c S3ApiController) CreateMultipartUpload(ctx *fiber.Ctx) (*Response, error
Headers: headers,
Data: res,
MetaOpts: &MetaOptions{
Action: metrics.ActionCreateMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -266,7 +255,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -281,7 +269,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
debuglogger.Logf("error unmarshalling complete multipart upload: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -291,7 +278,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
debuglogger.Logf("empty parts provided for complete multipart upload")
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrEmptyParts)
@@ -305,7 +291,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
debuglogger.Logf("invalid value for 'x-amz-mp-objects-size' header: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -315,7 +300,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
debuglogger.Logf("value for 'x-amz-mp-objects-size' header is less than 0: %v", val)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetInvalidMpObjectSizeErr(val)
@@ -328,7 +312,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -338,7 +321,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -366,7 +348,6 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
"x-amz-version-id": &versid,
},
MetaOpts: &MetaOptions{
Action: metrics.ActionCompleteMultipartUpload,
BucketOwner: parsedAcl.Owner,
ObjectETag: res.ETag,
EventName: s3event.EventCompleteMultipartUpload,
-41
View File
@@ -27,7 +27,6 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
@@ -47,7 +46,6 @@ func (c S3ApiController) PutObjectTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -67,7 +65,6 @@ func (c S3ApiController) PutObjectTagging(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectTagging,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -76,7 +73,6 @@ func (c S3ApiController) PutObjectTagging(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutObjectTagging(ctx.Context(), bucket, key, tagging)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectTagging,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectTaggingPut,
},
@@ -106,7 +102,6 @@ func (c S3ApiController) PutObjectRetention(ctx *fiber.Ctx) (*Response, error) {
}); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -128,7 +123,6 @@ func (c S3ApiController) PutObjectRetention(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("failed to parse object lock configuration input: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -137,7 +131,6 @@ func (c S3ApiController) PutObjectRetention(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutObjectRetention(ctx.Context(), bucket, key, versionId, bypass, retention)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectRetention,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -157,7 +150,6 @@ func (c S3ApiController) PutObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("failed to parse request body: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -167,7 +159,6 @@ func (c S3ApiController) PutObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid legal hold status: %v", legalHold.Status)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrMalformedXML)
@@ -186,7 +177,6 @@ func (c S3ApiController) PutObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
}); err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -195,7 +185,6 @@ func (c S3ApiController) PutObjectLegalHold(ctx *fiber.Ctx) (*Response, error) {
err := c.be.PutObjectLegalHold(ctx.Context(), bucket, key, versionId, legalHold.Status == types.ObjectLockLegalHoldStatusOn)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectLegalHold,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -227,7 +216,6 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid part number: %d", partNumber)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPart,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidPartNumber)
@@ -248,7 +236,6 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPart,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -259,7 +246,6 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error parsing content length %q: %v", contentLengthStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPart,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -270,7 +256,6 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("err parsing checksum headers: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPart,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -314,7 +299,6 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
Headers: headers,
MetaOpts: &MetaOptions{
ContentLength: contentLength,
Action: metrics.ActionUploadPart,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -340,7 +324,6 @@ func (c S3ApiController) UploadPartCopy(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error unescaping copy source %q: %v", cs, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPartCopy,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidCopySource)
@@ -350,7 +333,6 @@ func (c S3ApiController) UploadPartCopy(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid part number: %d", partNumber)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPartCopy,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidPartNumber)
@@ -370,7 +352,6 @@ func (c S3ApiController) UploadPartCopy(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPartCopy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -395,7 +376,6 @@ func (c S3ApiController) UploadPartCopy(ctx *fiber.Ctx) (*Response, error) {
Headers: headers,
Data: resp,
MetaOpts: &MetaOptions{
Action: metrics.ActionUploadPartCopy,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -430,7 +410,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -442,7 +421,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid request: %q (grants) %q (acl)", grants, acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -454,7 +432,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error unmarshalling access control policy: %v", err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -488,7 +465,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid acl: %q", acl)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -497,7 +473,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid request: %q (grants) %q (acl) %v (body len)", grants, acl, len(ctx.Body()))
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -531,7 +506,6 @@ func (c S3ApiController) PutObjectAcl(ctx *fiber.Ctx) (*Response, error) {
err = c.be.PutObjectAcl(ctx.Context(), input)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObjectAcl,
BucketOwner: parsedAcl.Owner,
EventName: s3event.EventObjectAclPut,
},
@@ -567,7 +541,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error unescaping copy source %q: %v", cs, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidCopySource)
@@ -586,7 +559,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -599,7 +571,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error parsing copy source modified since %q: %v", copySrcModifSince, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidCopySource)
@@ -613,7 +584,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error parsing copy source unmodified since %q: %v", copySrcUnmodifSince, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidCopySource)
@@ -627,7 +597,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid metadata directive: %v", metaDirective)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidMetadataDirective)
@@ -637,7 +606,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("invalid tagging direcrive: %v", taggingDirective)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidTaggingDirective)
@@ -648,7 +616,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -658,7 +625,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -703,7 +669,6 @@ func (c S3ApiController) CopyObject(ctx *fiber.Ctx) (*Response, error) {
},
Data: res.CopyObjectResult,
MetaOpts: &MetaOptions{
Action: metrics.ActionCopyObject,
BucketOwner: parsedAcl.Owner,
ObjectETag: etag,
VersionId: res.VersionId,
@@ -758,7 +723,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -768,7 +732,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -779,7 +742,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
debuglogger.Logf("error parsing content length %q: %v", contentLengthStr, err)
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetAPIError(s3err.ErrInvalidRequest)
@@ -789,7 +751,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -799,7 +760,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
if err != nil {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
},
}, err
@@ -850,7 +810,6 @@ func (c S3ApiController) PutObject(ctx *fiber.Ctx) (*Response, error) {
},
MetaOpts: &MetaOptions{
ContentLength: contentLength,
Action: metrics.ActionPutObject,
BucketOwner: parsedAcl.Owner,
ObjectETag: &res.ETag,
ObjectSize: contentLength,
-195
View File
@@ -1,195 +0,0 @@
// Copyright 2023 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 controllers
import (
"encoding/xml"
"fmt"
"net/http"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/debuglogger"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3event"
"github.com/versity/versitygw/s3log"
)
var (
xmlhdr = []byte(`<?xml version="1.0" encoding="UTF-8"?>` + "\n")
)
const (
maxXMLBodyLen = 4 * 1024 * 1024
)
type MetaOptions struct {
ContentLength int64
Action string
BucketOwner string
ObjectSize int64
ObjectCount int64
EventName s3event.EventType
ObjectETag *string
VersionId *string
Status int
}
type Response struct {
Data any
Headers map[string]*string
MetaOpts *MetaOptions
}
type Handler func(ctx *fiber.Ctx) (*Response, error)
func ProcessResponse(handler Handler, s3logger s3log.AuditLogger, s3evnt s3event.S3EventSender, mm *metrics.Manager) fiber.Handler {
return func(ctx *fiber.Ctx) error {
// if skip locals is set, skip to the next rout handler
if utils.ContextKeySkip.IsSet(ctx) {
utils.ContextKeySkip.Delete(ctx)
return ctx.Next()
}
response, err := handler(ctx)
// Set the response headers
SetResponseHeaders(ctx, response.Headers)
opts := response.MetaOpts
// Send the metrics
if mm != nil {
if opts.ObjectCount > 0 {
mm.Send(ctx, err, opts.Action, opts.ObjectCount, opts.Status)
} else {
mm.Send(ctx, err, opts.Action, opts.ContentLength, opts.Status)
}
}
// Handle the error case
if err != nil {
// Audit the error log
if s3logger != nil {
s3logger.Log(ctx, err, nil, s3log.LogMeta{
Action: opts.Action,
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
})
}
serr, ok := err.(s3err.APIError)
if ok {
ctx.Status(serr.HTTPStatusCode)
return ctx.Send(s3err.GetAPIErrorResponse(serr, "", "", ""))
}
debuglogger.Logf("Internal Error, %v", err)
ctx.Status(http.StatusInternalServerError)
// If the error is not 's3err.APIError' return 'InternalError'
return ctx.Send(s3err.GetAPIErrorResponse(
s3err.GetAPIError(s3err.ErrInternalError), "", "", ""))
}
if opts.Status == 0 {
opts.Status = http.StatusOK
}
// if no data payload is provided, send the response status
if response.Data == nil {
ctx.Status(opts.Status)
return nil
}
var responseBytes []byte
// Handle already encoded responses(text, json...)
encodedResp, ok := response.Data.([]byte)
if ok {
responseBytes = encodedResp
} else {
if responseBytes, err = xml.Marshal(response.Data); err != nil {
return err
}
if len(responseBytes) > 0 {
ctx.Response().Header.Set("Content-Length", fmt.Sprint(len(responseBytes)))
ctx.Response().Header.SetContentType(fiber.MIMEApplicationXML)
}
}
if s3logger != nil {
s3logger.Log(ctx, nil, responseBytes, s3log.LogMeta{
Action: opts.Action,
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
})
}
if s3evnt != nil {
s3evnt.SendEvent(ctx, s3event.EventMeta{
BucketOwner: opts.BucketOwner,
ObjectSize: opts.ObjectSize,
ObjectETag: opts.ObjectETag,
VersionId: opts.VersionId,
EventName: opts.EventName,
})
}
if ok {
if len(responseBytes) > 0 {
ctx.Response().Header.Set("Content-Length", fmt.Sprint(len(responseBytes)))
}
return ctx.Send(responseBytes)
}
msglen := len(xmlhdr) + len(responseBytes)
if msglen > maxXMLBodyLen {
debuglogger.Logf("XML encoded body len %v exceeds max len %v",
msglen, maxXMLBodyLen)
ctx.Status(http.StatusInternalServerError)
return ctx.Send(s3err.GetAPIErrorResponse(
s3err.GetAPIError(s3err.ErrInternalError), "", "", ""))
}
res := make([]byte, 0, msglen)
res = append(res, xmlhdr...)
res = append(res, responseBytes...)
return ctx.Send(res)
}
}
// Sets the response headers
func SetResponseHeaders(ctx *fiber.Ctx, headers map[string]*string) {
if headers == nil {
return
}
for key, val := range headers {
if val == nil || *val == "" {
continue
}
ctx.Response().Header.Add(key, *val)
}
}
// Returns MethodNotAllowed for unmatched routes
func (c S3ApiController) HandleUnmatch(ctx *fiber.Ctx) (*Response, error) {
return &Response{
MetaOpts: &MetaOptions{
Action: metrics.ActionUndetected,
},
}, s3err.GetAPIError(s3err.ErrMethodNotAllowed)
}
+7 -46
View File
@@ -15,65 +15,26 @@
package middlewares
import (
"net/http"
"regexp"
"strings"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
var (
singlePath = regexp.MustCompile(`^/[^/]+/?$`)
)
func AclParser(be backend.Backend, logger s3log.AuditLogger, readonly bool) fiber.Handler {
// ParseAcl retreives the bucket acl and stores in the context locals
// if no bucket is found, it returns 'NoSuchBucket'
func ParseAcl(be backend.Backend) fiber.Handler {
return func(ctx *fiber.Ctx) error {
path := ctx.Path()
pathParts := strings.Split(path, "/")
bucket := pathParts[1]
if path == "/" {
return ctx.Next()
}
if ctx.Method() == http.MethodPatch {
return ctx.Next()
}
if singlePath.MatchString(path) &&
ctx.Method() == http.MethodPut &&
!ctx.Request().URI().QueryArgs().Has("acl") &&
!ctx.Request().URI().QueryArgs().Has("tagging") &&
!ctx.Request().URI().QueryArgs().Has("versioning") &&
!ctx.Request().URI().QueryArgs().Has("policy") &&
!ctx.Request().URI().QueryArgs().Has("object-lock") &&
!ctx.Request().URI().QueryArgs().Has("ownershipControls") &&
!ctx.Request().URI().QueryArgs().Has("cors") {
isRoot, acct := utils.ContextKeyIsRoot.Get(ctx).(bool), utils.ContextKeyAccount.Get(ctx).(auth.Account)
if err := auth.MayCreateBucket(acct, isRoot); err != nil {
return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger, Action: "CreateBucket"})
}
if readonly {
return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrAccessDenied),
&controllers.MetaOpts{
Logger: logger,
Action: "CreateBucket",
})
}
return ctx.Next()
}
bucket := ctx.Params("bucket")
data, err := be.GetBucketAcl(ctx.Context(), &s3.GetBucketAclInput{Bucket: &bucket})
if err != nil {
return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger})
return err
}
parsedAcl, err := auth.ParseACL(data)
if err != nil {
return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger})
return err
}
// if owner is not set, set default owner to root account
@@ -82,6 +43,6 @@ func AclParser(be backend.Backend, logger s3log.AuditLogger, readonly bool) fibe
}
utils.ContextKeyParsedAcl.Set(ctx, parsedAcl)
return ctx.Next()
return nil
}
}
+4 -30
View File
@@ -15,46 +15,20 @@
package middlewares
import (
"strings"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
func IsAdmin(logger s3log.AuditLogger) fiber.Handler {
// IsAdmin is a middleware that restricts access to admin APIs, allowing only admin users
func IsAdmin(action string) fiber.Handler {
return func(ctx *fiber.Ctx) error {
acct := utils.ContextKeyAccount.Get(ctx).(auth.Account)
if acct.Role != auth.RoleAdmin {
path := ctx.Path()
return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrAdminAccessDenied),
&controllers.MetaOpts{
Logger: logger,
Action: detectAction(path),
})
return s3err.GetAPIError(s3err.ErrAdminAccessDenied)
}
return ctx.Next()
return nil
}
}
func detectAction(path string) (action string) {
if strings.Contains(path, "create-user") {
action = metrics.ActionAdminCreateUser
} else if strings.Contains(path, "update-user") {
action = metrics.ActionAdminUpdateUser
} else if strings.Contains(path, "delete-user") {
action = metrics.ActionAdminDeleteUser
} else if strings.Contains(path, "list-user") {
action = metrics.ActionAdminListUsers
} else if strings.Contains(path, "list-buckets") {
action = metrics.ActionAdminListBuckets
} else if strings.Contains(path, "change-bucket-owner") {
action = metrics.ActionAdminChangeBucketOwner
}
return action
}
+23 -30
View File
@@ -25,11 +25,8 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
const (
@@ -42,45 +39,45 @@ type RootUserConfig struct {
Secret string
}
func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, mm *metrics.Manager, region string, debug bool) fiber.Handler {
func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, region string, debug bool) fiber.Handler {
acct := accounts{root: root, iam: iam}
return func(ctx *fiber.Ctx) error {
// The bucket is public, no need to check this signature
if utils.ContextKeyPublicBucket.IsSet(ctx) {
return ctx.Next()
return nil
}
// If ContextKeyAuthenticated is set in context locals, it means it was presigned url case
if utils.ContextKeyAuthenticated.IsSet(ctx) {
return ctx.Next()
return nil
}
authorization := ctx.Get("Authorization")
if authorization == "" {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrAuthHeaderEmpty), logger, mm)
return s3err.GetAPIError(s3err.ErrAuthHeaderEmpty)
}
authData, err := utils.ParseAuthorization(authorization)
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
if authData.Region != region {
return sendResponse(ctx, s3err.APIError{
return s3err.APIError{
Code: "SignatureDoesNotMatch",
Description: fmt.Sprintf("Credential should be scoped to a valid Region, not %v", authData.Region),
HTTPStatusCode: http.StatusForbidden,
}, logger, mm)
}
}
utils.ContextKeyIsRoot.Set(ctx, authData.Access == root.Access)
account, err := acct.getAccount(authData.Access)
if err == auth.ErrNoSuchUser {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger, mm)
return s3err.GetAPIError(s3err.ErrInvalidAccessKeyID)
}
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
utils.ContextKeyAccount.Set(ctx, account)
@@ -88,23 +85,23 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au
// Check X-Amz-Date header
date := ctx.Get("X-Amz-Date")
if date == "" {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMissingDateHeader), logger, mm)
return s3err.GetAPIError(s3err.ErrMissingDateHeader)
}
// Parse the date and check the date validity
tdate, err := time.Parse(iso8601Format, date)
if err != nil {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMalformedDate), logger, mm)
return s3err.GetAPIError(s3err.ErrMalformedDate)
}
if date[:8] != authData.Date {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrSignatureDateDoesNotMatch), logger, mm)
return s3err.GetAPIError(s3err.ErrSignatureDateDoesNotMatch)
}
// Validate the dates difference
err = utils.ValidateDate(tdate)
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
var contentLength int64
@@ -113,7 +110,7 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au
contentLength, err = strconv.ParseInt(contentLengthStr, 10, 64)
//TODO: not sure if InvalidRequest should be returned in this case
if err != nil {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), logger, mm)
return s3err.GetAPIError(s3err.ErrInvalidRequest)
}
}
@@ -136,23 +133,23 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au
return cr
})
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
return ctx.Next()
return nil
}
// Content-Length has to be set for data uploads: PutObject, UploadPart
if contentLengthStr == "" {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMissingContentLength), logger, mm)
return s3err.GetAPIError(s3err.ErrMissingContentLength)
}
// the upload limit for big data actions: PutObject, UploadPart
// is 5gb. If the size exceeds the limit, return 'EntityTooLarge' err
if contentLength > maxObjSizeLimit {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrEntityTooLarge), logger, mm)
return s3err.GetAPIError(s3err.ErrEntityTooLarge)
}
return ctx.Next()
return nil
}
if !utils.IsSpecialPayload(hashPayload) {
@@ -162,16 +159,16 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au
// Compare the calculated hash with the hash provided
if hashPayload != hexPayload {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrContentSHA256Mismatch), logger, mm)
return s3err.GetAPIError(s3err.ErrContentSHA256Mismatch)
}
}
err = utils.CheckValidSignature(ctx, authData, account.Secret, hashPayload, tdate, contentLength, debug)
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
return ctx.Next()
return nil
}
}
@@ -185,13 +182,9 @@ func (a accounts) getAccount(access string) (auth.Account, error) {
return auth.Account{
Access: a.root.Access,
Secret: a.root.Secret,
Role: "admin",
Role: auth.RoleAdmin,
}, nil
}
return a.iam.GetUserAccount(access)
}
func sendResponse(ctx *fiber.Ctx, err error, logger s3log.AuditLogger, mm *metrics.Manager) error {
return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger, MetricsMng: mm})
}
+6 -8
View File
@@ -19,17 +19,15 @@ import (
"io"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
func VerifyMD5Body(logger s3log.AuditLogger) fiber.Handler {
func VerifyMD5Body() fiber.Handler {
return func(ctx *fiber.Ctx) error {
incomingSum := ctx.Get("Content-Md5")
if incomingSum == "" {
return ctx.Next()
return nil
}
if utils.IsBigDataAction(ctx) {
@@ -39,18 +37,18 @@ func VerifyMD5Body(logger s3log.AuditLogger) fiber.Handler {
return r
})
if err != nil {
return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger})
return err
}
return ctx.Next()
return nil
}
sum := md5.Sum(ctx.Body())
calculatedSum := utils.Base64SumString(sum[:])
if incomingSum != calculatedSum {
return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidDigest), &controllers.MetaOpts{Logger: logger})
return s3err.GetAPIError(s3err.ErrInvalidDigest)
}
return ctx.Next()
return nil
}
}
+12 -14
View File
@@ -20,22 +20,20 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, mm *metrics.Manager, region string, debug bool) fiber.Handler {
func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, region string, debug bool) fiber.Handler {
acct := accounts{root: root, iam: iam}
return func(ctx *fiber.Ctx) error {
// The bucket is public, no need to check this signature
if utils.ContextKeyPublicBucket.IsSet(ctx) {
return ctx.Next()
return nil
}
if ctx.Query("X-Amz-Signature") == "" {
return ctx.Next()
return nil
}
// Set in the context the "authenticated" key, in case the authentication succeeds,
@@ -44,17 +42,17 @@ func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger
authData, err := utils.ParsePresignedURIParts(ctx)
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
utils.ContextKeyIsRoot.Set(ctx, authData.Access == root.Access)
account, err := acct.getAccount(authData.Access)
if err == auth.ErrNoSuchUser {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger, mm)
return s3err.GetAPIError(s3err.ErrInvalidAccessKeyID)
}
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
utils.ContextKeyAccount.Set(ctx, account)
@@ -64,32 +62,32 @@ func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger
contentLength, err = strconv.ParseInt(contentLengthStr, 10, 64)
//TODO: not sure if InvalidRequest should be returned in this case
if err != nil {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), logger, mm)
return err
}
}
if utils.IsBigDataAction(ctx) {
// Content-Length has to be set for data uploads: PutObject, UploadPart
if contentLengthStr == "" {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMissingContentLength), logger, mm)
return s3err.GetAPIError(s3err.ErrMissingContentLength)
}
// the upload limit for big data actions: PutObject, UploadPart
// is 5gb. If the size exceeds the limit, return 'EntityTooLarge' err
if contentLength > maxObjSizeLimit {
return sendResponse(ctx, s3err.GetAPIError(s3err.ErrEntityTooLarge), logger, mm)
return s3err.GetAPIError(s3err.ErrEntityTooLarge)
}
wrapBodyReader(ctx, func(r io.Reader) io.Reader {
return utils.NewPresignedAuthReader(ctx, r, authData, account.Secret, debug)
})
return ctx.Next()
return nil
}
err = utils.CheckPresignedSignature(ctx, authData, account.Secret, debug)
if err != nil {
return sendResponse(ctx, err, logger, mm)
return err
}
return ctx.Next()
return nil
}
}
+2 -2
View File
@@ -84,7 +84,7 @@ func AuthorizePublicBucketAccess(be backend.Backend, s3action string, policyPerm
if utils.IsUnsignedStreamingPayload(payloadType) {
checksumType, err := utils.ExtractChecksumType(ctx)
if err != nil {
return sendResponse(ctx, err, l, mm)
return err
}
wrapBodyReader(ctx, func(r io.Reader) io.Reader {
@@ -93,7 +93,7 @@ func AuthorizePublicBucketAccess(be backend.Backend, s3action string, policyPerm
return cr
})
if err != nil {
return sendResponse(ctx, err, l, mm)
return err
}
}
}
+8 -12
View File
@@ -18,19 +18,15 @@ import (
"net/url"
"github.com/gofiber/fiber/v2"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3log"
)
func DecodeURL(logger s3log.AuditLogger, mm *metrics.Manager) fiber.Handler {
return func(ctx *fiber.Ctx) error {
unescp, err := url.PathUnescape(string(ctx.Request().URI().PathOriginal()))
if err != nil {
return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidURI), &controllers.MetaOpts{Logger: logger, MetricsMng: mm})
}
ctx.Path(unescp)
return ctx.Next()
// DecodeURL url path unescapes the request url for the gateway
// to handle some special characters
func DecodeURL(ctx *fiber.Ctx) error {
unescp, err := url.PathUnescape(string(ctx.Request().URI().PathOriginal()))
if err != nil {
return err
}
ctx.Path(unescp)
return nil
}
+632 -58
View File
@@ -29,105 +29,679 @@ type S3ApiRouter struct {
WithAdmSrv bool
}
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, debug bool, readonly bool) {
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, debug bool, readonly bool, region string, root middlewares.RootUserConfig) {
ctrl := controllers.New(be, iam, logger, evs, mm, debug, readonly)
adminServices := &controllers.Services{
Logger: aLogger,
}
if sa.WithAdmSrv {
adminController := controllers.NewAdminController(iam, be, aLogger)
// CreateUser admin api
app.Patch("/create-user", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.CreateUser, aLogger, nil, nil))
app.Patch("/create-user",
controllers.ProcessHandlers(adminController.CreateUser, metrics.ActionAdminCreateUser, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminCreateUser),
))
// DeleteUsers admin api
app.Patch("/delete-user", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.DeleteUser, aLogger, nil, nil))
app.Patch("/delete-user",
controllers.ProcessHandlers(adminController.DeleteUser, metrics.ActionAdminDeleteUser, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminDeleteUser),
))
// UpdateUser admin api
app.Patch("/update-user", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.UpdateUser, aLogger, nil, nil))
app.Patch("/update-user",
controllers.ProcessHandlers(adminController.UpdateUser, metrics.ActionAdminUpdateUser, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminUpdateUser),
))
// ListUsers admin api
app.Patch("/list-users", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.ListUsers, aLogger, nil, nil))
app.Patch("/list-users",
controllers.ProcessHandlers(adminController.ListUsers, metrics.ActionAdminListUsers, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminListUsers),
))
// ChangeBucketOwner admin api
app.Patch("/change-bucket-owner", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.ChangeBucketOwner, aLogger, nil, nil))
app.Patch("/change-bucket-owner",
controllers.ProcessHandlers(adminController.ChangeBucketOwner, metrics.ActionAdminChangeBucketOwner, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminChangeBucketOwner),
))
// ListBucketsAndOwners admin api
app.Patch("/list-buckets", middlewares.IsAdmin(logger), controllers.ProcessResponse(adminController.ListBuckets, aLogger, nil, nil))
app.Patch("/list-buckets",
controllers.ProcessHandlers(adminController.ListBuckets, metrics.ActionAdminListBuckets, adminServices,
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.IsAdmin(metrics.ActionAdminListBuckets),
))
}
services := &controllers.Services{
Logger: logger,
EventSender: evs,
MetricsManager: mm,
}
// ListBuckets action
app.Get("/", controllers.ProcessResponse(ctrl.ListBuckets, logger, evs, mm))
app.Get("/",
controllers.ProcessHandlers(
ctrl.ListBuckets,
metrics.ActionListAllMyBuckets,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListAllMyBuckets, "", auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
))
bucketRouter := app.Group("/:bucket")
objectRouter := app.Group("/:bucket/*")
// PUT bucket operations
bucketRouter.Put("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.PutBucketTagging, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("ownershipControls"), controllers.ProcessResponse(ctrl.PutBucketOwnershipControls, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("versioning"), controllers.ProcessResponse(ctrl.PutBucketVersioning, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("object-lock"), controllers.ProcessResponse(ctrl.PutObjectLockConfiguration, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("cors"), controllers.ProcessResponse(ctrl.PutBucketCors, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("policy"), controllers.ProcessResponse(ctrl.PutBucketPolicy, logger, evs, mm))
bucketRouter.Put("", middlewares.MatchQueryArgs("acl"), controllers.ProcessResponse(ctrl.PutBucketAcl, logger, evs, mm))
bucketRouter.Put("", controllers.ProcessResponse(ctrl.CreateBucket, logger, evs, mm))
bucketRouter.Put("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.PutBucketTagging,
metrics.ActionPutBucketTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("ownershipControls"),
controllers.ProcessHandlers(
ctrl.PutBucketOwnershipControls,
metrics.ActionPutBucketOwnershipControls,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("versioning"),
controllers.ProcessHandlers(
ctrl.PutBucketVersioning,
metrics.ActionPutBucketVersioning,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketVersioning, auth.PutBucketVersioningAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("object-lock"),
controllers.ProcessHandlers(
ctrl.PutObjectLockConfiguration,
metrics.ActionPutObjectLockConfiguration,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectLockConfiguration, auth.PutBucketObjectLockConfigurationAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("cors"),
controllers.ProcessHandlers(
ctrl.PutBucketCors,
metrics.ActionPutBucketCors,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("policy"),
controllers.ProcessHandlers(
ctrl.PutBucketPolicy,
metrics.ActionPutBucketPolicy,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
middlewares.MatchQueryArgs("acl"),
controllers.ProcessHandlers(
ctrl.PutBucketAcl,
metrics.ActionPutBucketAcl,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutBucketAcl, auth.PutBucketAclAction, auth.PermissionWriteAcp),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Put("",
controllers.ProcessHandlers(
ctrl.CreateBucket,
metrics.ActionCreateBucket,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCreateBucket, auth.CreateBucketAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
))
// HeadBucket action
bucketRouter.Head("", controllers.ProcessResponse(ctrl.HeadBucket, logger, evs, mm))
bucketRouter.Head("",
controllers.ProcessHandlers(
ctrl.HeadBucket,
metrics.ActionHeadBucket,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionHeadBucket, auth.ListBucketAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// DELETE bucket operations
bucketRouter.Delete("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.DeleteBucketTagging, logger, evs, mm))
bucketRouter.Delete("", middlewares.MatchQueryArgs("ownershipControls"), controllers.ProcessResponse(ctrl.DeleteBucketOwnershipControls, logger, evs, mm))
bucketRouter.Delete("", middlewares.MatchQueryArgs("policy"), controllers.ProcessResponse(ctrl.DeleteBucketPolicy, logger, evs, mm))
bucketRouter.Delete("", middlewares.MatchQueryArgs("cors"), controllers.ProcessResponse(ctrl.DeleteBucketCors, logger, evs, mm))
bucketRouter.Delete("", controllers.ProcessResponse(ctrl.DeleteBucket, logger, evs, mm))
bucketRouter.Delete("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.DeleteBucketTagging,
metrics.ActionDeleteBucketTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketTagging, auth.PutBucketTaggingAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Delete("",
middlewares.MatchQueryArgs("ownershipControls"),
controllers.ProcessHandlers(
ctrl.DeleteBucketOwnershipControls,
metrics.ActionDeleteBucketOwnershipControls,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketOwnershipControls, auth.PutBucketOwnershipControlsAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Delete("",
middlewares.MatchQueryArgs("policy"),
controllers.ProcessHandlers(
ctrl.DeleteBucketPolicy,
metrics.ActionDeleteBucketPolicy,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketPolicy, auth.PutBucketPolicyAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Delete("",
middlewares.MatchQueryArgs("cors"),
controllers.ProcessHandlers(
ctrl.DeleteBucketCors,
metrics.ActionDeleteBucketCors,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucketCors, auth.PutBucketCorsAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Delete("",
controllers.ProcessHandlers(
ctrl.DeleteBucket,
metrics.ActionDeleteBucket,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteBucket, auth.DeleteBucketAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// GET bucket operations
bucketRouter.Get("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.GetBucketTagging, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("ownershipControls"), controllers.ProcessResponse(ctrl.GetBucketOwnershipControls, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("versioning"), controllers.ProcessResponse(ctrl.GetBucketVersioning, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("policy"), controllers.ProcessResponse(ctrl.GetBucketPolicy, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("cors"), controllers.ProcessResponse(ctrl.GetBucketCors, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("object-lock"), controllers.ProcessResponse(ctrl.GetObjectLockConfiguration, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("acl"), controllers.ProcessResponse(ctrl.GetBucketAcl, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("uploads"), controllers.ProcessResponse(ctrl.ListMultipartUploads, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgs("versions"), controllers.ProcessResponse(ctrl.ListObjectVersions, logger, evs, mm))
bucketRouter.Get("", middlewares.MatchQueryArgWithValue("list-type", "2"), controllers.ProcessResponse(ctrl.ListObjectsV2, logger, evs, mm))
bucketRouter.Get("", controllers.ProcessResponse(ctrl.ListObjects, logger, evs, mm))
bucketRouter.Get("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.GetBucketTagging,
metrics.ActionGetBucketTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketTagging, auth.GetBucketTaggingAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("ownershipControls"),
controllers.ProcessHandlers(
ctrl.GetBucketOwnershipControls,
metrics.ActionGetBucketOwnershipControls,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketOwnershipControls, auth.GetBucketOwnershipControlsAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("versioning"),
controllers.ProcessHandlers(
ctrl.GetBucketVersioning,
metrics.ActionGetBucketVersioning,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketVersioning, auth.GetBucketVersioningAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("policy"),
controllers.ProcessHandlers(
ctrl.GetBucketPolicy,
metrics.ActionGetBucketPolicy,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketPolicy, auth.GetBucketPolicyAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("cors"),
controllers.ProcessHandlers(
ctrl.GetBucketCors,
metrics.ActionGetBucketCors,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketCors, auth.GetBucketCorsAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("object-lock"),
controllers.ProcessHandlers(
ctrl.GetObjectLockConfiguration,
metrics.ActionGetObjectLockConfiguration,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectLockConfiguration, auth.GetBucketObjectLockConfigurationAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("acl"),
controllers.ProcessHandlers(
ctrl.GetBucketAcl,
metrics.ActionGetBucketAcl,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetBucketAcl, auth.GetBucketAclAction, auth.PermissionReadAcp),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("uploads"),
controllers.ProcessHandlers(
ctrl.ListMultipartUploads,
metrics.ActionListMultipartUploads,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListMultipartUploads, auth.ListBucketMultipartUploadsAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgs("versions"),
controllers.ProcessHandlers(
ctrl.ListObjectVersions,
metrics.ActionListObjectVersions,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjectVersions, auth.ListBucketVersionsAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
middlewares.MatchQueryArgWithValue("list-type", "2"),
controllers.ProcessHandlers(
ctrl.ListObjectsV2,
metrics.ActionListObjectsV2,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjectsV2, auth.ListBucketAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
bucketRouter.Get("",
controllers.ProcessHandlers(
ctrl.ListObjects,
metrics.ActionListObjects,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListObjects, auth.ListBucketAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// DeleteObjects action
bucketRouter.Post("", middlewares.MatchQueryArgs("delete"), controllers.ProcessResponse(ctrl.DeleteObjects, logger, evs, mm))
bucketRouter.Post("",
middlewares.MatchQueryArgs("delete"),
controllers.ProcessHandlers(
ctrl.DeleteObjects,
metrics.ActionDeleteObjects,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObjects, auth.DeleteObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// HeadObject
objectRouter.Head("", controllers.ProcessResponse(ctrl.HeadObject, logger, evs, mm))
objectRouter.Head("",
controllers.ProcessHandlers(
ctrl.HeadObject,
metrics.ActionHeadObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionHeadObject, auth.GetObjectAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// GET object operations
objectRouter.Get("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.GetObjectTagging, logger, evs, mm))
objectRouter.Get("", middlewares.MatchQueryArgs("retention"), controllers.ProcessResponse(ctrl.GetObjectRetention, logger, evs, mm))
objectRouter.Get("", middlewares.MatchQueryArgs("legal-hold"), controllers.ProcessResponse(ctrl.GetObjectLegalHold, logger, evs, mm))
objectRouter.Get("", middlewares.MatchQueryArgs("acl"), controllers.ProcessResponse(ctrl.GetObjectAcl, logger, evs, mm))
objectRouter.Get("", middlewares.MatchQueryArgs("attributes"), controllers.ProcessResponse(ctrl.GetObjectAttributes, logger, evs, mm))
objectRouter.Get("", middlewares.MatchQueryArgs("uploadId"), controllers.ProcessResponse(ctrl.ListParts, logger, evs, mm))
objectRouter.Get("", controllers.ProcessResponse(ctrl.GetObject, logger, evs, mm))
objectRouter.Get("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.GetObjectTagging,
metrics.ActionGetObjectTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectTagging, auth.GetObjectTaggingAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
middlewares.MatchQueryArgs("retention"),
controllers.ProcessHandlers(
ctrl.GetObjectRetention,
metrics.ActionGetObjectRetention,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectRetention, auth.GetObjectRetentionAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
middlewares.MatchQueryArgs("legal-hold"),
controllers.ProcessHandlers(
ctrl.GetObjectLegalHold,
metrics.ActionGetObjectLegalHold,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectLegalHold, auth.GetObjectLegalHoldAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
middlewares.MatchQueryArgs("acl"),
controllers.ProcessHandlers(
ctrl.GetObjectAcl,
metrics.ActionGetObjectAcl,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectAcl, auth.GetObjectAclAction, auth.PermissionReadAcp),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
middlewares.MatchQueryArgs("attributes"),
controllers.ProcessHandlers(
ctrl.GetObjectAttributes,
metrics.ActionGetObjectAttributes,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObjectAttributes, auth.GetObjectAttributesAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
middlewares.MatchQueryArgs("uploadId"),
controllers.ProcessHandlers(
ctrl.ListParts,
metrics.ActionListParts,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionListParts, auth.ListMultipartUploadPartsAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Get("",
controllers.ProcessHandlers(
ctrl.GetObject,
metrics.ActionGetObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionGetObject, auth.GetObjectAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// DELETE object operations
objectRouter.Delete("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.DeleteObjectTagging, logger, evs, mm))
objectRouter.Delete("", middlewares.MatchQueryArgs("uploadId"), controllers.ProcessResponse(ctrl.AbortMultipartUplaod, logger, evs, mm))
objectRouter.Delete("", controllers.ProcessResponse(ctrl.DeleteObject, logger, evs, mm))
objectRouter.Delete("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.DeleteObjectTagging,
metrics.ActionDeleteObjectTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObjectTagging, auth.DeleteObjectTaggingAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Delete("",
middlewares.MatchQueryArgs("uploadId"),
controllers.ProcessHandlers(
ctrl.AbortMultipartUpload,
metrics.ActionAbortMultipartUpload,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionAbortMultipartUpload, auth.AbortMultipartUploadAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Delete("",
controllers.ProcessHandlers(
ctrl.DeleteObject,
metrics.ActionDeleteObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionDeleteObject, auth.DeleteObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Post("", middlewares.MatchQueryArgs("restore"), controllers.ProcessResponse(ctrl.RestoreObject, logger, evs, mm))
objectRouter.Post("", middlewares.MatchQueryArgs("list-type"), middlewares.MatchQueryArgWithValue("list-type", "2"), controllers.ProcessResponse(ctrl.RestoreObject, logger, evs, mm))
objectRouter.Post("", middlewares.MatchQueryArgs("uploadId"), controllers.ProcessResponse(ctrl.CompleteMultipartUpload, logger, evs, mm))
objectRouter.Post("", middlewares.MatchQueryArgs("uploads"), controllers.ProcessResponse(ctrl.CreateMultipartUpload, logger, evs, mm))
objectRouter.Post("",
middlewares.MatchQueryArgs("restore"),
controllers.ProcessHandlers(
ctrl.RestoreObject,
metrics.ActionRestoreObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionRestoreObject, auth.RestoreObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Post("",
middlewares.MatchQueryArgs("select"),
middlewares.MatchQueryArgWithValue("select-type", "2"),
controllers.ProcessHandlers(
ctrl.SelectObjectContent,
metrics.ActionSelectObjectContent,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionSelectObjectContent, auth.GetObjectAction, auth.PermissionRead),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Post("",
middlewares.MatchQueryArgs("uploadId"),
controllers.ProcessHandlers(
ctrl.CompleteMultipartUpload,
metrics.ActionCompleteMultipartUpload,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCompleteMultipartUpload, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Post("",
middlewares.MatchQueryArgs("uploads"),
controllers.ProcessHandlers(
ctrl.CreateMultipartUpload,
metrics.ActionCreateMultipartUpload,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCreateMultipartUpload, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// PUT object operations
objectRouter.Put("", middlewares.MatchQueryArgs("tagging"), controllers.ProcessResponse(ctrl.PutObjectTagging, logger, evs, mm))
objectRouter.Put("", middlewares.MatchQueryArgs("retention"), controllers.ProcessResponse(ctrl.PutObjectRetention, logger, evs, mm))
objectRouter.Put("", middlewares.MatchQueryArgs("legal-hold"), controllers.ProcessResponse(ctrl.PutObjectLegalHold, logger, evs, mm))
objectRouter.Put("", middlewares.MatchQueryArgs("acl"), controllers.ProcessResponse(ctrl.PutObjectAcl, logger, evs, mm))
objectRouter.Put("", middlewares.MatchQueryArgs("uploadId", "partNumber"), middlewares.MatchHeader("X-Amz-Copy-Source"), controllers.ProcessResponse(ctrl.UploadPartCopy, logger, evs, mm))
objectRouter.Put("", middlewares.MatchQueryArgs("uploadId", "partNumber"), controllers.ProcessResponse(ctrl.UploadPart, logger, evs, mm))
objectRouter.Put("", middlewares.MatchHeader("X-Amz-Copy-Source"), controllers.ProcessResponse(ctrl.CopyObject, logger, evs, mm))
objectRouter.Put("", controllers.ProcessResponse(ctrl.PutObject, logger, evs, mm))
objectRouter.Put("",
middlewares.MatchQueryArgs("tagging"),
controllers.ProcessHandlers(
ctrl.PutObjectTagging,
metrics.ActionPutObjectTagging,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectTagging, auth.PutObjectTaggingAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchQueryArgs("retention"),
controllers.ProcessHandlers(
ctrl.PutObjectRetention,
metrics.ActionPutObjectRetention,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectRetention, auth.PutObjectRetentionAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchQueryArgs("legal-hold"),
controllers.ProcessHandlers(
ctrl.PutObjectLegalHold,
metrics.ActionPutObjectLegalHold,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectLegalHold, auth.PutObjectLegalHoldAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchQueryArgs("acl"),
controllers.ProcessHandlers(
ctrl.PutObjectAcl,
metrics.ActionPutObjectAcl,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObjectAcl, auth.PutObjectAclAction, auth.PermissionWriteAcp),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchQueryArgs("uploadId", "partNumber"),
middlewares.MatchHeader("X-Amz-Copy-Source"),
controllers.ProcessHandlers(
ctrl.UploadPartCopy,
metrics.ActionUploadPartCopy,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionUploadPartCopy, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchQueryArgs("uploadId", "partNumber"),
controllers.ProcessHandlers(
ctrl.UploadPart,
metrics.ActionUploadPart,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionUploadPart, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
middlewares.MatchHeader("X-Amz-Copy-Source"),
controllers.ProcessHandlers(
ctrl.CopyObject,
metrics.ActionCopyObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionCopyObject, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
objectRouter.Put("",
controllers.ProcessHandlers(
ctrl.PutObject,
metrics.ActionPutObject,
services,
middlewares.AuthorizePublicBucketAccess(be, metrics.ActionPutObject, auth.PutObjectAction, auth.PermissionWrite),
middlewares.VerifyPresignedV4Signature(root, iam, region, debug),
middlewares.VerifyV4Signature(root, iam, region, debug),
middlewares.VerifyMD5Body(),
middlewares.ParseAcl(be),
))
// Return MethodNotAllowed for all the unmatched routes
app.All("*", controllers.ProcessResponse(ctrl.HandleUnmatch, logger, evs, mm))
app.All("*", controllers.ProcessHandlers(ctrl.HandleUnmatch, metrics.ActionUndetected, services))
}
+2 -1
View File
@@ -20,6 +20,7 @@ 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) {
@@ -45,7 +46,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, false)
tt.sa.Init(tt.args.app, tt.args.be, tt.args.iam, nil, nil, nil, nil, false, false, "us-east-1", middlewares.RootUserConfig{})
})
}
}
+5 -1
View File
@@ -23,6 +23,7 @@ import (
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/metrics"
"github.com/versity/versitygw/s3api/controllers"
"github.com/versity/versitygw/s3api/middlewares"
"github.com/versity/versitygw/s3event"
"github.com/versity/versitygw/s3log"
@@ -76,7 +77,10 @@ func New(
return ctx.SendStatus(http.StatusOK)
})
}
app.Use(middlewares.DecodeURL(l, mm))
// initialize the 'DecodeURL' middleware which
// path unescapes the url
app.Use(controllers.WrapMiddleware(middlewares.DecodeURL, l, mm))
// initialize host-style parser in virtual domain is specified
if server.virtualDomain != "" {
+4
View File
@@ -130,6 +130,10 @@ func (c *S3Conf) GetClient() *s3.Client {
})
}
func (c *S3Conf) GetPresignClient() *s3.PresignClient {
return s3.NewPresignClient(c.GetClient())
}
func (c *S3Conf) GetAnonymousClient() *s3.Client {
cfg := c.Config()
cfg.Credentials = aws.AnonymousCredentials{}
+54 -96
View File
@@ -51,7 +51,6 @@ func Authentication_invalid_auth_header(s *S3Conf) error {
testName := "Authentication_invalid_auth_header"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -76,7 +75,6 @@ func Authentication_unsupported_signature_version(s *S3Conf) error {
testName := "Authentication_unsupported_signature_version"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -103,7 +101,6 @@ func Authentication_malformed_credentials(s *S3Conf) error {
testName := "Authentication_malformed_credentials"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -131,7 +128,6 @@ func Authentication_malformed_credentials_invalid_parts(s *S3Conf) error {
testName := "Authentication_malformed_credentials_invalid_parts"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -159,7 +155,6 @@ func Authentication_credentials_terminated_string(s *S3Conf) error {
testName := "Authentication_credentials_terminated_string"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -187,7 +182,6 @@ func Authentication_credentials_incorrect_service(s *S3Conf) error {
testName := "Authentication_credentials_incorrect_service"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "ec2",
@@ -217,7 +211,6 @@ func Authentication_credentials_incorrect_region(s *S3Conf) error {
}
return authHandler(&cfg, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -246,7 +239,6 @@ func Authentication_credentials_invalid_date(s *S3Conf) error {
testName := "Authentication_credentials_invalid_date"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -274,7 +266,6 @@ func Authentication_credentials_future_date(s *S3Conf) error {
testName := "Authentication_credentials_future_date"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -312,7 +303,6 @@ func Authentication_credentials_past_date(s *S3Conf) error {
testName := "Authentication_credentials_past_date"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -350,7 +340,6 @@ func Authentication_credentials_non_existing_access_key(s *S3Conf) error {
testName := "Authentication_credentials_non_existing_access_key"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -378,7 +367,6 @@ func Authentication_invalid_signed_headers(s *S3Conf) error {
testName := "Authentication_invalid_signed_headers"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -406,7 +394,6 @@ func Authentication_missing_date_header(s *S3Conf) error {
testName := "Authentication_missing_date_header"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -431,7 +418,6 @@ func Authentication_invalid_date_header(s *S3Conf) error {
testName := "Authentication_invalid_date_header"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -456,7 +442,6 @@ func Authentication_date_mismatch(s *S3Conf) error {
testName := "Authentication_date_mismatch"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -481,7 +466,6 @@ func Authentication_incorrect_payload_hash(s *S3Conf) error {
testName := "Authentication_incorrect_payload_hash"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -506,7 +490,6 @@ func Authentication_incorrect_md5(s *S3Conf) error {
testName := "Authentication_incorrect_md5"
return authHandler(s, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -534,7 +517,6 @@ func Authentication_signature_error_incorrect_secret_key(s *S3Conf) error {
cfg.awsSecret = s.awsSecret + "a"
return authHandler(&cfg, &authConfig{
testName: testName,
path: "my-bucket",
method: http.MethodGet,
body: nil,
service: "s3",
@@ -556,9 +538,9 @@ func Authentication_signature_error_incorrect_secret_key(s *S3Conf) error {
func PresignedAuth_unsupported_algorithm(s *S3Conf) error {
testName := "PresignedAuth_unsupported_algorithm"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -586,9 +568,9 @@ func PresignedAuth_unsupported_algorithm(s *S3Conf) error {
func PresignedAuth_missing_credentials_query_param(s *S3Conf) error {
testName := "PresignedAuth_missing_credentials_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -623,9 +605,9 @@ func PresignedAuth_missing_credentials_query_param(s *S3Conf) error {
func PresignedAuth_malformed_creds_invalid_parts(s *S3Conf) error {
testName := "PresignedAuth_malformed_creds_invalid_parts"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -660,9 +642,9 @@ func PresignedAuth_malformed_creds_invalid_parts(s *S3Conf) error {
func PresignedAuth_creds_invalid_terminator(s *S3Conf) error {
testName := "PresignedAuth_creds_invalid_terminator"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -693,9 +675,9 @@ func PresignedAuth_creds_invalid_terminator(s *S3Conf) error {
func PresignedAuth_creds_incorrect_service(s *S3Conf) error {
testName := "PresignedAuth_creds_incorrect_service"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -726,17 +708,19 @@ func PresignedAuth_creds_incorrect_service(s *S3Conf) error {
func PresignedAuth_creds_incorrect_region(s *S3Conf) error {
testName := "PresignedAuth_creds_incorrect_region"
cfg := *s
return presignedAuthHandler(s, testName, func(_ *s3.PresignClient, bucket string) error {
cfg := *s
if cfg.awsRegion == "us-east-1" {
cfg.awsRegion = "us-west-1"
} else {
cfg.awsRegion = "us-east-1"
}
if cfg.awsRegion == "us-east-1" {
cfg.awsRegion = "us-west-1"
} else {
cfg.awsRegion = "us-east-1"
}
client := cfg.GetPresignClient()
return presignedAuthHandler(&cfg, testName, func(client *s3.PresignClient) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -766,9 +750,9 @@ func PresignedAuth_creds_incorrect_region(s *S3Conf) error {
func PresignedAuth_creds_invalid_date(s *S3Conf) error {
testName := "PresignedAuth_creds_invalid_date"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -799,9 +783,9 @@ func PresignedAuth_creds_invalid_date(s *S3Conf) error {
func PresignedAuth_non_existing_access_key_id(s *S3Conf) error {
testName := "PresignedAuth_non_existing_access_key_id"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -832,9 +816,9 @@ func PresignedAuth_non_existing_access_key_id(s *S3Conf) error {
func PresignedAuth_missing_date_query(s *S3Conf) error {
testName := "PresignedAuth_missing_date_query"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -869,9 +853,9 @@ func PresignedAuth_missing_date_query(s *S3Conf) error {
func PresignedAuth_dates_mismatch(s *S3Conf) error {
testName := "PresignedAuth_dates_mismatch"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -902,9 +886,9 @@ func PresignedAuth_dates_mismatch(s *S3Conf) error {
func PresignedAuth_missing_signed_headers_query_param(s *S3Conf) error {
testName := "PresignedAuth_missing_signed_headers_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -939,9 +923,9 @@ func PresignedAuth_missing_signed_headers_query_param(s *S3Conf) error {
func PresignedAuth_missing_expiration_query_param(s *S3Conf) error {
testName := "PresignedAuth_missing_expiration_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -976,9 +960,9 @@ func PresignedAuth_missing_expiration_query_param(s *S3Conf) error {
func PresignedAuth_invalid_expiration_query_param(s *S3Conf) error {
testName := "PresignedAuth_invalid_expiration_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -1013,9 +997,9 @@ func PresignedAuth_invalid_expiration_query_param(s *S3Conf) error {
func PresignedAuth_negative_expiration_query_param(s *S3Conf) error {
testName := "PresignedAuth_negative_expiration_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -1050,9 +1034,9 @@ func PresignedAuth_negative_expiration_query_param(s *S3Conf) error {
func PresignedAuth_exceeding_expiration_query_param(s *S3Conf) error {
testName := "PresignedAuth_exceeding_expiration_query_param"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -1087,9 +1071,9 @@ func PresignedAuth_exceeding_expiration_query_param(s *S3Conf) error {
func PresignedAuth_expired_request(s *S3Conf) error {
testName := "PresignedAuth_expired_request"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -1131,11 +1115,13 @@ func PresignedAuth_expired_request(s *S3Conf) error {
func PresignedAuth_incorrect_secret_key(s *S3Conf) error {
testName := "PresignedAuth_incorrect_secret_key"
cfg := *s
cfg.awsSecret += "x"
return presignedAuthHandler(&cfg, testName, func(client *s3.PresignClient) error {
return presignedAuthHandler(s, testName, func(_ *s3.PresignClient, bucket string) error {
cfg := *s
cfg.awsSecret += "x"
client := cfg.GetPresignClient()
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: getPtr("my-bucket")})
v4req, err := client.PresignDeleteBucket(ctx, &s3.DeleteBucketInput{Bucket: &bucket})
cancel()
if err != nil {
return err
@@ -1161,12 +1147,7 @@ func PresignedAuth_incorrect_secret_key(s *S3Conf) error {
func PresignedAuth_PutObject_success(s *S3Conf) error {
testName := "PresignedAuth_PutObject_success"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
bucket := getBucketName()
err := setup(s, bucket)
if err != nil {
return err
}
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignPutObject(ctx, &s3.PutObjectInput{Bucket: &bucket, Key: getPtr("my-obj")})
cancel()
@@ -1188,23 +1169,14 @@ func PresignedAuth_PutObject_success(s *S3Conf) error {
return fmt.Errorf("expected my-obj to be successfully uploaded and get 200 response status, instead got %v", resp.StatusCode)
}
err = teardown(s, bucket)
if err != nil {
return err
}
return nil
})
}
func PresignedAuth_Put_GetObject_with_data(s *S3Conf) error {
testName := "PresignedAuth_Put_GetObject_with_data"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
bucket, obj := getBucketName(), "my-obj"
err := setup(s, bucket)
if err != nil {
return err
}
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
obj := "my-obj"
data := "Hello world"
body := strings.NewReader(data)
@@ -1263,23 +1235,14 @@ func PresignedAuth_Put_GetObject_with_data(s *S3Conf) error {
return fmt.Errorf("expected get object response body to be %v, instead got %s", data, respBody)
}
err = teardown(s, bucket)
if err != nil {
return err
}
return nil
})
}
func PresignedAuth_Put_GetObject_with_UTF8_chars(s *S3Conf) error {
testName := "PresignedAuth_Put_GetObject_with_UTF8_chars"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
bucket, obj := getBucketName(), "my-$%^&*;"
err := setup(s, bucket)
if err != nil {
return err
}
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
obj := "my-$%^&*;"
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
v4req, err := client.PresignPutObject(ctx, &s3.PutObjectInput{Bucket: &bucket, Key: &obj})
@@ -1325,19 +1288,14 @@ func PresignedAuth_Put_GetObject_with_UTF8_chars(s *S3Conf) error {
return fmt.Errorf("expected get object response status to be %v, instead got %v", http.StatusOK, resp.StatusCode)
}
err = teardown(s, bucket)
if err != nil {
return err
}
return nil
})
}
func PresignedAuth_UploadPart(s *S3Conf) error {
testName := "PresignedAuth_UploadPart"
return presignedAuthHandler(s, testName, func(client *s3.PresignClient) error {
bucket, key, partNumber := getBucketName(), "my-mp", int32(1)
return presignedAuthHandler(s, testName, func(client *s3.PresignClient, bucket string) error {
key, partNumber := "my-mp", int32(1)
err := setup(s, bucket)
if err != nil {
@@ -17445,7 +17403,7 @@ func PublicBucket_public_acl(s *S3Conf) error {
})
return err
},
ExpectedErr: s3err.GetAPIError(s3err.ErrNotImplemented),
ExpectedErr: s3err.GetAPIError(s3err.ErrAccessDenied),
},
{
Action: "GetObjectAttributes",
+15 -3
View File
@@ -284,11 +284,23 @@ func authHandler(s *S3Conf, cfg *authConfig, handler func(req *http.Request) err
return nil
}
func presignedAuthHandler(s *S3Conf, testName string, handler func(client *s3.PresignClient) error) error {
func presignedAuthHandler(s *S3Conf, testName string, handler func(client *s3.PresignClient, bucket string) error) error {
runF(testName)
clt := s3.NewPresignClient(s.GetClient())
bucket := getBucketName()
err := setup(s, bucket)
if err != nil {
failF("%v: %v", testName, err)
return fmt.Errorf("%v: %w", testName, err)
}
clt := s.GetPresignClient()
err := handler(clt)
err = handler(clt, bucket)
if err != nil {
failF("%v: %v", testName, err)
return fmt.Errorf("%v: %w", testName, err)
}
err = teardown(s, bucket)
if err != nil {
failF("%v: %v", testName, err)
return fmt.Errorf("%v: %w", testName, err)