1
0
Fork 0
mirror of https://github.com/chrislusf/seaweedfs synced 2024-09-19 07:21:00 +02:00

check uploadid using object name hash string

This commit is contained in:
guol-fnst 2022-04-12 11:04:38 +08:00
parent 2232cfb5b7
commit 180aa88a92
2 changed files with 25 additions and 15 deletions

View file

@ -13,7 +13,6 @@ import (
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3"
"github.com/google/uuid"
"github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/filer"
"github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/glog"
@ -29,8 +28,7 @@ func (s3a *S3ApiServer) createMultipartUpload(input *s3.CreateMultipartUploadInp
glog.V(2).Infof("createMultipartUpload input %v", input) glog.V(2).Infof("createMultipartUpload input %v", input)
uploadId, _ := uuid.NewRandom() uploadIdString := s3a.generateUploadID(*input.Key)
uploadIdString := uploadId.String()
if err := s3a.mkdir(s3a.genUploadsFolder(*input.Bucket), uploadIdString, func(entry *filer_pb.Entry) { if err := s3a.mkdir(s3a.genUploadsFolder(*input.Bucket), uploadIdString, func(entry *filer_pb.Entry) {
if entry.Extended == nil { if entry.Extended == nil {

View file

@ -2,6 +2,7 @@ package s3api
import ( import (
"encoding/xml" "encoding/xml"
"crypto/sha1"
"fmt" "fmt"
"github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/glog"
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http" xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
@ -70,7 +71,7 @@ func (s3a *S3ApiServer) CompleteMultipartUploadHandler(w http.ResponseWriter, r
// Get upload id. // Get upload id.
uploadID, _, _, _ := getObjectResources(r.URL.Query()) uploadID, _, _, _ := getObjectResources(r.URL.Query())
err := s3a.chkUploadID(bucket, object, uploadID) err := s3a.chkUploadID(object, uploadID)
if err != nil { if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload)
return return
@ -99,7 +100,7 @@ func (s3a *S3ApiServer) AbortMultipartUploadHandler(w http.ResponseWriter, r *ht
// Get upload id. // Get upload id.
uploadID, _, _, _ := getObjectResources(r.URL.Query()) uploadID, _, _, _ := getObjectResources(r.URL.Query())
err := s3a.chkUploadID(bucket, object, uploadID) err := s3a.chkUploadID(object, uploadID)
if err != nil { if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload)
return return
@ -175,7 +176,7 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re
return return
} }
err := s3a.chkUploadID(bucket, object, uploadID) err := s3a.chkUploadID(object, uploadID)
if err != nil { if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload)
return return
@ -205,7 +206,13 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ
bucket, object := xhttp.GetBucketAndObject(r) bucket, object := xhttp.GetBucketAndObject(r)
uploadID := r.URL.Query().Get("uploadId") uploadID := r.URL.Query().Get("uploadId")
err := s3a.chkUploadID(bucket, object, uploadID) exists, err := s3a.exists(s3a.genUploadsFolder(bucket), uploadID, true)
if !exists {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload)
return
}
err = s3a.chkUploadID(object, uploadID)
if err != nil { if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchUpload)
return return
@ -266,16 +273,21 @@ func (s3a *S3ApiServer) genUploadsFolder(bucket string) string {
return fmt.Sprintf("%s/%s/.uploads", s3a.option.BucketsPath, bucket) return fmt.Sprintf("%s/%s/.uploads", s3a.option.BucketsPath, bucket)
} }
//Check object name and uploadID when processing multipart uploading // Generate uploadID hash string from object
func (s3a *S3ApiServer) chkUploadID(bucket string, object string, id string) error { func (s3a *S3ApiServer) generateUploadID(object string) string {
entry, err := s3a.getEntry(s3a.genUploadsFolder(bucket), id) if strings.HasPrefix(object, "/") {
if err != nil { object = object[1:]
glog.Errorf("getEntry %v/%v : %v", s3a.genUploadsFolder(bucket), id, err)
return err
} }
h := sha1.New()
h.Write([]byte(object))
return fmt.Sprintf("%x", h.Sum(nil))
}
key := "/" + string(entry.Extended["key"]) //Check object name and uploadID when processing multipart uploading
if key != object { func (s3a *S3ApiServer) chkUploadID(object string, id string) error {
hash := s3a.generateUploadID(object)
if hash != id {
glog.Errorf("object %s and uploadID %s are not matched", object, id) glog.Errorf("object %s and uploadID %s are not matched", object, id)
return fmt.Errorf("object %s and uploadID %s are not matched", object, id) return fmt.Errorf("object %s and uploadID %s are not matched", object, id)
} }