aboutsummaryrefslogtreecommitdiff
path: root/weed/server/filer_server_handlers_write_autochunk.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/filer_server_handlers_write_autochunk.go')
-rw-r--r--weed/server/filer_server_handlers_write_autochunk.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go
index 76e320908..0d6462c11 100644
--- a/weed/server/filer_server_handlers_write_autochunk.go
+++ b/weed/server/filer_server_handlers_write_autochunk.go
@@ -3,6 +3,7 @@ package weed_server
import (
"bytes"
"context"
+ "encoding/base64"
"errors"
"fmt"
"io"
@@ -336,6 +337,37 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa
}
}
+ // Process SSE metadata headers sent by S3 API and store in entry extended metadata
+ if sseIVHeader := r.Header.Get(s3_constants.SeaweedFSSSEIVHeader); sseIVHeader != "" {
+ // Decode base64-encoded IV and store in metadata
+ if ivData, err := base64.StdEncoding.DecodeString(sseIVHeader); err == nil {
+ entry.Extended[s3_constants.SeaweedFSSSEIV] = ivData
+ glog.V(4).Infof("Stored SSE-C IV metadata for %s", entry.FullPath)
+ } else {
+ glog.Errorf("Failed to decode SSE-C IV header for %s: %v", entry.FullPath, err)
+ }
+ }
+
+ // Store SSE-C algorithm and key MD5 for proper S3 API response headers
+ if sseAlgorithm := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerAlgorithm); sseAlgorithm != "" {
+ entry.Extended[s3_constants.AmzServerSideEncryptionCustomerAlgorithm] = []byte(sseAlgorithm)
+ glog.V(4).Infof("Stored SSE-C algorithm metadata for %s", entry.FullPath)
+ }
+ if sseKeyMD5 := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerKeyMD5); sseKeyMD5 != "" {
+ entry.Extended[s3_constants.AmzServerSideEncryptionCustomerKeyMD5] = []byte(sseKeyMD5)
+ glog.V(4).Infof("Stored SSE-C key MD5 metadata for %s", entry.FullPath)
+ }
+
+ if sseKMSHeader := r.Header.Get(s3_constants.SeaweedFSSSEKMSKeyHeader); sseKMSHeader != "" {
+ // Decode base64-encoded KMS metadata and store
+ if kmsData, err := base64.StdEncoding.DecodeString(sseKMSHeader); err == nil {
+ entry.Extended[s3_constants.SeaweedFSSSEKMSKey] = kmsData
+ glog.V(4).Infof("Stored SSE-KMS metadata for %s", entry.FullPath)
+ } else {
+ glog.Errorf("Failed to decode SSE-KMS metadata header for %s: %v", entry.FullPath, err)
+ }
+ }
+
dbErr := fs.filer.CreateEntry(ctx, entry, false, false, nil, skipCheckParentDirEntry(r), so.MaxFileNameLength)
// In test_bucket_listv2_delimiter_basic, the valid object key is the parent folder
if dbErr != nil && strings.HasSuffix(dbErr.Error(), " is a file") && isS3Request(r) {
@@ -488,6 +520,15 @@ func SaveAmzMetaData(r *http.Request, existing map[string][]byte, isReplace bool
}
}
+ // Handle SSE-C headers
+ if algorithm := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerAlgorithm); algorithm != "" {
+ metadata[s3_constants.AmzServerSideEncryptionCustomerAlgorithm] = []byte(algorithm)
+ }
+ if keyMD5 := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerKeyMD5); keyMD5 != "" {
+ // Store as-is; SSE-C MD5 is base64 and case-sensitive
+ metadata[s3_constants.AmzServerSideEncryptionCustomerKeyMD5] = []byte(keyMD5)
+ }
+
//acp-owner
acpOwner := r.Header.Get(s3_constants.ExtAmzOwnerKey)
if len(acpOwner) > 0 {