Browse Source

constants and fixes

 Return InvalidRetentionPeriod for invalid retention values (0 days, negative years)
 Return ObjectLockConfigurationNotFoundError when object lock configuration doesn't exist
 Handle all object lock validation errors consistently with proper error codes
pull/6997/head
chrislu 5 months ago
parent
commit
7203c78e4d
  1. 2
      weed/s3api/s3api_bucket_config.go
  2. 4
      weed/s3api/s3api_bucket_handlers.go
  3. 2
      weed/s3api/s3api_bucket_handlers_object_lock_config.go
  4. 6
      weed/s3api/s3api_object_handlers_put.go
  5. 2
      weed/s3api/s3api_object_handlers_retention.go
  6. 6
      weed/s3api/s3err/s3api_errors.go

2
weed/s3api/s3api_bucket_config.go

@ -225,7 +225,7 @@ func (s3a *S3ApiServer) getBucketVersioningStatus(bucket string) (string, s3err.
} }
if config.Versioning == "" { if config.Versioning == "" {
return "Suspended", s3err.ErrNone
return s3_constants.VersioningSuspended, s3err.ErrNone
} }
return config.Versioning, s3err.ErrNone return config.Versioning, s3err.ErrNone

4
weed/s3api/s3api_bucket_handlers.go

@ -753,13 +753,13 @@ func (s3a *S3ApiServer) PutBucketVersioningHandler(w http.ResponseWriter, r *htt
} }
status := *versioningConfig.Status status := *versioningConfig.Status
if status != "Enabled" && status != "Suspended" {
if status != s3_constants.VersioningEnabled && status != s3_constants.VersioningSuspended {
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest) s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest)
return return
} }
// Check if trying to suspend versioning on a bucket with object lock enabled // Check if trying to suspend versioning on a bucket with object lock enabled
if status == "Suspended" {
if status == s3_constants.VersioningSuspended {
// Get bucket configuration to check for object lock // Get bucket configuration to check for object lock
bucketConfig, errCode := s3a.getBucketConfig(bucket) bucketConfig, errCode := s3a.getBucketConfig(bucket)
if errCode == s3err.ErrNone && bucketConfig.ObjectLockConfig != nil { if errCode == s3err.ErrNone && bucketConfig.ObjectLockConfig != nil {

2
weed/s3api/s3api_bucket_handlers_object_lock_config.go

@ -113,7 +113,7 @@ func (s3a *S3ApiServer) GetObjectLockConfigurationHandler(w http.ResponseWriter,
// If no Object Lock configuration found, return error // If no Object Lock configuration found, return error
if len(configXML) == 0 { if len(configXML) == 0 {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchObjectLockConfiguration)
s3err.WriteErrorResponse(w, r, s3err.ErrObjectLockConfigurationNotFoundError)
return return
} }

6
weed/s3api/s3api_object_handlers_put.go

@ -566,9 +566,9 @@ func mapValidationErrorToS3Error(err error) s3err.ErrorCode {
case errors.Is(err, ErrInvalidRetentionDateFormat): case errors.Is(err, ErrInvalidRetentionDateFormat):
return s3err.ErrMalformedXML return s3err.ErrMalformedXML
case errors.Is(err, ErrInvalidRetentionPeriod): case errors.Is(err, ErrInvalidRetentionPeriod):
// For invalid retention periods (days/years), return MalformedXML
// This includes cases where both Days and Years are specified
return s3err.ErrMalformedXML
// For invalid retention periods (0 days, negative years, etc.), return InvalidRetentionPeriod
// This includes cases where retention values are out of valid ranges
return s3err.ErrInvalidRetentionPeriod
case errors.Is(err, ErrInvalidRetentionMode): case errors.Is(err, ErrInvalidRetentionMode):
// For invalid retention modes, return MalformedXML // For invalid retention modes, return MalformedXML
// This includes cases where ObjectLockEnabled is 'Disabled' // This includes cases where ObjectLockEnabled is 'Disabled'

2
weed/s3api/s3api_object_handlers_retention.go

@ -102,7 +102,7 @@ func (s3a *S3ApiServer) GetObjectRetentionHandler(w http.ResponseWriter, r *http
} }
if errors.Is(err, ErrNoRetentionConfiguration) { if errors.Is(err, ErrNoRetentionConfiguration) {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchObjectLockConfiguration)
s3err.WriteErrorResponse(w, r, s3err.ErrObjectLockConfigurationNotFoundError)
return return
} }

6
weed/s3api/s3err/s3api_errors.go

@ -114,6 +114,7 @@ const (
ErrNoSuchObjectLockConfiguration ErrNoSuchObjectLockConfiguration
ErrNoSuchObjectLegalHold ErrNoSuchObjectLegalHold
ErrInvalidRetentionPeriod ErrInvalidRetentionPeriod
ErrObjectLockConfigurationNotFoundError
) )
// Error message constants for checksum validation // Error message constants for checksum validation
@ -459,6 +460,11 @@ var errorCodeResponse = map[ErrorCode]APIError{
Description: "The bucket ownership controls were not found", Description: "The bucket ownership controls were not found",
HTTPStatusCode: http.StatusNotFound, HTTPStatusCode: http.StatusNotFound,
}, },
ErrObjectLockConfigurationNotFoundError: {
Code: "ObjectLockConfigurationNotFoundError",
Description: "Object Lock configuration does not exist for this bucket",
HTTPStatusCode: http.StatusNotFound,
},
} }
// GetAPIError provides API Error for input API error code. // GetAPIError provides API Error for input API error code.

Loading…
Cancel
Save