* filer use context without cancellation * pass along context * fix: copy to bucket with default SSE-S3 encryption fails (#7562) When copying an object from an encrypted bucket to a temporary unencrypted bucket, then to another bucket with default SSE-S3 encryption, the operation fails with 'invalid SSE-S3 source key type' error. Root cause: When objects are copied from an SSE-S3 encrypted bucket to an unencrypted bucket, the 'X-Amz-Server-Side-Encryption: AES256' header is preserved but the actual encryption key (SeaweedFSSSES3Key) is stripped. This creates an 'orphaned' SSE-S3 header that causes IsSSES3EncryptedInternal() to return true, triggering decryption logic with a nil key. Fix: 1. Modified IsSSES3EncryptedInternal() to require BOTH the AES256 header AND the SeaweedFSSSES3Key to be present before returning true 2. Added isOrphanedSSES3Header() to detect orphaned SSE-S3 headers 3. Updated copy handler to strip orphaned headers during copy operations Fixes #7562 * fmt * refactor: simplify isOrphanedSSES3Header function logic Remove redundant existence check since the caller iterates through metadata map, making the check unnecessary. Improves readability while maintaining the same functionality.
This commit is contained in:
@@ -630,11 +630,19 @@ func TestSSES3IsEncryptedInternal(t *testing.T) {
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "Valid SSE-S3 metadata",
|
||||
name: "Valid SSE-S3 metadata with key",
|
||||
metadata: map[string][]byte{
|
||||
s3_constants.AmzServerSideEncryption: []byte("AES256"),
|
||||
s3_constants.SeaweedFSSSES3Key: []byte("test-key-data"),
|
||||
},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "SSE-S3 header without key (orphaned header - GitHub #7562)",
|
||||
metadata: map[string][]byte{
|
||||
s3_constants.AmzServerSideEncryption: []byte("AES256"),
|
||||
},
|
||||
expected: true,
|
||||
expected: false, // Should not be considered encrypted without the key
|
||||
},
|
||||
{
|
||||
name: "SSE-KMS metadata",
|
||||
@@ -650,6 +658,13 @@ func TestSSES3IsEncryptedInternal(t *testing.T) {
|
||||
},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "Key without header",
|
||||
metadata: map[string][]byte{
|
||||
s3_constants.SeaweedFSSSES3Key: []byte("test-key-data"),
|
||||
},
|
||||
expected: false, // Need both header and key
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
||||
Reference in New Issue
Block a user