diff options
| author | Lapshin Vitaliy <mr.lapshin.vitaly@gmail.com> | 2022-06-20 11:32:58 +0300 |
|---|---|---|
| committer | Lapshin Vitaliy <mr.lapshin.vitaly@gmail.com> | 2022-06-20 11:32:58 +0300 |
| commit | 5f5fd0bc48d9ca28cd7d55af1c9b57a940c6fd9c (patch) | |
| tree | 0f3692e54949964f9ad61f48e6f83f163382e106 /weed/s3api/s3api_object_copy_handlers.go | |
| parent | aaa9938353a02ca38cfe4a309b857c1ff8f738ca (diff) | |
| download | seaweedfs-5f5fd0bc48d9ca28cd7d55af1c9b57a940c6fd9c.tar.xz seaweedfs-5f5fd0bc48d9ca28cd7d55af1c9b57a940c6fd9c.zip | |
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 | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index 9157748f6..8e62deb94 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_handlers.go @@ -45,7 +45,11 @@ 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) + } err = s3a.touch(dir, name, entry) if err != nil { s3err.WriteErrorResponse(w, r, s3err.ErrInvalidCopySource) @@ -252,7 +256,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 +281,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 { |
