mirror of
https://github.com/versity/versitygw.git
synced 2025-12-23 05:05:16 +00:00
Closes #1549 Fixes #1593 Fixes #1521 Fixes #1427 Fixes #1311 Fixes #1301 Fixes #1040 This PR primarily focuses on checksum calculation within the gateway, but it also includes several related fixes and improvements. It introduces a middleware responsible for handling and calculating checksums for the `x-amz-checksum-*` headers and `Content-MD5`. The middleware is applied only to actions that expect a request body or checksum headers. It also enforces validation for actions that require a non-empty request body, returning an error if the body is missing. Similarly, it returns an error for actions where at least one checksum header (`Content-MD5` or `x-amz-checksum-*`) is required but none is provided. The implementation is based on [https://gist.github.com/niksis02/eec3198f03e561a0998d67af75c648d7](the reference table), tested directly against S3: It also fixes the error case where the `x-amz-sdk-checksum-algorithm` header is present but no corresponding `x-amz-checksum-*` or `x-amz-trailer` header is included. Additionally, the PR improves validation for the `x-amz-content-sha256` header. For actions that require this header, an error is now returned when it’s missing. For actions that don’t require it, the middleware no longer enforces its presence. Following the common S3 pattern, the header remains mandatory for admin routes. Finally, the `x-amz-content-sha256` header is now optional for anonymous requests, as it is not required in that case.
77 lines
2.8 KiB
Go
77 lines
2.8 KiB
Go
// 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 s3api
|
|
|
|
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, 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.ProcessHandlers(ctrl.CreateUser, metrics.ActionAdminCreateUser, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminCreateUser),
|
|
))
|
|
|
|
// DeleteUsers admin api
|
|
app.Patch("/delete-user",
|
|
controllers.ProcessHandlers(ctrl.DeleteUser, metrics.ActionAdminDeleteUser, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminDeleteUser),
|
|
))
|
|
|
|
// UpdateUser admin api
|
|
app.Patch("/update-user",
|
|
controllers.ProcessHandlers(ctrl.UpdateUser, metrics.ActionAdminUpdateUser, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminUpdateUser),
|
|
))
|
|
|
|
// ListUsers admin api
|
|
app.Patch("/list-users",
|
|
controllers.ProcessHandlers(ctrl.ListUsers, metrics.ActionAdminListUsers, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminListUsers),
|
|
))
|
|
|
|
// ChangeBucketOwner admin api
|
|
app.Patch("/change-bucket-owner",
|
|
controllers.ProcessHandlers(ctrl.ChangeBucketOwner, metrics.ActionAdminChangeBucketOwner, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminChangeBucketOwner),
|
|
))
|
|
|
|
// ListBucketsAndOwners admin api
|
|
app.Patch("/list-buckets",
|
|
controllers.ProcessHandlers(ctrl.ListBuckets, metrics.ActionAdminListBuckets, services,
|
|
middlewares.VerifyV4Signature(root, iam, region, false, true),
|
|
middlewares.IsAdmin(metrics.ActionAdminListBuckets),
|
|
))
|
|
}
|