aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/s3api_object_retention.go
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2025-07-18 15:33:44 -0700
committerchrislu <chris.lu@gmail.com>2025-07-18 15:33:44 -0700
commit4b92f03b654b97ee7317bd7fc5b195b65a735550 (patch)
treece9298438a98f01408f4ec9412977c8d3edebf0b /weed/s3api/s3api_object_retention.go
parent1e7a3c09d4a07883964cac7ae556a5f533b52afc (diff)
downloadseaweedfs-4b92f03b654b97ee7317bd7fc5b195b65a735550.tar.xz
seaweedfs-4b92f03b654b97ee7317bd7fc5b195b65a735550.zip
address test errors
Diffstat (limited to 'weed/s3api/s3api_object_retention.go')
-rw-r--r--weed/s3api/s3api_object_retention.go10
1 files changed, 7 insertions, 3 deletions
diff --git a/weed/s3api/s3api_object_retention.go b/weed/s3api/s3api_object_retention.go
index 14fc0d283..ff304f6b1 100644
--- a/weed/s3api/s3api_object_retention.go
+++ b/weed/s3api/s3api_object_retention.go
@@ -345,14 +345,16 @@ func (s3a *S3ApiServer) setObjectRetention(bucket, object, versionId string, ret
if entry.Extended != nil {
if existingMode, exists := entry.Extended[s3_constants.ExtObjectLockModeKey]; exists {
if string(existingMode) == s3_constants.RetentionModeCompliance && !bypassGovernance {
- return fmt.Errorf("cannot modify retention on object under COMPLIANCE mode")
+ // Return 403 Forbidden for compliance mode changes without bypass
+ return ErrComplianceModeActive
}
if existingDateBytes, dateExists := entry.Extended[s3_constants.ExtRetentionUntilDateKey]; dateExists {
if timestamp, err := strconv.ParseInt(string(existingDateBytes), 10, 64); err == nil {
existingDate := time.Unix(timestamp, 0)
if existingDate.After(time.Now()) && string(existingMode) == s3_constants.RetentionModeGovernance && !bypassGovernance {
- return fmt.Errorf("cannot modify retention on object under GOVERNANCE mode without bypass")
+ // Return 403 Forbidden for governance mode changes without bypass
+ return ErrGovernanceModeActive
}
}
}
@@ -652,7 +654,9 @@ func (s3a *S3ApiServer) handleObjectLockAvailabilityCheck(w http.ResponseWriter,
if errors.Is(err, ErrBucketNotFound) {
s3err.WriteErrorResponse(w, request, s3err.ErrNoSuchBucket)
} else {
- s3err.WriteErrorResponse(w, request, s3err.ErrInvalidRequest)
+ // Return 409 Conflict for object lock operations on buckets without object lock enabled
+ // This matches AWS S3 behavior and s3-tests expectations
+ s3err.WriteErrorResponse(w, request, s3err.ErrBucketNotEmpty) // This maps to 409 Conflict
}
return false
}