diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2022-06-29 01:37:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-29 01:37:14 -0700 |
| commit | c6e6e303db12b61b899b62bfda7f65ae48f6e01c (patch) | |
| tree | 8185f050c9883ae779ad90c55ea5b2f3681891ec /weed/s3api/s3api_object_copy_handlers.go | |
| parent | e22c2c80121125e1a2d7b0bb02f854a1c122e1b8 (diff) | |
| parent | 7c3d9d05353918e7a0d59c06e1a6aa1b688f8ecb (diff) | |
| download | seaweedfs-c6e6e303db12b61b899b62bfda7f65ae48f6e01c.tar.xz seaweedfs-c6e6e303db12b61b899b62bfda7f65ae48f6e01c.zip | |
Merge pull request #3200 from lapshin-vitaly/bufix/validate-tags-on-copy
validate tags on copy object and add regex for validating tags
Diffstat (limited to 'weed/s3api/s3api_object_copy_handlers.go')
| -rw-r--r-- | weed/s3api/s3api_object_copy_handlers.go | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index 6b67ef337..950e7a8fb 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_handlers.go @@ -45,7 +45,12 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request s3err.WriteErrorResponse(w, r, s3err.ErrInvalidCopySource) return } - entry.Extended = processMetadataBytes(r.Header, entry.Extended, replaceMeta, replaceTagging) + entry.Extended, err = processMetadataBytes(r.Header, entry.Extended, replaceMeta, replaceTagging) + if err != nil { + glog.Errorf("CopyObjectHandler ValidateTags error %s: %v", r.URL, err) + s3err.WriteErrorResponse(w, r, s3err.ErrInvalidTag) + return + } err = s3a.touch(dir, name, entry) if err != nil { s3err.WriteErrorResponse(w, r, s3err.ErrInvalidCopySource) @@ -252,7 +257,7 @@ func processMetadata(reqHeader, existing http.Header, replaceMeta, replaceTaggin return } -func processMetadataBytes(reqHeader http.Header, existing map[string][]byte, replaceMeta, replaceTagging bool) (metadata map[string][]byte) { +func processMetadataBytes(reqHeader http.Header, existing map[string][]byte, replaceMeta, replaceTagging bool) (metadata map[string][]byte, err error) { metadata = make(map[string][]byte) if sc := existing[s3_constants.AmzStorageClass]; len(sc) > 0 { @@ -277,16 +282,18 @@ func processMetadataBytes(reqHeader http.Header, existing map[string][]byte, rep } } } - if replaceTagging { if tags := reqHeader.Get(s3_constants.AmzObjectTagging); tags != "" { - for _, v := range strings.Split(tags, "&") { - tag := strings.Split(v, "=") - if len(tag) == 2 { - metadata[s3_constants.AmzObjectTagging+"-"+tag[0]] = []byte(tag[1]) - } else if len(tag) == 1 { - metadata[s3_constants.AmzObjectTagging+"-"+tag[0]] = nil - } + parsedTags, err := parseTagsHeader(tags) + if err != nil { + return nil, err + } + err = ValidateTags(parsedTags) + if err != nil { + return nil, err + } + for k, v := range parsedTags { + metadata[s3_constants.AmzObjectTagging+"-"+k] = []byte(v) } } } else { |
