Object locking need to persist the tags and set the headers (#6994)

* fix object locking read and write

No logic to include object lock metadata in HEAD/GET response headers
No logic to extract object lock metadata from PUT request headers

* add tests for object locking

* Update weed/s3api/s3api_object_handlers_put.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update weed/s3api/s3api_object_handlers.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor

* add unit tests

* sync versions

* Update s3_worm_integration_test.go

* fix legal hold values

* lint

* fix tests

* racing condition when enable versioning

* fix tests

* validate put object lock header

* allow check lock permissions for PUT

* default to OFF legal hold

* only set object lock headers for objects that are actually from object lock-enabled buckets

fix     --- FAIL: TestAddObjectLockHeadersToResponse/Handle_entry_with_no_object_lock_metadata (0.00s)

* address comments

* fix tests

* purge

* fix

* refactoring

* address comment

* address comment

* Update weed/s3api/s3api_object_handlers_put.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update weed/s3api/s3api_object_handlers_put.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update weed/s3api/s3api_object_handlers.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* avoid nil

* ensure locked objects cannot be overwritten

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Chris Lu
2025-07-16 23:00:25 -07:00
committed by GitHub
parent 89706d36dc
commit a524b4f485
19 changed files with 1397 additions and 255 deletions

View File

@@ -53,7 +53,7 @@ func TestWORMRetentionIntegration(t *testing.T) {
_, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
BypassGovernanceRetention: true,
BypassGovernanceRetention: aws.Bool(true),
})
require.NoError(t, err)
}
@@ -190,7 +190,7 @@ func TestRetentionBulkOperations(t *testing.T) {
Bucket: aws.String(bucketName),
Delete: &types.Delete{
Objects: objectsToDelete,
Quiet: false,
Quiet: aws.Bool(false),
},
})
@@ -209,10 +209,10 @@ func TestRetentionBulkOperations(t *testing.T) {
// Try bulk delete with bypass - should succeed
_, err = client.DeleteObjects(context.TODO(), &s3.DeleteObjectsInput{
Bucket: aws.String(bucketName),
BypassGovernanceRetention: true,
BypassGovernanceRetention: aws.Bool(true),
Delete: &types.Delete{
Objects: objectsToDelete,
Quiet: false,
Quiet: aws.Bool(false),
},
})
if err != nil {
@@ -246,7 +246,7 @@ func TestRetentionWithMultipartUpload(t *testing.T) {
uploadResp, err := client.UploadPart(context.TODO(), &s3.UploadPartInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
PartNumber: 1,
PartNumber: aws.Int32(1),
UploadId: uploadId,
Body: strings.NewReader(partContent),
})
@@ -261,7 +261,7 @@ func TestRetentionWithMultipartUpload(t *testing.T) {
Parts: []types.CompletedPart{
{
ETag: uploadResp.ETag,
PartNumber: 1,
PartNumber: aws.Int32(1),
},
},
},
@@ -415,7 +415,7 @@ func TestRetentionBucketDefaults(t *testing.T) {
Rule: &types.ObjectLockRule{
DefaultRetention: &types.DefaultRetention{
Mode: types.ObjectLockRetentionModeGovernance,
Days: 1, // 1 day default
Days: aws.Int32(1), // 1 day default
},
},
},