diff --git a/internal/bucket/lifecycle/lifecycle.go b/internal/bucket/lifecycle/lifecycle.go index d98bd9e5f..68da9251c 100644 --- a/internal/bucket/lifecycle/lifecycle.go +++ b/internal/bucket/lifecycle/lifecycle.go @@ -36,7 +36,7 @@ var ( errLifecycleNoRule = Errorf("Lifecycle configuration should have at least one rule") errLifecycleDuplicateID = Errorf("Rule ID must be unique. Found same ID for more than one rule") errXMLNotWellFormed = Errorf("The XML you provided was not well-formed or did not validate against our published schema") - errLifecycleBucketLocked = Errorf("--expire-day, --expire-delete-marker, --expire-all-object-versions and --noncurrent-expire-days can't be used for locked bucket") + errLifecycleBucketLocked = Errorf("ExpiredObjectAllVersions element and DelMarkerExpiration action cannot be used on an object locked bucket") ) const ( @@ -253,10 +253,7 @@ func (lc Lifecycle) Validate(lr lock.Retention) error { if err := r.Validate(); err != nil { return err } - if (r.Expiration.DeleteMarker.val || // DeleteVersionAction - !r.DelMarkerExpiration.Empty() || // DelMarkerDeleteAllVersionsAction - !r.NoncurrentVersionExpiration.IsDaysNull() || // DeleteVersionAction - !r.Expiration.IsDaysNull()) && lr.LockEnabled { + if lr.LockEnabled && (r.Expiration.DeleteAll.val || !r.DelMarkerExpiration.Empty()) { return errLifecycleBucketLocked } } diff --git a/internal/bucket/lifecycle/lifecycle_test.go b/internal/bucket/lifecycle/lifecycle_test.go index 28ffc5f90..dfe6bbeb9 100644 --- a/internal/bucket/lifecycle/lifecycle_test.go +++ b/internal/bucket/lifecycle/lifecycle_test.go @@ -63,25 +63,39 @@ func TestParseAndValidateLifecycleConfig(t *testing.T) { expectedParsingErr: nil, expectedValidationErr: nil, }, - { // invalid lifecycle config + { // Using ExpiredObjectAllVersions element with an object locked bucket inputConfig: ` - - testRule1 + + ExpiredObjectAllVersions with object locking prefix Enabled - 3 - - - testRule2 + + 3 + true + + + `, + expectedParsingErr: nil, + expectedValidationErr: errLifecycleBucketLocked, + lr: lock.Retention{ + LockEnabled: true, + }, + }, + { // Using DelMarkerExpiration action with an object locked bucket + inputConfig: ` + + DeleteMarkerExpiration with object locking - another-prefix + prefix Enabled - 3 - - `, + + 3 + + + `, expectedParsingErr: nil, expectedValidationErr: errLifecycleBucketLocked, lr: lock.Retention{