Browse Source

address test errors

pull/6997/head
chrislu 5 months ago
parent
commit
4b92f03b65
  1. 5
      weed/s3api/s3api_object_handlers_legal_hold.go
  2. 7
      weed/s3api/s3api_object_handlers_put.go
  3. 6
      weed/s3api/s3api_object_handlers_retention.go
  4. 10
      weed/s3api/s3api_object_retention.go

5
weed/s3api/s3api_object_handlers_legal_hold.go

@ -54,6 +54,11 @@ func (s3a *S3ApiServer) PutObjectLegalHoldHandler(w http.ResponseWriter, r *http
return
}
// Add VersionId to response headers if available (expected by s3-tests)
if versionId != "" {
w.Header().Set("x-amz-version-id", versionId)
}
// Record metrics
stats_collect.RecordBucketActiveTime(bucket)

7
weed/s3api/s3api_object_handlers_put.go

@ -555,11 +555,14 @@ func (s3a *S3ApiServer) validateObjectLockHeaders(r *http.Request, versioningEna
func mapValidationErrorToS3Error(err error) s3err.ErrorCode {
switch {
case errors.Is(err, ErrObjectLockVersioningRequired):
return s3err.ErrInvalidRequest
// For object lock operations on non-versioned buckets, return 409 Conflict
// This matches AWS S3 behavior and s3-tests expectations
return s3err.ErrBucketNotEmpty // This maps to 409 Conflict
case errors.Is(err, ErrInvalidObjectLockMode):
return s3err.ErrInvalidRequest
case errors.Is(err, ErrInvalidLegalHoldStatus):
return s3err.ErrInvalidRequest
// For malformed legal hold status, return MalformedXML as expected by s3-tests
return s3err.ErrMalformedXML
case errors.Is(err, ErrInvalidRetentionDateFormat):
return s3err.ErrMalformedDate
case errors.Is(err, ErrRetentionDateMustBeFuture),

6
weed/s3api/s3api_object_handlers_retention.go

@ -54,6 +54,7 @@ func (s3a *S3ApiServer) PutObjectRetentionHandler(w http.ResponseWriter, r *http
}
if errors.Is(err, ErrComplianceModeActive) || errors.Is(err, ErrGovernanceModeActive) {
// Return 403 Forbidden for retention mode changes without proper permissions
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied)
return
}
@ -62,6 +63,11 @@ func (s3a *S3ApiServer) PutObjectRetentionHandler(w http.ResponseWriter, r *http
return
}
// Add VersionId to response headers if available (expected by s3-tests)
if versionId != "" {
w.Header().Set("x-amz-version-id", versionId)
}
// Record metrics
stats_collect.RecordBucketActiveTime(bucket)

10
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
}

Loading…
Cancel
Save